mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
internal/process.h: add a no-warning simple wrapper for fork(2)
As fork(2) is deprecated, its calls must be guarded by
`COMPILER_WARNING_IGNORED(-Wdeprecated-declarations)`.
All usages of fork(2) in process have been alread guarded. A new call
to fork(2) was added in ruby.c with f22c4ff359
.
This caused a build failure on Solaris 11.
It may hide a bug to guard big code unnecessarily, so this change
introduces a simple wrapper "rb_fork" whose definition is guarded, and
replaces all calls to fork(2) with the wrapper function.
This commit is contained in:
parent
bb2ca76237
commit
91e4e2403e
4 changed files with 18 additions and 14 deletions
|
@ -11806,6 +11806,7 @@ ruby.$(OBJEXT): $(top_srcdir)/internal/parse.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/serial.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/serial.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/static_assert.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/static_assert.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/string.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/string.h
|
||||||
|
ruby.$(OBJEXT): $(top_srcdir)/internal/process.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/variable.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/variable.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/vm.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/vm.h
|
||||||
ruby.$(OBJEXT): $(top_srcdir)/internal/warnings.h
|
ruby.$(OBJEXT): $(top_srcdir)/internal/warnings.h
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "ruby/ruby.h" /* for VALUE */
|
#include "ruby/ruby.h" /* for VALUE */
|
||||||
#include "internal/imemo.h" /* for RB_IMEMO_TMPBUF_PTR */
|
#include "internal/imemo.h" /* for RB_IMEMO_TMPBUF_PTR */
|
||||||
|
#include "internal/warnings.h" /* for COMPILER_WARNING_PUSH */
|
||||||
|
|
||||||
#define RB_MAX_GROUPS (65536)
|
#define RB_MAX_GROUPS (65536)
|
||||||
|
|
||||||
|
@ -113,4 +114,15 @@ ARGVSTR2ARGC(VALUE argv_str)
|
||||||
return i - 1;
|
return i - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
COMPILER_WARNING_PUSH
|
||||||
|
#if __has_warning("-Wdeprecated-declarations") || RUBY3_COMPILER_IS(GCC)
|
||||||
|
COMPILER_WARNING_IGNORED(-Wdeprecated-declarations)
|
||||||
|
#endif
|
||||||
|
static inline rb_pid_t
|
||||||
|
rb_fork(void)
|
||||||
|
{
|
||||||
|
return fork();
|
||||||
|
}
|
||||||
|
COMPILER_WARNING_POP
|
||||||
|
|
||||||
#endif /* INTERNAL_PROCESS_H */
|
#endif /* INTERNAL_PROCESS_H */
|
||||||
|
|
16
process.c
16
process.c
|
@ -3957,10 +3957,6 @@ disable_child_handler_fork_child(struct child_handler_disabler_state *old, char
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPILER_WARNING_PUSH
|
|
||||||
#if __has_warning("-Wdeprecated-declarations") || RUBY3_COMPILER_IS(GCC)
|
|
||||||
COMPILER_WARNING_IGNORED(-Wdeprecated-declarations)
|
|
||||||
#endif
|
|
||||||
static rb_pid_t
|
static rb_pid_t
|
||||||
retry_fork_async_signal_safe(int *status, int *ep,
|
retry_fork_async_signal_safe(int *status, int *ep,
|
||||||
int (*chfunc)(void*, char *, size_t), void *charg,
|
int (*chfunc)(void*, char *, size_t), void *charg,
|
||||||
|
@ -3985,9 +3981,9 @@ retry_fork_async_signal_safe(int *status, int *ep,
|
||||||
if (!has_privilege())
|
if (!has_privilege())
|
||||||
pid = vfork();
|
pid = vfork();
|
||||||
else
|
else
|
||||||
pid = fork();
|
pid = rb_fork();
|
||||||
#else
|
#else
|
||||||
pid = fork();
|
pid = rb_fork();
|
||||||
#endif
|
#endif
|
||||||
if (pid == 0) {/* fork succeed, child process */
|
if (pid == 0) {/* fork succeed, child process */
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -4021,7 +4017,6 @@ retry_fork_async_signal_safe(int *status, int *ep,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
COMPILER_WARNING_POP
|
|
||||||
|
|
||||||
static rb_pid_t
|
static rb_pid_t
|
||||||
fork_check_err(int *status, int (*chfunc)(void*, char *, size_t), void *charg,
|
fork_check_err(int *status, int (*chfunc)(void*, char *, size_t), void *charg,
|
||||||
|
@ -4075,10 +4070,6 @@ rb_fork_async_signal_safe(int *status,
|
||||||
return fork_check_err(status, chfunc, charg, fds, errmsg, errmsg_buflen, 0);
|
return fork_check_err(status, chfunc, charg, fds, errmsg, errmsg_buflen, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
COMPILER_WARNING_PUSH
|
|
||||||
#if __has_warning("-Wdeprecated-declarations") || RUBY3_COMPILER_IS(GCC)
|
|
||||||
COMPILER_WARNING_IGNORED(-Wdeprecated-declarations)
|
|
||||||
#endif
|
|
||||||
rb_pid_t
|
rb_pid_t
|
||||||
rb_fork_ruby(int *status)
|
rb_fork_ruby(int *status)
|
||||||
{
|
{
|
||||||
|
@ -4093,7 +4084,7 @@ rb_fork_ruby(int *status)
|
||||||
if (mjit_enabled) mjit_pause(false); // Don't leave locked mutex to child. Note: child_handler must be enabled to pause MJIT.
|
if (mjit_enabled) mjit_pause(false); // Don't leave locked mutex to child. Note: child_handler must be enabled to pause MJIT.
|
||||||
disable_child_handler_before_fork(&old);
|
disable_child_handler_before_fork(&old);
|
||||||
before_fork_ruby();
|
before_fork_ruby();
|
||||||
pid = fork();
|
pid = rb_fork();
|
||||||
err = errno;
|
err = errno;
|
||||||
after_fork_ruby();
|
after_fork_ruby();
|
||||||
disable_child_handler_fork_parent(&old); /* yes, bad name */
|
disable_child_handler_fork_parent(&old); /* yes, bad name */
|
||||||
|
@ -4105,7 +4096,6 @@ rb_fork_ruby(int *status)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
COMPILER_WARNING_POP
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
3
ruby.c
3
ruby.c
|
@ -56,6 +56,7 @@
|
||||||
#include "internal/missing.h"
|
#include "internal/missing.h"
|
||||||
#include "internal/object.h"
|
#include "internal/object.h"
|
||||||
#include "internal/parse.h"
|
#include "internal/parse.h"
|
||||||
|
#include "internal/process.h"
|
||||||
#include "internal/variable.h"
|
#include "internal/variable.h"
|
||||||
#include "mjit.h"
|
#include "mjit.h"
|
||||||
#include "ruby/encoding.h"
|
#include "ruby/encoding.h"
|
||||||
|
@ -1635,7 +1636,7 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
|
||||||
#ifdef HAVE_WORKING_FORK
|
#ifdef HAVE_WORKING_FORK
|
||||||
int fds[2];
|
int fds[2];
|
||||||
if (rb_pipe(fds) == 0) {
|
if (rb_pipe(fds) == 0) {
|
||||||
rb_pid_t pid = fork();
|
rb_pid_t pid = rb_fork();
|
||||||
if (pid > 0) {
|
if (pid > 0) {
|
||||||
/* exec PAGER with reading from child */
|
/* exec PAGER with reading from child */
|
||||||
dup2(fds[0], 0);
|
dup2(fds[0], 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue