Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Windows build #20

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion boost/asm/jump_x86_64_ms_pe_masm.asm
Expand Up @@ -84,7 +84,7 @@

.code

jump_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
jump_fcontext PROC EXPORT FRAME
.endprolog

; prepare stack
Expand Down
2 changes: 1 addition & 1 deletion boost/asm/make_x86_64_ms_pe_masm.asm
Expand Up @@ -87,7 +87,7 @@ EXTERN _exit:PROC
.code

; generate function table entry in .pdata and unwind information in
make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
make_fcontext PROC EXPORT FRAME
; .xdata for a function's structured exception handling unwind behavior
.endprolog

Expand Down
22 changes: 21 additions & 1 deletion config.w32
Expand Up @@ -3,5 +3,25 @@ ARG_ENABLE('fiber', 'fiber support', 'yes');
if (PHP_FIBER != 'no') {
AC_DEFINE('HAVE_FIBER', 1, 'fiber support enabled');

EXTENSION('fiber', 'src\\php_fiber.c src\\fiber.c src\\fiber_winfib.c', null, '/I. /Iinclude /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 /DPHP_FIBER_EXPORTS=1');
var FIBER_ASSEMBLER = PATH_PROG('ML64');

DEFINE('FIBER_ASSEMBLER', FIBER_ASSEMBLER);
var ASM_DIR = 'boost\\asm';
var ASM_FILENAMES = ['jump_x86_64_ms_pe_masm', 'make_x86_64_ms_pe_masm'];
for (var i = 0; i < ASM_FILENAMES.length; ++i) {
var filename = ASM_FILENAMES[i];
var src = (configure_module_dirname + '\\' + ASM_DIR + '\\' + filename + '.asm').replace(/\//g, '\\');
var obj = '$(BUILD_DIR)\\src\\' + filename + '.obj';

MFO.WriteLine(obj + ': ' + src);
MFO.WriteLine('\t@$(FIBER_ASSEMBLER) /Fo' + obj + ' /c ' + src);
MFO.WriteLine('$(BUILD_DIR)\\php_fiber.dll: ' + obj);
}

var FIBER_SOURCES = 'src\\php_fiber.c src\\fiber.c src\\fiber_asm.c src\\fiber_stack.c';
EXTENSION('fiber', FIBER_SOURCES, null, '/I. /Iinclude /DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 /DPHP_FIBER_EXPORTS=1');

for (var i = 0; i < ASM_FILENAMES.length; ++i) {
ADD_FLAG('LDFLAGS_FIBER', '$(BUILD_DIR)\\src\\' + ASM_FILENAMES[i] + '.obj ');
}
}
26 changes: 7 additions & 19 deletions src/fiber_stack.c
Expand Up @@ -25,15 +25,9 @@

zend_bool zend_fiber_stack_allocate(zend_fiber_stack *stack, unsigned int size)
{
static __thread size_t page_size;

if (!page_size) {
page_size = ZEND_FIBER_PAGESIZE;
}

size_t msize;

stack->size = ((size_t) size + page_size - 1) / page_size * page_size;
stack->size = ((size_t) size + ZEND_FIBER_PAGESIZE - 1) / ZEND_FIBER_PAGESIZE * ZEND_FIBER_PAGESIZE;

#ifdef ZEND_FIBER_MMAP

Expand All @@ -43,18 +37,18 @@ zend_bool zend_fiber_stack_allocate(zend_fiber_stack *stack, unsigned int size)
mapflags |= MAP_STACK;
#endif

msize = stack->size + ZEND_FIBER_GUARD_PAGES * page_size;
msize = stack->size + ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE;
pointer = mmap(0, msize, PROT_READ | PROT_WRITE, mapflags, -1, 0);

if (pointer == (void *) -1) {
return 0;
}

#if ZEND_FIBER_GUARD_PAGES
mprotect(pointer, ZEND_FIBER_GUARD_PAGES * page_size, PROT_NONE);
mprotect(pointer, ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE, PROT_NONE);
#endif

stack->pointer = (void *)((char *) pointer + ZEND_FIBER_GUARD_PAGES * page_size);
stack->pointer = (void *)((char *) pointer + ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE);
#else
stack->pointer = emalloc_large(stack->size);
msize = stack->size;
Expand All @@ -68,20 +62,14 @@ zend_bool zend_fiber_stack_allocate(zend_fiber_stack *stack, unsigned int size)
char * base;

base = (char *) stack->pointer;
stack->valgrind = VALGRIND_STACK_REGISTER(base, base + msize - ZEND_FIBER_GUARD_PAGES * page_size);
stack->valgrind = VALGRIND_STACK_REGISTER(base, base + msize - ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE);
#endif

return 1;
}

void zend_fiber_stack_free(zend_fiber_stack *stack)
{
static __thread size_t page_size;

if (!page_size) {
page_size = ZEND_FIBER_PAGESIZE;
}

if (stack->pointer != NULL) {
#ifdef VALGRIND_STACK_DEREGISTER
VALGRIND_STACK_DEREGISTER(stack->valgrind);
Expand All @@ -92,8 +80,8 @@ void zend_fiber_stack_free(zend_fiber_stack *stack)
void *address;
size_t len;

address = (void *)((char *) stack->pointer - ZEND_FIBER_GUARD_PAGES * page_size);
len = stack->size + ZEND_FIBER_GUARD_PAGES * page_size;
address = (void *)((char *) stack->pointer - ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE);
len = stack->size + ZEND_FIBER_GUARD_PAGES * ZEND_FIBER_PAGESIZE;

munmap(address, len);
#else
Expand Down