summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-24 03:44:24 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-11-24 03:44:24 +0000
commita6755b6e5feb09bdcd50409b0af377779ec02b91 (patch)
tree51c52e33146d3b8d9c0a938d2d30d41b3cf36dfb /process.c
parentec81f9c4cda263f77d0a84946b4d412ebd3a875a (diff)
process.c: intern IDs
* process.c (Init_process): intern IDs at initialization. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48551 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r--process.c159
1 files changed, 109 insertions, 50 deletions
diff --git a/process.c b/process.c
index 4e92fcc..6516106 100644
--- a/process.c
+++ b/process.c
@@ -255,6 +255,31 @@ typedef unsigned long unsigned_clock_t;
typedef unsigned LONG_LONG unsigned_clock_t;
#endif
+static ID id_in, id_out, id_err, id_pid, id_uid, id_gid;
+static ID id_close, id_child, id_status;
+#ifdef HAVE_SETPGID
+static ID id_pgroup;
+#endif
+#ifdef _WIN32
+static ID id_new_pgroup;
+#endif
+static ID id_unsetenv_others, id_chdir, id_umask, id_close_others, id_ENV;
+static ID id_nanosecond, id_microsecond, id_millisecond, id_second;
+static ID id_float_microsecond, id_float_millisecond, id_float_second;
+static ID id_GETTIMEOFDAY_BASED_CLOCK_REALTIME, id_TIME_BASED_CLOCK_REALTIME;
+#ifdef HAVE_TIMES
+static ID id_TIMES_BASED_CLOCK_MONOTONIC;
+static ID id_TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID;
+#endif
+#ifdef RUSAGE_SELF
+static ID id_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID;
+#endif
+static ID id_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID;
+#ifdef __APPLE__
+static ID id_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC;
+#endif
+static ID id_hertz;
+
/*
* call-seq:
* Process.pid -> fixnum
@@ -340,8 +365,8 @@ rb_last_status_set(int status, rb_pid_t pid)
{
rb_thread_t *th = GET_THREAD();
th->last_status = rb_obj_alloc(rb_cProcessStatus);
- rb_iv_set(th->last_status, "status", INT2FIX(status));
- rb_iv_set(th->last_status, "pid", PIDT2NUM(pid));
+ rb_ivar_set(th->last_status, id_status, INT2FIX(status));
+ rb_ivar_set(th->last_status, id_pid, PIDT2NUM(pid));
}
void
@@ -366,7 +391,7 @@ rb_last_status_clear(void)
static VALUE
pst_to_i(VALUE st)
{
- return rb_iv_get(st, "status");
+ return rb_ivar_get(st, id_status);
}
#define PST2INT(st) NUM2INT(pst_to_i(st))
@@ -385,7 +410,7 @@ pst_to_i(VALUE st)
static VALUE
pst_pid(VALUE st)
{
- return rb_attr_get(st, rb_intern("pid"));
+ return rb_attr_get(st, id_pid);
}
static void
@@ -1011,18 +1036,10 @@ proc_waitall(void)
static VALUE rb_cWaiter;
-static inline ID
-id_pid(void)
-{
- ID pid;
- CONST_ID(pid, "pid");
- return pid;
-}
-
static VALUE
detach_process_pid(VALUE thread)
{
- return rb_thread_local_aref(thread, id_pid());
+ return rb_thread_local_aref(thread, id_pid);
}
static VALUE
@@ -1041,7 +1058,7 @@ VALUE
rb_detach_process(rb_pid_t pid)
{
VALUE watcher = rb_thread_create(detach_process_watcher, (void*)(VALUE)pid);
- rb_thread_local_aset(watcher, id_pid(), PIDT2NUM(pid));
+ rb_thread_local_aset(watcher, id_pid, PIDT2NUM(pid));
RBASIC_SET_CLASS(watcher, rb_cWaiter);
return watcher;
}
@@ -1473,11 +1490,11 @@ check_exec_redirect_fd(VALUE v, int iskey)
}
else if (SYMBOL_P(v)) {
ID id = SYM2ID(v);
- if (id == rb_intern("in"))
+ if (id == id_in)
fd = 0;
- else if (id == rb_intern("out"))
+ else if (id == id_out)
fd = 1;
- else if (id == rb_intern("err"))
+ else if (id == id_err)
fd = 2;
else
goto wrong;
@@ -1537,19 +1554,19 @@ check_exec_redirect(VALUE key, VALUE val, struct rb_execarg *eargp)
switch (TYPE(val)) {
case T_SYMBOL:
id = SYM2ID(val);
- if (id == rb_intern("close")) {
+ if (id == id_close) {
param = Qnil;
eargp->fd_close = check_exec_redirect1(eargp->fd_close, key, param);
}
- else if (id == rb_intern("in")) {
+ else if (id == id_in) {
param = INT2FIX(0);
eargp->fd_dup2 = check_exec_redirect1(eargp->fd_dup2, key, param);
}
- else if (id == rb_intern("out")) {
+ else if (id == id_out) {
param = INT2FIX(1);
eargp->fd_dup2 = check_exec_redirect1(eargp->fd_dup2, key, param);
}
- else if (id == rb_intern("err")) {
+ else if (id == id_err) {
param = INT2FIX(2);
eargp->fd_dup2 = check_exec_redirect1(eargp->fd_dup2, key, param);
}
@@ -1571,7 +1588,7 @@ check_exec_redirect(VALUE key, VALUE val, struct rb_execarg *eargp)
case T_ARRAY:
path = rb_ary_entry(val, 0);
if (RARRAY_LEN(val) == 2 && SYMBOL_P(path) &&
- SYM2ID(path) == rb_intern("child")) {
+ SYM2ID(path) == id_child) {
param = check_exec_redirect_fd(rb_ary_entry(val, 1), 0);
eargp->fd_dup2_child = check_exec_redirect1(eargp->fd_dup2_child, key, param);
}
@@ -1648,7 +1665,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
case T_SYMBOL:
id = SYM2ID(key);
#ifdef HAVE_SETPGID
- if (id == rb_intern("pgroup")) {
+ if (id == id_pgroup) {
rb_pid_t pgroup;
if (eargp->pgroup_given) {
rb_raise(rb_eArgError, "pgroup option specified twice");
@@ -1669,7 +1686,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
else
#endif
#ifdef _WIN32
- if (id == rb_intern("new_pgroup")) {
+ if (id == id_new_pgroup) {
if (eargp->new_pgroup_given) {
rb_raise(rb_eArgError, "new_pgroup option specified twice");
}
@@ -1707,14 +1724,14 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
}
else
#endif
- if (id == rb_intern("unsetenv_others")) {
+ if (id == id_unsetenv_others) {
if (eargp->unsetenv_others_given) {
rb_raise(rb_eArgError, "unsetenv_others option specified twice");
}
eargp->unsetenv_others_given = 1;
eargp->unsetenv_others_do = RTEST(val) ? 1 : 0;
}
- else if (id == rb_intern("chdir")) {
+ else if (id == id_chdir) {
if (eargp->chdir_given) {
rb_raise(rb_eArgError, "chdir option specified twice");
}
@@ -1722,7 +1739,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
eargp->chdir_given = 1;
eargp->chdir_dir = hide_obj(EXPORT_DUP(val));
}
- else if (id == rb_intern("umask")) {
+ else if (id == id_umask) {
mode_t cmask = NUM2MODET(val);
if (eargp->umask_given) {
rb_raise(rb_eArgError, "umask option specified twice");
@@ -1730,26 +1747,26 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
eargp->umask_given = 1;
eargp->umask_mask = cmask;
}
- else if (id == rb_intern("close_others")) {
+ else if (id == id_close_others) {
if (eargp->close_others_given) {
rb_raise(rb_eArgError, "close_others option specified twice");
}
eargp->close_others_given = 1;
eargp->close_others_do = RTEST(val) ? 1 : 0;
}
- else if (id == rb_intern("in")) {
+ else if (id == id_in) {
key = INT2FIX(0);
goto redirect;
}
- else if (id == rb_intern("out")) {
+ else if (id == id_out) {
key = INT2FIX(1);
goto redirect;
}
- else if (id == rb_intern("err")) {
+ else if (id == id_err) {
key = INT2FIX(2);
goto redirect;
}
- else if (id == rb_intern("uid")) {
+ else if (id == id_uid) {
#ifdef HAVE_SETUID
if (eargp->uid_given) {
rb_raise(rb_eArgError, "uid option specified twice");
@@ -1764,7 +1781,7 @@ rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val)
"uid option is unimplemented on this machine");
#endif
}
- else if (id == rb_intern("gid")) {
+ else if (id == id_gid) {
#ifdef HAVE_SETGID
if (eargp->gid_given) {
rb_raise(rb_eArgError, "gid option specified twice");
@@ -2306,7 +2323,7 @@ rb_execarg_fixup(VALUE execarg_obj)
envtbl = rb_hash_new();
}
else {
- envtbl = rb_const_get(rb_cObject, rb_intern("ENV"));
+ envtbl = rb_const_get(rb_cObject, id_ENV);
envtbl = rb_convert_type(envtbl, T_HASH, "Hash", "to_hash");
}
hide_obj(envtbl);
@@ -2897,7 +2914,7 @@ save_env(struct rb_execarg *sargp)
if (!sargp)
return;
if (sargp->env_modification == Qfalse) {
- VALUE env = rb_const_get(rb_cObject, rb_intern("ENV"));
+ VALUE env = rb_const_get(rb_cObject, id_ENV);
if (RTEST(env)) {
VALUE ary = hide_obj(rb_ary_new());
rb_block_call(env, idEach, 0, 0, save_env_i,
@@ -7020,30 +7037,30 @@ make_clock_result(struct timetick *ttp,
timetick_int_t *denominators, int num_denominators,
VALUE unit)
{
- if (unit == ID2SYM(rb_intern("nanosecond"))) {
+ if (unit == ID2SYM(id_nanosecond)) {
numerators[num_numerators++] = 1000000000;
return timetick2integer(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (unit == ID2SYM(rb_intern("microsecond"))) {
+ else if (unit == ID2SYM(id_microsecond)) {
numerators[num_numerators++] = 1000000;
return timetick2integer(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (unit == ID2SYM(rb_intern("millisecond"))) {
+ else if (unit == ID2SYM(id_millisecond)) {
numerators[num_numerators++] = 1000;
return timetick2integer(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (unit == ID2SYM(rb_intern("second"))) {
+ else if (unit == ID2SYM(id_second)) {
return timetick2integer(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (unit == ID2SYM(rb_intern("float_microsecond"))) {
+ else if (unit == ID2SYM(id_float_microsecond)) {
numerators[num_numerators++] = 1000000;
return timetick2dblnum(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (unit == ID2SYM(rb_intern("float_millisecond"))) {
+ else if (unit == ID2SYM(id_float_millisecond)) {
numerators[num_numerators++] = 1000;
return timetick2dblnum(ttp, numerators, num_numerators, denominators, num_denominators);
}
- else if (NIL_P(unit) || unit == ID2SYM(rb_intern("float_second"))) {
+ else if (NIL_P(unit) || unit == ID2SYM(id_float_second)) {
return timetick2dblnum(ttp, numerators, num_numerators, denominators, num_denominators);
}
else
@@ -7209,7 +7226,7 @@ rb_clock_gettime(int argc, VALUE *argv)
* GETTIMEOFDAY_BASED_CLOCK_REALTIME is used for
* CLOCK_REALTIME if clock_gettime is not available.
*/
-#define RUBY_GETTIMEOFDAY_BASED_CLOCK_REALTIME ID2SYM(rb_intern("GETTIMEOFDAY_BASED_CLOCK_REALTIME"))
+#define RUBY_GETTIMEOFDAY_BASED_CLOCK_REALTIME ID2SYM(id_GETTIMEOFDAY_BASED_CLOCK_REALTIME)
if (clk_id == RUBY_GETTIMEOFDAY_BASED_CLOCK_REALTIME) {
struct timeval tv;
ret = gettimeofday(&tv, 0);
@@ -7221,7 +7238,7 @@ rb_clock_gettime(int argc, VALUE *argv)
goto success;
}
-#define RUBY_TIME_BASED_CLOCK_REALTIME ID2SYM(rb_intern("TIME_BASED_CLOCK_REALTIME"))
+#define RUBY_TIME_BASED_CLOCK_REALTIME ID2SYM(id_TIME_BASED_CLOCK_REALTIME)
if (clk_id == RUBY_TIME_BASED_CLOCK_REALTIME) {
time_t t;
t = time(NULL);
@@ -7235,7 +7252,7 @@ rb_clock_gettime(int argc, VALUE *argv)
#ifdef HAVE_TIMES
#define RUBY_TIMES_BASED_CLOCK_MONOTONIC \
- ID2SYM(rb_intern("TIMES_BASED_CLOCK_MONOTONIC"))
+ ID2SYM(id_TIMES_BASED_CLOCK_MONOTONIC)
if (clk_id == RUBY_TIMES_BASED_CLOCK_MONOTONIC) {
struct tms buf;
clock_t c;
@@ -7253,7 +7270,7 @@ rb_clock_gettime(int argc, VALUE *argv)
#ifdef RUSAGE_SELF
#define RUBY_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID \
- ID2SYM(rb_intern("GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID"))
+ ID2SYM(id_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID)
if (clk_id == RUBY_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID) {
struct rusage usage;
int32_t usec;
@@ -7274,7 +7291,7 @@ rb_clock_gettime(int argc, VALUE *argv)
#ifdef HAVE_TIMES
#define RUBY_TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID \
- ID2SYM(rb_intern("TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID"))
+ ID2SYM(id_TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID)
if (clk_id == RUBY_TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID) {
struct tms buf;
unsigned_clock_t utime, stime;
@@ -7294,7 +7311,7 @@ rb_clock_gettime(int argc, VALUE *argv)
#endif
#define RUBY_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID \
- ID2SYM(rb_intern("CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID"))
+ ID2SYM(id_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID)
if (clk_id == RUBY_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID) {
clock_t c;
unsigned_clock_t uc;
@@ -7310,7 +7327,7 @@ rb_clock_gettime(int argc, VALUE *argv)
}
#ifdef __APPLE__
-#define RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC ID2SYM(rb_intern("MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC"))
+#define RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC ID2SYM(id_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC)
if (clk_id == RUBY_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC) {
mach_timebase_info_data_t *info = get_mach_timebase_info();
uint64_t t = mach_absolute_time();
@@ -7481,7 +7498,7 @@ rb_clock_getres(int argc, VALUE *argv)
rb_sys_fail(0);
success:
- if (unit == ID2SYM(rb_intern("hertz"))) {
+ if (unit == ID2SYM(id_hertz)) {
return timetick2dblnum_reciprocal(&tt, numerators, num_numerators, denominators, num_denominators);
}
else {
@@ -7881,4 +7898,46 @@ Init_process(void)
rb_define_module_function(rb_mProcID_Syscall, "setresuid", p_sys_setresuid, 3);
rb_define_module_function(rb_mProcID_Syscall, "setresgid", p_sys_setresgid, 3);
rb_define_module_function(rb_mProcID_Syscall, "issetugid", p_sys_issetugid, 0);
+
+ id_in = rb_intern("in");
+ id_out = rb_intern("out");
+ id_err = rb_intern("err");
+ id_pid = rb_intern("pid");
+ id_uid = rb_intern("uid");
+ id_gid = rb_intern("gid");
+ id_close = rb_intern("close");
+ id_child = rb_intern("child");
+ id_status = rb_intern("status");
+#ifdef HAVE_SETPGID
+ id_pgroup = rb_intern("pgroup");
+#endif
+#ifdef _WIN32
+ id_new_pgroup = rb_intern("new_pgroup");
+#endif
+ id_unsetenv_others = rb_intern("unsetenv_others");
+ id_chdir = rb_intern("chdir");
+ id_umask = rb_intern("umask");
+ id_close_others = rb_intern("close_others");
+ id_ENV = rb_intern("ENV");
+ id_nanosecond = rb_intern("nanosecond");
+ id_microsecond = rb_intern("microsecond");
+ id_millisecond = rb_intern("millisecond");
+ id_second = rb_intern("second");
+ id_float_microsecond = rb_intern("float_microsecond");
+ id_float_millisecond = rb_intern("float_millisecond");
+ id_float_second = rb_intern("float_second");
+ id_GETTIMEOFDAY_BASED_CLOCK_REALTIME = rb_intern("GETTIMEOFDAY_BASED_CLOCK_REALTIME");
+ id_TIME_BASED_CLOCK_REALTIME = rb_intern("TIME_BASED_CLOCK_REALTIME");
+#ifdef HAVE_TIMES
+ id_TIMES_BASED_CLOCK_MONOTONIC = rb_intern("TIMES_BASED_CLOCK_MONOTONIC");
+ id_TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID = rb_intern("TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID");
+#endif
+#ifdef RUSAGE_SELF
+ id_GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID = rb_intern("GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID");
+#endif
+ id_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID = rb_intern("CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID");
+#ifdef __APPLE__
+ id_MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC = rb_intern("MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC");
+#endif
+ id_hertz = rb_intern("hertz");
}