Feature #5097 » 0001-allocate-th-altstack-early-run-GC-on-allocation-fail.patch
signal.c | ||
---|---|---|
#ifdef POSIX_SIGNAL
|
||
#ifdef USE_SIGALTSTACK
|
||
#ifdef SIGSTKSZ
|
||
#define ALT_STACK_SIZE (SIGSTKSZ*2)
|
||
#else
|
||
#define ALT_STACK_SIZE (4*1024)
|
||
#endif
|
||
/* alternate stack for SIGSEGV */
|
||
void
|
||
rb_register_sigaltstack(rb_thread_t *th)
|
||
{
|
||
stack_t newSS, oldSS;
|
||
if (th->altstack) return;
|
||
newSS.ss_sp = th->altstack = malloc(ALT_STACK_SIZE);
|
||
newSS.ss_sp = th->altstack;
|
||
if (newSS.ss_sp == NULL)
|
||
/* should handle error */
|
||
rb_bug("rb_register_sigaltstack. malloc error\n");
|
||
rb_bug("rb_register_sigaltstack: th->altstack not initialized\n");
|
||
newSS.ss_size = ALT_STACK_SIZE;
|
||
newSS.ss_flags = 0;
|
||
vm.c | ||
---|---|---|
else {
|
||
#ifdef USE_SIGALTSTACK
|
||
if (th->altstack) {
|
||
free(th->altstack);
|
||
xfree(th->altstack);
|
||
}
|
||
#endif
|
||
ruby_xfree(ptr);
|
||
... | ... | |
rb_thread_t *th;
|
||
obj = TypedData_Make_Struct(klass, rb_thread_t, &thread_data_type, th);
|
||
#endif
|
||
return obj;
|
||
}
|
||
... | ... | |
{
|
||
th->self = self;
|
||
#ifdef USE_SIGALTSTACK
|
||
th->altstack = xmalloc(ALT_STACK_SIZE);
|
||
#endif
|
||
/* allocate thread stack */
|
||
th->stack_size = RUBY_VM_THREAD_STACK_SIZE;
|
||
th->stack = thread_recycle_stack(th->stack_size);
|
vm_core.h | ||
---|---|---|
#pragma GCC visibility pop
|
||
#endif
|
||
#ifdef SIGSTKSZ
|
||
#define ALT_STACK_SIZE (SIGSTKSZ*2)
|
||
#else
|
||
#define ALT_STACK_SIZE (4*1024)
|
||
#endif
|
||
#if defined(MINSIGSTKSZ) && (ALT_STACK_SIZE < MINSIGSTKSZ)
|
||
#undef ALT_STACK_SIZE
|
||
#define ALT_STACK_SIZE MINSIGSTKSZ
|
||
#endif
|
||
#endif /* RUBY_VM_CORE_H */
|