Guest User

Untitled

a guest
Sep 20th, 2015
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.84 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4.  
  5. #define NSAVED 67108864
  6.  
  7. #ifdef __x86_64__
  8. #define STATE_INUSE 0x7b2067045ef8d8fc
  9. #define STATE_SAVED 0x43585dd9567256fd
  10. #define STATE_FREED 0x8e433e847e0aeec9
  11. #define STATE_REALLOCED 0x37a916dbd277e9b
  12. #endif
  13.  
  14. extern void *__libc_malloc(size_t);
  15. extern void *__libc_free(void *);
  16. extern void *__libc_realloc(void *, size_t);
  17.  
  18. struct header {
  19.     size_t usz;
  20.     uint64_t state;
  21. };
  22.  
  23. static struct header *saved[NSAVED];
  24. static size_t savehead, savetail;
  25.  
  26. void *malloc(size_t sz)
  27. {
  28.     struct header *hdr;
  29.    
  30.     hdr = __libc_malloc(sizeof(struct header) + sz);
  31.     hdr->usz = sz;
  32.     hdr->state = STATE_INUSE;
  33.     return((void *)(hdr + 1));
  34. }
  35.  
  36. void free(void *chunk)
  37. {
  38.     struct header *hdr;
  39.    
  40.     if(chunk == NULL)
  41.     return;
  42.     hdr = ((struct header *)chunk) - 1;
  43.     if(hdr->state != STATE_INUSE)
  44.     abort();
  45.     if(hdr->usz < 128) {
  46.     saved[savehead] = hdr;
  47.     hdr->state = STATE_SAVED;
  48.     savehead = (savehead + 1) % NSAVED;
  49.     if(savehead == savetail) {
  50.         if(saved[savetail]->state != STATE_SAVED)
  51.         abort();
  52.         saved[savetail]->state = STATE_FREED;
  53.         __libc_free(saved[savetail]);
  54.         savetail = (savetail + 1) % NSAVED;
  55.     }
  56.     } else {
  57.     hdr->state = STATE_FREED;
  58.     __libc_free(hdr);
  59.     }
  60. }
  61.  
  62. void *calloc(size_t n, size_t es)
  63. {
  64.     size_t sz;
  65.     void *ret;
  66.    
  67.     sz = n * es;
  68.     ret = malloc(sz);
  69.     memset(ret, 0, sz);
  70.     return(ret);
  71. }
  72.  
  73. void *realloc(void *chunk, size_t nsz)
  74. {
  75.     struct header *hdr;
  76.    
  77.     if(chunk == NULL)
  78.     return(malloc(nsz));
  79.     hdr = ((struct header *)chunk) - 1;
  80.     if(hdr->state != STATE_INUSE)
  81.     abort();
  82.     hdr->state = STATE_REALLOCED;
  83.     hdr = __libc_realloc(hdr, sizeof(struct header) + nsz);
  84.     hdr->usz = nsz;
  85.     hdr->state = STATE_INUSE;
  86.     return((void *)(hdr + 1));
  87. }
Advertisement
Add Comment
Please, Sign In to add comment