summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-30 01:58:21 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-30 01:58:21 +0000
commit64270d3df28624de151b5d555e02b42b48c5b301 (patch)
tree5aa0456de592c701e2d63f08fcec96a7a2e73d09
parent32cfc7cefdc004895f76abf82ae62b53d200e424 (diff)
merge revision(s) 32749:
* vm.c (th_init): preallocate alternative stack. NoMemoryError is better than rb_bug, of course. Patch by Eric Wong. [ruby-core:38572][ruby-core:38594]. * signal.c (rb_register_sigaltstack): ditto. * vm_core.h: moved ALT_STACK_SIZE definition from signal.c. * vm.c (thread_free): use xfree() instead of free(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@32750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog11
-rw-r--r--signal.c15
-rw-r--r--vm.c5
-rw-r--r--vm_core.h6
4 files changed, 25 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 72d5dbe790..1c1d92f888 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Sat Jul 30 10:58:10 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * vm.c (th_init): preallocate alternative stack.
+ NoMemoryError is better than rb_bug, of course.
+ Patch by Eric Wong. [ruby-core:38572][ruby-core:38594].
+
+ * signal.c (rb_register_sigaltstack): ditto.
+
+ * vm_core.h: moved ALT_STACK_SIZE definition from signal.c.
+ * vm.c (thread_free): use xfree() instead of free().
+
Sat Jul 30 07:20:49 2011 Tanaka Akira <akr@fsij.org>
* ext/socket/lib/socket.rb (udp_server_sockets): unused variable
diff --git a/signal.c b/signal.c
index 7bad8c1d8a..3b91616a7c 100644
--- a/signal.c
+++ b/signal.c
@@ -423,29 +423,22 @@ typedef RETSIGTYPE ruby_sigaction_t(int);
#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;
+ if (!th->altstack)
+ rb_bug("rb_register_sigaltstack: th->altstack not initialized\n");
- newSS.ss_sp = th->altstack = malloc(ALT_STACK_SIZE);
- if (newSS.ss_sp == NULL)
- /* should handle error */
- rb_bug("rb_register_sigaltstack. malloc error\n");
+ newSS.ss_sp = th->altstack;
newSS.ss_size = ALT_STACK_SIZE;
newSS.ss_flags = 0;
sigaltstack(&newSS, &oldSS); /* ignore error. */
}
-#endif
+#endif /* USE_SIGALTSTACK */
static sighandler_t
ruby_signal(int signum, sighandler_t handler)
diff --git a/vm.c b/vm.c
index d945fba0d7..3c1e8b4113 100644
--- a/vm.c
+++ b/vm.c
@@ -1754,7 +1754,7 @@ thread_free(void *ptr)
else {
#ifdef USE_SIGALTSTACK
if (th->altstack) {
- free(th->altstack);
+ xfree(th->altstack);
}
#endif
ruby_xfree(ptr);
@@ -1826,6 +1826,9 @@ th_init(rb_thread_t *th, VALUE self)
th->self = self;
/* allocate thread stack */
+#ifdef USE_SIGALTSTACK
+ th->altstack = xmalloc(ALT_STACK_SIZE);
+#endif
th->stack_size = RUBY_VM_THREAD_STACK_SIZE;
th->stack = thread_recycle_stack(th->stack_size);
diff --git a/vm_core.h b/vm_core.h
index 678a515bdf..b5433f9094 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -383,6 +383,12 @@ struct rb_unblock_callback {
struct rb_mutex_struct;
+#ifdef SIGSTKSZ
+#define ALT_STACK_SIZE (SIGSTKSZ*2)
+#else
+#define ALT_STACK_SIZE (4*1024)
+#endif
+
typedef struct rb_thread_struct {
VALUE self;
rb_vm_t *vm;