在开辟好的共享内存内进行alloc/free的函数集(8)

来源:chinaunix 作者:hightman
  }

void mm_free_nolock(MM *mm, void *x) {
  if (x != NULL) {
    if (x >= mm->start && x < (void *)((char *)mm + mm->size)) {
      mm_mem_head *p = PTR_TO_HEAD(x);
      size_t size = p->size;
      if ((char *)p+size <= (char *)mm + mm->size) {
        mm_free_bucket *b = (mm_free_bucket *)p;
        b->next = NULL;
        if (mm->free_list == NULL) {
          mm->free_list = b;
        } else {
          mm_free_bucket *q = mm->free_list;
          mm_free_bucket *prev = NULL;
          mm_free_bucket *next = NULL;
          while (q != NULL) {
            if (b < q) {
              next = q;
              break;
            }
            prev = q;
            q = q->next;
          }
          if (prev != NULL && (char *)prev+prev->size == (char *)b) {
            if ((char *)next == (char *)b+size) {
              /* merging with prev and next */
              prev->size += size + next->size;
              prev->next = next->next;
            } else {
              /* merging with prev */
              prev->size += size;
            }
          } else {
            if ((char *)next == (char *)b+size) {
              /* merging with next */
              b->size += next->size;
              b->next = next->next;
            } else {
              /* don't merge */
              b->next = next;
            }
            if (prev != NULL) {
              prev->next = b;
            } else {
              mm->free_list = b;
            }
          }
        }
        mm->available += size;
      }
    }
  }

时间:2009-06-13 20:29 来源:chinaunix 作者:hightman 原文链接

好文,顶一下
(1)
50%
文章真差,踩一下
(1)
50%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量