chiark / gitweb /
Merge from existing archive branch
[pcre3.git] / sljit / sljitUtils.c
index b29b4036b307b94de945e78921285bc07afe36b3..ec5c321194a6f1b25bba2482d3ef894ab5c723dd 100644 (file)
@@ -163,11 +163,11 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release_lock(void)
 #include <fcntl.h>
 
 /* Some old systems does not have MAP_ANON. */
-static sljit_si dev_zero = -1;
+static sljit_s32 dev_zero = -1;
 
 #if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
 
-static SLJIT_INLINE sljit_si open_dev_zero(void)
+static SLJIT_INLINE sljit_s32 open_dev_zero(void)
 {
        dev_zero = open("/dev/zero", O_RDWR);
        return dev_zero < 0;
@@ -179,10 +179,13 @@ static SLJIT_INLINE sljit_si open_dev_zero(void)
 
 static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-static SLJIT_INLINE sljit_si open_dev_zero(void)
+static SLJIT_INLINE sljit_s32 open_dev_zero(void)
 {
        pthread_mutex_lock(&dev_zero_mutex);
-       dev_zero = open("/dev/zero", O_RDWR);
+       /* The dev_zero might be initialized by another thread during the waiting. */
+       if (dev_zero < 0) {
+               dev_zero = open("/dev/zero", O_RDWR);
+       }
        pthread_mutex_unlock(&dev_zero_mutex);
        return dev_zero < 0;
 }
@@ -200,7 +203,7 @@ static SLJIT_INLINE sljit_si open_dev_zero(void)
 /* Planning to make it even more clever in the future. */
 static sljit_sw sljit_page_align = 0;
 
-SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit)
+SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit, void *allocator_data)
 {
        struct sljit_stack *stack;
        union {
@@ -211,6 +214,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
        SYSTEM_INFO si;
 #endif
 
+       SLJIT_UNUSED_ARG(allocator_data);
        if (limit > max_limit || limit < 1)
                return NULL;
 
@@ -232,21 +236,21 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
        /* Align limit and max_limit. */
        max_limit = (max_limit + sljit_page_align) & ~sljit_page_align;
 
-       stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack));
+       stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
        if (!stack)
                return NULL;
 
 #ifdef _WIN32
        base.ptr = VirtualAlloc(NULL, max_limit, MEM_RESERVE, PAGE_READWRITE);
        if (!base.ptr) {
-               SLJIT_FREE(stack);
+               SLJIT_FREE(stack, allocator_data);
                return NULL;
        }
        stack->base = base.uw;
        stack->limit = stack->base;
        stack->max_limit = stack->base + max_limit;
        if (sljit_stack_resize(stack, stack->base + limit)) {
-               sljit_free_stack(stack);
+               sljit_free_stack(stack, allocator_data);
                return NULL;
        }
 #else
@@ -255,14 +259,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
 #else
        if (dev_zero < 0) {
                if (open_dev_zero()) {
-                       SLJIT_FREE(stack);
+                       SLJIT_FREE(stack, allocator_data);
                        return NULL;
                }
        }
        base.ptr = mmap(NULL, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);
 #endif
        if (base.ptr == MAP_FAILED) {
-               SLJIT_FREE(stack);
+               SLJIT_FREE(stack, allocator_data);
                return NULL;
        }
        stack->base = base.uw;
@@ -275,14 +279,15 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
 
 #undef PAGE_ALIGN
 
-SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack)
+SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack, void *allocator_data)
 {
+       SLJIT_UNUSED_ARG(allocator_data);
 #ifdef _WIN32
        VirtualFree((void*)stack->base, 0, MEM_RELEASE);
 #else
        munmap((void*)stack->base, stack->max_limit - stack->base);
 #endif
-       SLJIT_FREE(stack);
+       SLJIT_FREE(stack, allocator_data);
 }
 
 SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit)