Diff for /embedaddon/pcre/sljit/sljitExecAllocator.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/02/21 23:50:25 version 1.1.1.3, 2013/07/22 08:25:57
Line 52 Line 52
    The unused blocks are stored in a chain list pointed by free_blocks. This     The unused blocks are stored in a chain list pointed by free_blocks. This
    list is useful if we need to find a suitable memory area when the allocator     list is useful if we need to find a suitable memory area when the allocator
    is called.     is called.
 
    When a block is freed, the new free block is connected to its adjacent free     When a block is freed, the new free block is connected to its adjacent free
    blocks if possible.     blocks if possible.
   
Line 83 Line 83
   
 static SLJIT_INLINE void* alloc_chunk(sljit_uw size)  static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
 {  {
        return VirtualAlloc(0, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);        return VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 }  }
   
 static SLJIT_INLINE void free_chunk(void* chunk, sljit_uw size)  static SLJIT_INLINE void free_chunk(void* chunk, sljit_uw size)
Line 94  static SLJIT_INLINE void free_chunk(void* chunk, sljit Line 94  static SLJIT_INLINE void free_chunk(void* chunk, sljit
   
 #else  #else
   
 #include <sys/mman.h>  
   
 static SLJIT_INLINE void* alloc_chunk(sljit_uw size)  static SLJIT_INLINE void* alloc_chunk(sljit_uw size)
 {  {
        void* retval = mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);        void* retval;
 
 #ifdef MAP_ANON
         retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
 #else
         if (dev_zero < 0) {
                 if (open_dev_zero())
                         return NULL;
         }
         retval = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero, 0);
 #endif
 
         return (retval != MAP_FAILED) ? retval : NULL;          return (retval != MAP_FAILED) ? retval : NULL;
 }  }
   
Line 202  SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit Line 211  SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit
   
         chunk_size = (size + sizeof(struct block_header) + CHUNK_SIZE - 1) & CHUNK_MASK;          chunk_size = (size + sizeof(struct block_header) + CHUNK_SIZE - 1) & CHUNK_MASK;
         header = (struct block_header*)alloc_chunk(chunk_size);          header = (struct block_header*)alloc_chunk(chunk_size);
        PTR_FAIL_IF(!header);        if (!header) {
                 allocator_release_lock();
                 return NULL;
         }
   
         chunk_size -= sizeof(struct block_header);          chunk_size -= sizeof(struct block_header);
         total_size += chunk_size;          total_size += chunk_size;
Line 237  SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* pt Line 249  SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* pt
         struct free_block* free_block;          struct free_block* free_block;
   
         allocator_grab_lock();          allocator_grab_lock();
        header = AS_BLOCK_HEADER(ptr, -(sljit_w)sizeof(struct block_header));        header = AS_BLOCK_HEADER(ptr, -(sljit_sw)sizeof(struct block_header));
         allocated_size -= header->size;          allocated_size -= header->size;
   
         /* Connecting free blocks together if possible. */          /* Connecting free blocks together if possible. */
   
         /* If header->prev_size == 0, free_block will equal to header.          /* If header->prev_size == 0, free_block will equal to header.
            In this case, free_block->header.size will be > 0. */             In this case, free_block->header.size will be > 0. */
        free_block = AS_FREE_BLOCK(header, -(sljit_w)header->prev_size);        free_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size);
         if (SLJIT_UNLIKELY(!free_block->header.size)) {          if (SLJIT_UNLIKELY(!free_block->header.size)) {
                 free_block->size += header->size;                  free_block->size += header->size;
                 header = AS_BLOCK_HEADER(free_block, free_block->size);                  header = AS_BLOCK_HEADER(free_block, free_block->size);

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>