? memdebug.txt Index: common/current/include/common.hxx =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/common.hxx,v retrieving revision 1.3 diff -u -w -r1.3 common.hxx --- common/current/include/common.hxx 23 May 2002 23:08:43 -0000 1.3 +++ common/current/include/common.hxx 17 Jun 2004 14:25:44 -0000 @@ -131,5 +131,14 @@ typedef cyg_uint16 cyg_mempool_status_flag_t; +#if CYGSEM_MEMALLOC_INVOKE_OUTOFMEMORY +// breakpoint site for out of memory conditions +__externC void cyg_memalloc_alloc_fail(); +#else +// this will compile away to nothing with optimisations turned on. +inline void cyg_memalloc_alloc_fail() { +} +#endif + #endif /* ifndef CYGONCE_MEMALLOC_COMMON_HXX */ /* EOF common.hxx */ Index: common/current/include/memjoin.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/memjoin.inl,v retrieving revision 1.6 diff -u -w -r1.6 memjoin.inl --- common/current/include/memjoin.inl 5 Feb 2003 01:10:12 -0000 1.6 +++ common/current/include/memjoin.inl 17 Jun 2004 14:25:45 -0000 @@ -178,6 +178,10 @@ } CYG_REPORT_RETVAL( ptr ); + + if (ptr==NULL) { + cyg_memalloc_alloc_fail(); + } return ptr; } // Cyg_Mempool_Joined::try_alloc() @@ -214,6 +218,7 @@ ret = pool->resize_alloc( alloc_ptr, newsize, oldsize ); CYG_REPORT_RETVAL( ret ); + return ret; } // Cyg_Mempool_Joined::resize_alloc() Index: common/current/include/mempolt2.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/mempolt2.inl,v retrieving revision 1.3 diff -u -w -r1.3 mempolt2.inl --- common/current/include/mempolt2.inl 23 May 2002 23:08:43 -0000 1.3 +++ common/current/include/mempolt2.inl 17 Jun 2004 14:25:45 -0000 @@ -116,6 +116,8 @@ Mempolt2WaitInfo waitinfo( size ); + cyg_memalloc_alloc_fail(); + self->set_wait_info( (CYG_ADDRWORD)&waitinfo ); self->set_sleep_reason( Cyg_Thread::WAIT ); self->sleep(); @@ -187,6 +189,9 @@ // straight to unlock. if( Cyg_Thread::NONE == self->get_wake_reason() ) { + + cyg_memalloc_alloc_fail(); + self->set_wait_info( (CYG_ADDRWORD)&waitinfo ); self->sleep(); queue.enqueue( self ); @@ -251,6 +256,11 @@ // Unlock the scheduler and maybe switch threads Cyg_Scheduler::unlock(); + + if (ret==NULL) { + cyg_memalloc_alloc_fail(); + } + return ret; } @@ -283,6 +293,11 @@ // Unlock the scheduler and maybe switch threads Cyg_Scheduler::unlock(); + + if (ret==NULL) { + cyg_memalloc_alloc_fail(); + } + return ret; } Index: common/current/include/mempoolt.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/mempoolt.inl,v retrieving revision 1.3 diff -u -w -r1.3 mempoolt.inl --- common/current/include/mempoolt.inl 23 May 2002 23:08:43 -0000 1.3 +++ common/current/include/mempoolt.inl 17 Jun 2004 14:25:45 -0000 @@ -111,6 +111,9 @@ cyg_uint8 *ret; cyg_bool result = true; while( result && (NULL == (ret = pool.alloc( size ))) ) { + + cyg_memalloc_alloc_fail(); + self->set_sleep_reason( Cyg_Thread::WAIT ); self->sleep(); queue.enqueue( self ); @@ -182,6 +185,8 @@ result = false; while( result && (NULL == (ret = pool.alloc( size ))) ) { + cyg_memalloc_alloc_fail(); + self->set_sleep_reason( Cyg_Thread::TIMEOUT ); self->sleep(); queue.enqueue( self ); @@ -248,6 +253,10 @@ // Unlock the scheduler and maybe switch threads Cyg_Scheduler::unlock(); CYG_REPORT_RETVAL( ret ); + + if (ret==NULL) { + cyg_memalloc_alloc_fail(); + } return ret; } Index: common/current/include/mfiximpl.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/mfiximpl.inl,v retrieving revision 1.3 diff -u -w -r1.3 mfiximpl.inl --- common/current/include/mfiximpl.inl 23 May 2002 23:08:44 -0000 1.3 +++ common/current/include/mfiximpl.inl 17 Jun 2004 14:25:46 -0000 @@ -122,8 +122,10 @@ { // size parameter is not used CYG_UNUSED_PARAM( cyg_int32, size ); - if ( 0 >= freeblocks ) + if ( 0 >= freeblocks ) { + cyg_memalloc_alloc_fail(); return NULL; + } cyg_int32 i = firstfree; cyg_uint8 *p = NULL; do { @@ -172,8 +174,10 @@ if (newsize == blocksize) return alloc_ptr; - else + else { + cyg_memalloc_alloc_fail(); return NULL; + } } // resize_alloc() Index: common/current/include/mvarimpl.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/mvarimpl.inl,v retrieving revision 1.5 diff -u -w -r1.5 mvarimpl.inl --- common/current/include/mvarimpl.inl 23 May 2002 23:08:44 -0000 1.5 +++ common/current/include/mvarimpl.inl 17 Jun 2004 14:25:46 -0000 @@ -275,6 +275,9 @@ cyg_uint8 *ptr = memdq2alloc( dq ); CYG_ASSERT( ((CYG_ADDRESS)ptr & (alignment-1)) == 0, "returned memory not aligned" ); + if (ptr==NULL) { + cyg_memalloc_alloc_fail(); + } return ptr; } @@ -358,6 +361,9 @@ ret = alloc_ptr; } + if (ret==NULL) { + cyg_memalloc_alloc_fail(); + } return ret; } // resize_alloc() Index: common/current/include/sepmetaimpl.inl =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/include/sepmetaimpl.inl,v retrieving revision 1.4 diff -u -w -r1.4 sepmetaimpl.inl --- common/current/include/sepmetaimpl.inl 23 May 2002 23:08:44 -0000 1.4 +++ common/current/include/sepmetaimpl.inl 17 Jun 2004 14:25:47 -0000 @@ -374,8 +374,10 @@ size = (size + alignment - 1) & -alignment; struct memdq *dq = find_free_dq( size ); - if (NULL == dq) + if (NULL == dq) { + cyg_memalloc_alloc_fail(); return NULL; + } cyg_int32 dqsize = dq->memnext->mem - dq->mem; @@ -399,8 +401,11 @@ // first get a memdq - if ( NULL == freemetahead ) // out of metadata. + if ( NULL == freemetahead ) { + // out of metadata. + cyg_memalloc_alloc_fail(); return NULL; + } // FIXME: since we don't search all the way for an exact fit // first we may be able to find an exact fit later and therefore @@ -496,7 +501,10 @@ prevmemsize = dq->mem - dq->memprev->mem; } if (nextmemsize + prevmemsize + currsize < newsize) + { + cyg_memalloc_alloc_fail(); return NULL; // can't fit it + } // expand forwards if ( nextmemsize != 0 ) { @@ -560,8 +568,10 @@ } else { // if its already allocated we need to create a new free list // entry - if (NULL == freemetahead) + if (NULL == freemetahead) { + cyg_memalloc_alloc_fail(); return NULL; // can't do it + } struct memdq *fdq = freemetahead; freemetahead = fdq->next; Index: common/current/src/dlmalloc.cxx =================================================================== RCS file: /cvs/ecos/ecos/packages/services/memalloc/common/current/src/dlmalloc.cxx,v retrieving revision 1.8 diff -u -w -r1.8 dlmalloc.cxx --- common/current/src/dlmalloc.cxx 6 Oct 2003 18:25:57 -0000 1.8 +++ common/current/src/dlmalloc.cxx 17 Jun 2004 14:25:48 -0000 @@ -217,6 +217,8 @@ #include //#include + + /* Debugging: @@ -1273,6 +1275,7 @@ //diag_printf("chunksize(top)=%ld, nb=%d, remainder=%ld\n", chunksize(top), // nb, remainder_size); MALLOC_UNLOCK; + cyg_memalloc_alloc_fail(); return NULL; /* propagate failure */ } @@ -1558,6 +1561,7 @@ // couldn't resize the allocation any direction, so return failure MALLOC_UNLOCK; + cyg_memalloc_alloc_fail(); return NULL; }