mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
libgo: Use waitpid on systems which do not have wait4.
From-SVN: r171758
This commit is contained in:
parent
8955c80a1c
commit
0b3189e79f
@ -1246,13 +1246,20 @@ endif # !LIBGO_IS_SOLARIS
|
||||
endif # !LIBGO_IS_LINUX
|
||||
|
||||
|
||||
# Define ForkExec, PtraceForkExec, Exec, and Wait4.
|
||||
# Define ForkExec, PtraceForkExec, and Exec.
|
||||
if LIBGO_IS_RTEMS
|
||||
syscall_exec_os_file = syscalls/exec_stubs.go
|
||||
else
|
||||
syscall_exec_os_file = syscalls/exec.go
|
||||
endif
|
||||
|
||||
# Define Wait4.
|
||||
if HAVE_WAIT4
|
||||
syscall_wait_file = syscalls/wait4.go
|
||||
else
|
||||
syscall_wait_file = syscalls/waitpid.go
|
||||
endif
|
||||
|
||||
# Define Sleep.
|
||||
if LIBGO_IS_RTEMS
|
||||
syscall_sleep_file = syscalls/sleep_rtems.go
|
||||
@ -1329,6 +1336,7 @@ go_syscall_files = \
|
||||
$(syscall_errstr_decl_file) \
|
||||
syscalls/exec_helpers.go \
|
||||
$(syscall_exec_os_file) \
|
||||
$(syscall_wait_file) \
|
||||
$(syscall_filesize_file) \
|
||||
$(syscall_stat_file) \
|
||||
$(syscall_sleep_file) \
|
||||
|
@ -1632,8 +1632,12 @@ go_testing_script_files = \
|
||||
@LIBGO_IS_LINUX_TRUE@syscall_stat_file = syscalls/sysfile_stat_largefile.go
|
||||
@LIBGO_IS_RTEMS_FALSE@syscall_exec_os_file = syscalls/exec.go
|
||||
|
||||
# Define ForkExec, PtraceForkExec, Exec, and Wait4.
|
||||
# Define ForkExec, PtraceForkExec, and Exec.
|
||||
@LIBGO_IS_RTEMS_TRUE@syscall_exec_os_file = syscalls/exec_stubs.go
|
||||
@HAVE_WAIT4_FALSE@syscall_wait_file = syscalls/waitpid.go
|
||||
|
||||
# Define Wait4.
|
||||
@HAVE_WAIT4_TRUE@syscall_wait_file = syscalls/wait4.go
|
||||
@LIBGO_IS_RTEMS_FALSE@syscall_sleep_file = syscalls/sleep_select.go
|
||||
|
||||
# Define Sleep.
|
||||
@ -1671,6 +1675,7 @@ go_syscall_files = \
|
||||
$(syscall_errstr_decl_file) \
|
||||
syscalls/exec_helpers.go \
|
||||
$(syscall_exec_os_file) \
|
||||
$(syscall_wait_file) \
|
||||
$(syscall_filesize_file) \
|
||||
$(syscall_stat_file) \
|
||||
$(syscall_sleep_file) \
|
||||
|
20
libgo/configure
vendored
20
libgo/configure
vendored
@ -603,6 +603,8 @@ am__EXEEXT_TRUE
|
||||
LTLIBOBJS
|
||||
LIBOBJS
|
||||
STRINGOPS_FLAG
|
||||
HAVE_WAIT4_FALSE
|
||||
HAVE_WAIT4_TRUE
|
||||
HAVE_STRERROR_R_FALSE
|
||||
HAVE_STRERROR_R_TRUE
|
||||
HAVE_SYS_MMAN_H_FALSE
|
||||
@ -10900,7 +10902,7 @@ else
|
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||
lt_status=$lt_dlunknown
|
||||
cat > conftest.$ac_ext <<_LT_EOF
|
||||
#line 10903 "configure"
|
||||
#line 10905 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#if HAVE_DLFCN_H
|
||||
@ -11006,7 +11008,7 @@ else
|
||||
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
|
||||
lt_status=$lt_dlunknown
|
||||
cat > conftest.$ac_ext <<_LT_EOF
|
||||
#line 11009 "configure"
|
||||
#line 11011 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#if HAVE_DLFCN_H
|
||||
@ -14154,7 +14156,7 @@ else
|
||||
fi
|
||||
|
||||
|
||||
for ac_func in srandom random strerror_r strsignal
|
||||
for ac_func in srandom random strerror_r strsignal wait4
|
||||
do :
|
||||
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
|
||||
@ -14175,6 +14177,14 @@ else
|
||||
HAVE_STRERROR_R_FALSE=
|
||||
fi
|
||||
|
||||
if test "$ac_cv_func_wait4" = yes; then
|
||||
HAVE_WAIT4_TRUE=
|
||||
HAVE_WAIT4_FALSE='#'
|
||||
else
|
||||
HAVE_WAIT4_TRUE='#'
|
||||
HAVE_WAIT4_FALSE=
|
||||
fi
|
||||
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_bool_compare_and_swap_4" >&5
|
||||
$as_echo_n "checking for __sync_bool_compare_and_swap_4... " >&6; }
|
||||
@ -14552,6 +14562,10 @@ if test -z "${HAVE_STRERROR_R_TRUE}" && test -z "${HAVE_STRERROR_R_FALSE}"; then
|
||||
as_fn_error "conditional \"HAVE_STRERROR_R\" was never defined.
|
||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||
fi
|
||||
if test -z "${HAVE_WAIT4_TRUE}" && test -z "${HAVE_WAIT4_FALSE}"; then
|
||||
as_fn_error "conditional \"HAVE_WAIT4\" was never defined.
|
||||
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
||||
fi
|
||||
|
||||
: ${CONFIG_STATUS=./config.status}
|
||||
ac_write_fail=0
|
||||
|
@ -381,8 +381,9 @@ esac
|
||||
AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h)
|
||||
AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
|
||||
|
||||
AC_CHECK_FUNCS(srandom random strerror_r strsignal)
|
||||
AC_CHECK_FUNCS(srandom random strerror_r strsignal wait4)
|
||||
AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
|
||||
AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
|
||||
|
||||
AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
|
||||
[libgo_cv_func___sync_bool_compare_and_swap_4],
|
||||
|
@ -377,6 +377,8 @@ if test "$rusage" != ""; then
|
||||
nrusage="$nrusage $field;"
|
||||
done
|
||||
echo "type Rusage struct {$nrusage }" >> ${OUT}
|
||||
else
|
||||
echo "type Rusage struct {}" >> ${OUT}
|
||||
fi
|
||||
|
||||
# The utsname struct.
|
||||
|
@ -17,7 +17,6 @@ func libc_chdir(name *byte) int __asm__ ("chdir")
|
||||
func libc_dup2(int, int) int __asm__ ("dup2")
|
||||
func libc_execve(*byte, **byte, **byte) int __asm__ ("execve")
|
||||
func libc_sysexit(int) __asm__ ("_exit")
|
||||
func libc_wait4(Pid_t, *int, int, *Rusage) Pid_t __asm__ ("wait4")
|
||||
|
||||
// Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child.
|
||||
// If a dup or exec fails, write the errno int to pipe.
|
||||
@ -263,16 +262,3 @@ func Exec(argv0 string, argv []string, envv []string) (err int) {
|
||||
libc_execve(StringBytePtr(argv0), &argv_arg[0], &envv_arg[0])
|
||||
return GetErrno()
|
||||
}
|
||||
|
||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
|
||||
var status int
|
||||
r := libc_wait4(Pid_t(pid), &status, options, rusage)
|
||||
wpid = int(r)
|
||||
if r < 0 {
|
||||
errno = GetErrno()
|
||||
}
|
||||
if wstatus != nil {
|
||||
*wstatus = WaitStatus(status)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
22
libgo/syscalls/wait4.go
Normal file
22
libgo/syscalls/wait4.go
Normal file
@ -0,0 +1,22 @@
|
||||
// wait4.go -- Wait4 for systems with wait4.
|
||||
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package syscall
|
||||
|
||||
func libc_wait4(Pid_t, *int, int, *Rusage) Pid_t __asm__ ("wait4")
|
||||
|
||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
|
||||
var status int
|
||||
r := libc_wait4(Pid_t(pid), &status, options, rusage)
|
||||
wpid = int(r)
|
||||
if r < 0 {
|
||||
errno = GetErrno()
|
||||
}
|
||||
if wstatus != nil {
|
||||
*wstatus = WaitStatus(status)
|
||||
}
|
||||
return
|
||||
}
|
22
libgo/syscalls/waitpid.go
Normal file
22
libgo/syscalls/waitpid.go
Normal file
@ -0,0 +1,22 @@
|
||||
// waitpid.go -- Wait4 for systems without wait4, but with waitpid.
|
||||
|
||||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package syscall
|
||||
|
||||
func libc_waitpid(Pid_t, *int, int) Pid_t __asm__ ("waitpid")
|
||||
|
||||
func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
|
||||
var status int
|
||||
r := libc_waitpid(Pid_t(pid), &status, options)
|
||||
wpid = int(r)
|
||||
if r < 0 {
|
||||
errno = GetErrno()
|
||||
}
|
||||
if wstatus != nil {
|
||||
*wstatus = WaitStatus(status)
|
||||
}
|
||||
return
|
||||
}
|
Loading…
Reference in New Issue
Block a user