/* We need to pass the bottom of the stack to make_fcontext,
depending on the stack direction it may be the lower or higher address: */
#if PTH_STACKGROWTH == -1
- void* stack = static_cast<char*>(get_stack()) + smx_context_usable_stack_size;
+ unsigned char* stack = get_stack() + smx_context_usable_stack_size;
#else
- void* stack = get_stack();
+ unsigned char* stack = get_stack();
#endif
#if BOOST_VERSION < 106100
this->fc_ = boost::context::make_fcontext(stack, smx_context_usable_stack_size, BoostContext::wrapper);
#if SIMGRID_HAVE_MC
/* Cannot use posix_memalign when SIMGRID_HAVE_MC. Align stack by hand, and save the
* pointer returned by xbt_malloc0. */
- char* alloc = (char*)xbt_malloc0(size + xbt_pagesize);
- stack_ = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize;
- *((void**)stack_ - 1) = alloc;
+ unsigned char* alloc = static_cast<unsigned char*>(xbt_malloc0(size + xbt_pagesize));
+ stack_ = alloc - (reinterpret_cast<uintptr_t>(alloc) & (xbt_pagesize - 1)) + xbt_pagesize;
+ reinterpret_cast<unsigned char**>(stack_)[-1] = alloc;
#elif !defined(_WIN32)
- if (posix_memalign(&this->stack_, xbt_pagesize, size) != 0)
+ void* alloc;
+ if (posix_memalign(&alloc, xbt_pagesize, size) != 0)
xbt_die("Failed to allocate stack.");
+ this->stack_ = static_cast<unsigned char*>(alloc);
#else
- this->stack_ = _aligned_malloc(size, xbt_pagesize);
+ this->stack_ = static_cast<unsigned char*>(_aligned_malloc(size, xbt_pagesize));
#endif
#ifndef _WIN32
/* This is fatal. We are going to fail at some point when we try reusing this. */
}
#endif
- this->stack_ = (char*)this->stack_ + smx_context_guard_size;
+ this->stack_ = this->stack_ + smx_context_guard_size;
} else {
- this->stack_ = xbt_malloc0(smx_context_stack_size);
+ this->stack_ = static_cast<unsigned char*>(xbt_malloc0(smx_context_stack_size));
}
#if PTH_STACKGROWTH == -1
- ASAN_ONLY(this->asan_stack_ = static_cast<char*>(this->stack_) + smx_context_usable_stack_size);
+ ASAN_ONLY(this->asan_stack_ = this->stack_ + smx_context_usable_stack_size);
#else
ASAN_ONLY(this->asan_stack_ = this->stack_);
#endif
#if HAVE_VALGRIND_H
- unsigned int valgrind_stack_id =
- VALGRIND_STACK_REGISTER(this->stack_, (char*)this->stack_ + smx_context_stack_size);
- memcpy((char*)this->stack_ + smx_context_usable_stack_size, &valgrind_stack_id, sizeof valgrind_stack_id);
+ unsigned int valgrind_stack_id = VALGRIND_STACK_REGISTER(this->stack_, this->stack_ + smx_context_stack_size);
+ memcpy(this->stack_ + smx_context_usable_stack_size, &valgrind_stack_id, sizeof valgrind_stack_id);
#endif
}
}
#if HAVE_VALGRIND_H
unsigned int valgrind_stack_id;
- memcpy(&valgrind_stack_id, (char*)stack_ + smx_context_usable_stack_size, sizeof valgrind_stack_id);
+ memcpy(&valgrind_stack_id, stack_ + smx_context_usable_stack_size, sizeof valgrind_stack_id);
VALGRIND_STACK_DEREGISTER(valgrind_stack_id);
#endif
#ifndef _WIN32
if (smx_context_guard_size > 0 && not MC_is_active()) {
- stack_ = (char*)stack_ - smx_context_guard_size;
+ stack_ = stack_ - smx_context_guard_size;
if (mprotect(stack_, smx_context_guard_size, PROT_READ | PROT_WRITE) == -1) {
XBT_WARN("Failed to remove page protection: %s", strerror(errno));
/* try to pursue anyway */
}
#if SIMGRID_HAVE_MC
/* Retrieve the saved pointer. See SIMIX_context_stack_new above. */
- stack_ = *((void**)stack_ - 1);
+ stack_ = reinterpret_cast<unsigned char**>(stack_)[-1];
#endif
}
#endif /* not windows */
xbt_free(stack_);
}
-void* SwappedContext::get_stack()
+unsigned char* SwappedContext::get_stack()
{
return stack_;
}