_WCRTLINK int _bfreeseg( __segment seg ) { __segment heap_seg; __segment prev_seg; struct heapblk _WCFAR *heap; struct heapblk _WCFAR *next_heap; struct heapblk _WCFAR *prev_heap; _AccessFHeap(); heap = MK_FP( seg, 0 ); heap_seg = seg; seg = heap->nextseg; /* unlink from heap list */ prev_seg = heap->prevseg; if( seg != 0 ) { next_heap = MK_FP( seg, 0 ); next_heap->prevseg = prev_seg; } if( prev_seg == 0 ) { __bheap = seg; } else { prev_heap = MK_FP( prev_seg, 0 ); prev_heap->nextseg = seg; } _ReleaseFHeap(); return( __FreeSeg( heap_seg ) ); }
_WCRTLINK void hfree( void _WCHUGE *ptr ) { #if defined(__WINDOWS__) __FreeSeg( FP_SEG( ptr ) ); #else _dosfree( ptr ); #endif }
_WCRTLINK unsigned _dos_freemem( mem_id mem ) { #if defined(__386__) || defined(__PPC__) APIRET rc; rc = DosFreeMem( mem ); if( rc ) { return( __set_errno_dos_reterr( rc ) ); } return( 0 ); #elif defined( _M_I86 ) // defined inside heap return( __FreeSeg( mem ) ); #else #error platform not supported #endif }
_WCRTLINK int _bfreeseg( __segment seg ) { __segment next_seg; __segment prev_seg; _AccessFHeap(); /* unlink from heap list */ prev_seg = HEAP( seg )->prevseg; next_seg = HEAP( seg )->nextseg; if( next_seg != _NULLSEG ) { HEAP( next_seg )->prevseg = prev_seg; } if( prev_seg == _NULLSEG ) { __bheapbeg = next_seg; } else { HEAP( prev_seg )->nextseg = next_seg; } _ReleaseFHeap(); return( __FreeSeg( seg ) ); }
_WCRTLINK void hfree( void _WCHUGE *ptr ) { __FreeSeg( FP_SEG( ptr ) ); }