33#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) \
34 && !(defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
35#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
36#define SLJIT_ALLOCATOR_LOCK()
37#define SLJIT_ALLOCATOR_UNLOCK()
38#elif !(defined _WIN32)
41static pthread_mutex_t allocator_lock = PTHREAD_MUTEX_INITIALIZER;
43#define SLJIT_ALLOCATOR_LOCK() pthread_mutex_lock(&allocator_lock)
44#define SLJIT_ALLOCATOR_UNLOCK() pthread_mutex_unlock(&allocator_lock)
46static HANDLE allocator_lock;
53 if (InterlockedCompareExchangePointer(&allocator_lock, lock,
NULL))
56 WaitForSingleObject(allocator_lock, INFINITE);
59#define SLJIT_ALLOCATOR_LOCK() allocator_grab_lock()
60#define SLJIT_ALLOCATOR_UNLOCK() ReleaseMutex(allocator_lock)
68#if ((defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) \
69 && !(defined SLJIT_UTIL_SIMPLE_STACK_ALLOCATION && SLJIT_UTIL_SIMPLE_STACK_ALLOCATION)) \
70 || ((defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) \
71 && !((defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) \
72 || (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)))
81#define MAP_ANON MAP_ANONYMOUS
90#define SLJIT_CLOEXEC O_CLOEXEC
92#define SLJIT_CLOEXEC 0
96static int dev_zero = -1;
98#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
102 dev_zero = open(
"/dev/zero", O_RDWR | SLJIT_CLOEXEC);
111static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER;
115 pthread_mutex_lock(&dev_zero_mutex);
117 dev_zero = open(
"/dev/zero", O_RDWR | SLJIT_CLOEXEC);
119 pthread_mutex_unlock(&dev_zero_mutex);
129#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) \
130 || (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
136 static sljit_uw sljit_page_align = 0;
137 if (!sljit_page_align) {
139 sljit_page_align = (
sljit_uw)si.dwPageSize - 1;
141 return sljit_page_align;
149 static sljit_uw sljit_page_align = 0;
153 if (!sljit_page_align) {
155 align = sysconf(_SC_PAGESIZE);
157 align = getpagesize();
164 return sljit_page_align;
171#if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
173#if (defined SLJIT_UTIL_SIMPLE_STACK_ALLOCATION && SLJIT_UTIL_SIMPLE_STACK_ALLOCATION)
182 if (start_size > max_size || start_size < 1)
197 stack->
start = stack->
end - start_size;
211 if ((new_start < stack->
min_start) || (new_start >= stack->
end))
213 stack->
start = new_start;
224 VirtualFree((
void*)stack->
min_start, 0, MEM_RELEASE);
247 if (start_size > max_size || start_size < 1)
255 page_align = get_page_alignment();
256 max_size = (max_size + page_align) & ~page_align;
259 ptr = VirtualAlloc(
NULL, max_size, MEM_RESERVE, PAGE_READWRITE);
289 stack->
start = stack->
end - start_size;
298#if defined _WIN32 || defined(POSIX_MADV_DONTNEED)
304 if ((new_start < stack->
min_start) || (new_start >= stack->
end))
308 page_align = get_page_alignment();
310 aligned_new_start = (
sljit_uw)new_start & ~page_align;
312 if (aligned_new_start != aligned_old_start) {
313 if (aligned_new_start < aligned_old_start) {
314 if (!VirtualAlloc((
void*)aligned_new_start, aligned_old_start - aligned_new_start, MEM_COMMIT, PAGE_READWRITE))
318 if (!VirtualFree((
void*)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT))
322#elif defined(POSIX_MADV_DONTNEED)
323 if (stack->
start < new_start) {
324 page_align = get_page_alignment();
326 aligned_new_start = (
sljit_uw)new_start & ~page_align;
329 if (aligned_new_start > aligned_old_start) {
330 posix_madvise((
void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED);
332 madvise((
void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_FREE);
338 stack->
start = new_start;
#define SLJIT_UNLIKELY(x)
#define SLJIT_API_FUNC_ATTRIBUTE
#define SLJIT_MALLOC(size, allocator_data)
#define SLJIT_FREE(ptr, allocator_data)
#define SLJIT_UNUSED_ARG(arg)
SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)
SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack *SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)