|
version 1.1.1.3, 2012/10/09 09:19:18
|
version 1.1.1.4, 2013/07/22 08:25:57
|
|
Line 106 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release
|
Line 106 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release
|
| |
|
| #else /* _WIN32 */ |
#else /* _WIN32 */ |
| |
|
| #include "pthread.h" |
|
| |
|
| #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) |
#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) |
| |
|
| |
#include <pthread.h> |
| |
|
| static pthread_mutex_t allocator_mutex = PTHREAD_MUTEX_INITIALIZER; |
static pthread_mutex_t allocator_mutex = PTHREAD_MUTEX_INITIALIZER; |
| |
|
| static SLJIT_INLINE void allocator_grab_lock(void) |
static SLJIT_INLINE void allocator_grab_lock(void) |
|
Line 126 static SLJIT_INLINE void allocator_release_lock(void)
|
Line 126 static SLJIT_INLINE void allocator_release_lock(void)
|
| |
|
| #if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) |
#if (defined SLJIT_UTIL_GLOBAL_LOCK && SLJIT_UTIL_GLOBAL_LOCK) |
| |
|
| |
#include <pthread.h> |
| |
|
| static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER; |
static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER; |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_grab_lock(void) |
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_grab_lock(void) |
|
Line 146 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release
|
Line 148 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release
|
| /* Stack */ |
/* Stack */ |
| /* ------------------------------------------------------------------------ */ |
/* ------------------------------------------------------------------------ */ |
| |
|
| #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) | #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) || (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) |
| |
|
| #ifdef _WIN32 |
#ifdef _WIN32 |
| #include "windows.h" |
#include "windows.h" |
| #else |
#else |
| |
/* Provides mmap function. */ |
| #include <sys/mman.h> |
#include <sys/mman.h> |
| |
/* For detecting the page size. */ |
| #include <unistd.h> |
#include <unistd.h> |
| |
|
| |
#ifndef MAP_ANON |
| |
|
| |
#include <fcntl.h> |
| |
|
| |
/* Some old systems does not have MAP_ANON. */ |
| |
static sljit_si dev_zero = -1; |
| |
|
| |
#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED) |
| |
|
| |
static SLJIT_INLINE sljit_si open_dev_zero(void) |
| |
{ |
| |
dev_zero = open("/dev/zero", O_RDWR); |
| |
return dev_zero < 0; |
| |
} |
| |
|
| |
#else /* SLJIT_SINGLE_THREADED */ |
| |
|
| |
#include <pthread.h> |
| |
|
| |
static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER; |
| |
|
| |
static SLJIT_INLINE sljit_si open_dev_zero(void) |
| |
{ |
| |
pthread_mutex_lock(&dev_zero_mutex); |
| |
dev_zero = open("/dev/zero", O_RDWR); |
| |
pthread_mutex_unlock(&dev_zero_mutex); |
| |
return dev_zero < 0; |
| |
} |
| |
|
| |
#endif /* SLJIT_SINGLE_THREADED */ |
| |
|
| #endif |
#endif |
| |
|
| |
#endif |
| |
|
| |
#endif /* SLJIT_UTIL_STACK || SLJIT_EXECUTABLE_ALLOCATOR */ |
| |
|
| |
#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) |
| |
|
| /* Planning to make it even more clever in the future. */ |
/* Planning to make it even more clever in the future. */ |
| static sljit_w sljit_page_align = 0; | 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) |
| { |
{ |
|
Line 195 SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CAL
|
Line 237 SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CAL
|
| return NULL; |
return NULL; |
| |
|
| #ifdef _WIN32 |
#ifdef _WIN32 |
| base.ptr = VirtualAlloc(0, max_limit, MEM_RESERVE, PAGE_READWRITE); | base.ptr = VirtualAlloc(NULL, max_limit, MEM_RESERVE, PAGE_READWRITE); |
| if (!base.ptr) { |
if (!base.ptr) { |
| SLJIT_FREE(stack); |
SLJIT_FREE(stack); |
| return NULL; |
return NULL; |
|
Line 208 SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CAL
|
Line 250 SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CAL
|
| return NULL; |
return NULL; |
| } |
} |
| #else |
#else |
| base.ptr = mmap(0, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); | #ifdef MAP_ANON |
| | base.ptr = mmap(NULL, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); |
| | #else |
| | if (dev_zero < 0) { |
| | if (open_dev_zero()) { |
| | SLJIT_FREE(stack); |
| | return NULL; |
| | } |
| | } |
| | base.ptr = mmap(NULL, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0); |
| | #endif |
| if (base.ptr == MAP_FAILED) { |
if (base.ptr == MAP_FAILED) { |
| SLJIT_FREE(stack); |
SLJIT_FREE(stack); |
| return NULL; |
return NULL; |
|
Line 233 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_st
|
Line 285 SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_st
|
| SLJIT_FREE(stack); |
SLJIT_FREE(stack); |
| } |
} |
| |
|
| SLJIT_API_FUNC_ATTRIBUTE sljit_w SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit) | SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit) |
| { |
{ |
| sljit_uw aligned_old_limit; |
sljit_uw aligned_old_limit; |
| sljit_uw aligned_new_limit; |
sljit_uw aligned_new_limit; |
|
Line 262 SLJIT_API_FUNC_ATTRIBUTE sljit_w SLJIT_CALL sljit_stac
|
Line 314 SLJIT_API_FUNC_ATTRIBUTE sljit_w SLJIT_CALL sljit_stac
|
| } |
} |
| aligned_new_limit = (new_limit + sljit_page_align) & ~sljit_page_align; |
aligned_new_limit = (new_limit + sljit_page_align) & ~sljit_page_align; |
| aligned_old_limit = (stack->limit + sljit_page_align) & ~sljit_page_align; |
aligned_old_limit = (stack->limit + sljit_page_align) & ~sljit_page_align; |
| |
/* If madvise is available, we release the unnecessary space. */ |
| |
#if defined(MADV_DONTNEED) |
| if (aligned_new_limit < aligned_old_limit) |
if (aligned_new_limit < aligned_old_limit) |
| |
madvise((void*)aligned_new_limit, aligned_old_limit - aligned_new_limit, MADV_DONTNEED); |
| |
#elif defined(POSIX_MADV_DONTNEED) |
| |
if (aligned_new_limit < aligned_old_limit) |
| posix_madvise((void*)aligned_new_limit, aligned_old_limit - aligned_new_limit, POSIX_MADV_DONTNEED); |
posix_madvise((void*)aligned_new_limit, aligned_old_limit - aligned_new_limit, POSIX_MADV_DONTNEED); |
| |
#endif |
| stack->limit = new_limit; |
stack->limit = new_limit; |
| return 0; |
return 0; |
| #endif |
#endif |