Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.37 KB | None | 0 0
  1. #include "alloc.h"
  2. #include <unistd.h>
  3.  
  4. typedef struct alloc {
  5.     int used, size;
  6.     struct alloc *prev, *next;
  7. } alloc_t;
  8.  
  9. alloc_t start = { 1, 0, NULL, NULL };
  10.  
  11. #define SZMIN 0x40
  12.  
  13. #define USABLE(al, sz) \
  14.     (!((alloc_t *)(al))->used && ((alloc_t *)(al))->size >= (sz))
  15.  
  16. void *alloc(int size)
  17. {
  18.     size += -size % sizeof(long);
  19.  
  20.     alloc_t *palloc = &start;
  21.  
  22.     while (palloc->next && !USABLE(palloc, size)) {
  23.         palloc = palloc->next;
  24.     }
  25.     if (USABLE(palloc, size) &&
  26.         palloc->size - size - sizeof(alloc_t) >= SZMIN) {
  27.         alloc_t *next = (char *)(palloc+1) + size;
  28.         next->used = 0;
  29.         next->size = palloc->size - size - sizeof(alloc_t);
  30.         next->prev = palloc;
  31.         next->next = palloc->next;
  32.         palloc->next = next;
  33.     } else {
  34.         palloc->next = sbrk(sizeof(alloc_t) + size);
  35.         palloc->next->prev = palloc;
  36.         palloc = palloc->next;
  37.         palloc->next = NULL;
  38.     }
  39.     palloc->used = 1;
  40.     palloc->size = size;
  41.  
  42.     return palloc + 1;
  43. }
  44.  
  45. void dealloc(void *_palloc)
  46. {
  47.     alloc_t *palloc = (alloc_t *)_palloc - 1;
  48.  
  49.     if (palloc->next) {
  50.         palloc->used = 0;
  51.         if (!palloc->next->used) {
  52.             palloc->size += sizeof(alloc_t) + palloc->next->size;
  53.             palloc->next = palloc->next->next;
  54.         }
  55.         if (!palloc->prev->used) {
  56.             palloc->prev->size += sizeof(alloc_t) + palloc->size;
  57.             palloc->prev->next = palloc->next;
  58.         }
  59.     } else {
  60.         palloc->prev->next = NULL;
  61.         brk(palloc);
  62.     }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement