home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / C / DLIBSSRC.ZIP / FREE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-02  |  1.7 KB  |  75 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3.  
  4. #define    MAXBLK        16
  5. #define    FREE        0x00
  6. #define    USED        0x80
  7. #define    NULLBLK        0x80000000L
  8.  
  9. extern    char    *_mblk[];        /* memory heap pointers */
  10. extern    long    _msiz[];        /* memory heap sizes */
  11.  
  12. static mergeblk(i)
  13. int i;
  14. /*
  15.  *    Merge adjacent "free" blocks in heap <i>.  Links in the free chain
  16.  *    are guarenteed to be in forward order.
  17.  */
  18. {
  19.     register long n, *p, *q;
  20.  
  21.     p = _mblk[i];
  22.     if((p = *p) == NULL)            /* empty chain */
  23.         return;
  24.     while(q = p[1]) {
  25.         n = *p;
  26.         if(((char *) p)+n == q)    {    /* free blocks are adjacent */
  27.             p[1] = q[1];        /* re-link free chain */
  28.             *p += *q;        /* adjust block size */
  29.         }
  30.         else
  31.             p = q;
  32.     }
  33.     /* check to see if the entire heap can be returned to the OS */
  34.     q = ((char *) p) + (*p);
  35.     if((_mblk[i] == (p - 1)) && ((*q) == NULLBLK)) {
  36.         Mfree(_mblk[i]);
  37.         _mblk[i] = NULL;
  38.         _msiz[i] = 0L;
  39.     }
  40. }
  41.  
  42. /*--------------------- Documented Functions ---------------------------*/
  43.  
  44. free(addr)
  45. register long *addr;
  46. /*
  47.  *    Release the memory block at <addr> back into the free memory pool.
  48.  *    If <addr> doesn't point to a block allocated by calloc(), malloc(),
  49.  *    lalloc() or realloc(), very bad, unpredictable things will happen.
  50.  */
  51. {
  52.     register int i;
  53.     register long *p, *q;
  54.  
  55.     --addr;                    /* point to block header */
  56.     for(i=0; i<MAXBLK; ++i) {
  57.         if((p = _mblk[i]) == NULL)
  58.             continue;        /* skip unavailable blocks */
  59.         if((addr < p) || (addr > ((char *) p)+_msiz[i]))
  60.             continue;        /* block range check */
  61.         while(q = *p) {
  62.             ++q;
  63.             if((addr < q) && (addr > p))
  64.                 break;
  65.             p = q;
  66.         }
  67.         *((char *) addr) = FREE;    /* link into free chain */
  68.         addr[1] = *p;
  69.         *p = addr;
  70.         mergeblk(i);
  71.         return(TRUE);
  72.     }
  73.     return(FALSE);
  74. }
  75.