From: Tanaka Akira Date: 2012-06-19T23:48:21+09:00 Subject: [ruby-dev:45780] Re: [ruby-changes:24083] nobu:r36134 (trunk): process.c: no method calls in async-signal-safe 2012/6/19 nobu : > nobu 2012-06-19 17:51:57 +0900 (Tue, 19 Jun 2012) > > New Revision: 36134 > > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36134 > > Log: > process.c: no method calls in async-signal-safe > > * process.c (rb_execarg_run_options): do not call any methods in the > async-signal-safe function. mask has been checked with NUM2MODET() > already and converted with LONG2NUM(). > Index: process.c > =================================================================== > --- process.c (revision 36133) > +++ process.c (revision 36134) > @@ -17,6 +17,8 @@ > #include "internal.h" > #include "vm_core.h" > > +#define STATIC_ASSERT(name, expr) typedef int static_assert_##name##_check[1 - 2*!(expr)] > + > #include > #include > #include > @@ -1595,6 +1597,7 @@ > hide_obj(rb_str_dup(val))); > } > else if (id == rb_intern("umask")) { > + STATIC_ASSERT(sizeof_mode_t, sizeof(long) >= sizeof(mode_t)); /* for LONG2NUM */ > mode_t cmask = NUM2MODET(val); > if (!NIL_P(rb_ary_entry(options, EXEC_OPTION_UMASK))) { > rb_raise(rb_eArgError, "umask option specified twice"); > @@ -2707,7 +2710,7 @@ > > obj = rb_ary_entry(options, EXEC_OPTION_UMASK); > if (!NIL_P(obj)) { > - mode_t mask = NUM2MODET(obj); > + mode_t mask = (mode_t)FIX2LONG(obj); /* no method calls */ > mode_t oldmask = umask(mask); /* never fail */ /* async-signal-safe */ > if (!NIL_P(soptions)) > rb_ary_store(soptions, EXEC_OPTION_UMASK, MODET2NUM(oldmask)); どういう状況でこの NUM2MODET からメソッド呼び出しが起こるのか 理解できなかったんですが、どういう話なんでしょう? -- [田中 哲][たなか あきら][Tanaka Akira]