#include "simgrid/sg_config.h"
#include "internal_config.h"
#include "simgrid/modelchecker.h"
+
+
+#ifdef _WIN32
+#include <windows.h>
+#else
#include <sys/mman.h>
+#endif
+
+#ifdef __MINGW32__
+#define _aligned_malloc __mingw_aligned_malloc
+#define _aligned_free __mingw_aligned_free
+#endif //MINGW
+
+
#ifdef HAVE_VALGRIND_VALGRIND_H
# include <valgrind/valgrind.h>
char *alloc = xbt_malloc0(size + xbt_pagesize);
stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
*((void **)stack - 1) = alloc;
-#else
+#elif !defined(WIN32)
if (posix_memalign(&stack, xbt_pagesize, size) != 0)
xbt_die("Failed to allocate stack.");
+#else
+ stack = _aligned_malloc(size, xbt_pagesize);
#endif
+
+#ifndef WIN32
if (mprotect(stack, smx_context_guard_size, PROT_NONE) == -1) {
XBT_WARN("Failed to protect stack: %s", strerror(errno));
/* That's not fatal, pursue anyway. */
}
+#endif
stack = (char *)stack + smx_context_guard_size;
} else {
stack = xbt_malloc0(smx_context_stack_size);
VALGRIND_STACK_DEREGISTER(valgrind_stack_id);
#endif
+#ifndef WIN32
if (smx_context_guard_size > 0 && !MC_is_active()) {
stack = (char *)stack - smx_context_guard_size;
if (mprotect(stack, smx_context_guard_size,
stack = *((void **)stack - 1);
#endif
}
+#endif
+
xbt_free(stack);
}
static void *smx_ctx_thread_wrapper(void *param)
{
smx_ctx_thread_t context = (smx_ctx_thread_t) param;
-
+#ifndef WIN32
/* Install alternate signal stack, for SIGSEGV handler. */
stack_t stack;
stack.ss_sp = sigsegv_stack;
stack.ss_size = sizeof sigsegv_stack;
stack.ss_flags = 0;
sigaltstack(&stack, NULL);
-
+#endif
/* Tell the maestro we are starting, and wait for its green light */
xbt_os_sem_release(context->end);
xbt_os_sem_acquire(context->begin);
exit(1);
}
+#ifndef WIN32
static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context)
{
if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) {
}
}
+#endif
/********************************* SIMIX **************************************/
XBT_INLINE double SIMIX_timer_next(void)
/* Prepare to display some more info when dying on Ctrl-C pressing */
signal(SIGINT, inthandler);
+#ifndef WIN32
/* Install SEGV handler */
install_segvhandler();
-
+#endif
/* register a function to be called by SURF after the environment creation */
sg_platf_init();
sg_platf_postparse_add_cb(SIMIX_post_create_environment);
void xbt_os_thread_setguardsize(int guard_size)
{
+#ifdef WIN32
+ THROW_UNIMPLEMENTED; //pthread_attr_setguardsize is not implemented in pthread.h on windows
+#else
size_t sz = guard_size;
int res = pthread_attr_setguardsize(&thread_attr, sz);
if (res)
XBT_WARN("pthread_attr_setguardsize failed (%d) for size: %zd", res, sz);
+#endif
}
const char *xbt_os_thread_name(xbt_os_thread_t t)