This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[libgo] Replace wait4 by waitpid (PR go/47515)


Currently, libgo uses wait4 unconditionally, which is missing on IRIX
6.5.  Fortunately, the rusage * arg is used nowhere, so I've decide to
replace wait4 by waitpid, which seems to be considerably more portable.

The following patch does this.  Together with the IRIX 6 infrastructure
patch (to be reposted separately once I've figured out why sockets don't
work yet) and a strerror_r patch (to be posted shortly), this allowed
the go and libgo testsuites to run on IRIX 6.5.  Besides, I've included
it in a i386-pc-solaris2.11 bootstrap to make sure that it works on
other systems, too.

	Rainer


2011-01-30  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR go/47515
	* syscalls/exec.go (libc_wait4): Replace by libc_waitpid.
	(forkExec): Call Waitpid instead of Wait4.
	(Wait4): Renamed to Waitpid.
	Call libc_waitpid instead of libc_wait4.
	* syscalls/exec_stubs.go (Wait4): Renamed to Waitpid.
	* go/os/exec.go: Remove reference to Rusage.
	(Waitmsg): Remove Rusage member.
	Remove WRUSAGE option.
	* go/os/exec_unix.go (Wait): Remove rusage.
	Call Waitpid instead of Wait4.
	* mksysinfo.sh: Remove Rusage.
	* Makefile.am: Refer to waitpid instead of wait4.
	* go/debug/proc/proc_linux.go: Likewise.
	* Makefile.in: Regenerate.

diff -r 4fb11b32a76a libgo/Makefile.am
--- a/libgo/Makefile.am	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/Makefile.am	Sat Mar 19 21:55:54 2011 +0100
@@ -1,6 +1,6 @@
 # Makefile.am -- Go library Makefile.
 
-# Copyright 2009 The Go Authors. All rights reserved.
+# Copyright 2009, 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.
 
@@ -1206,7 +1210,7 @@
 endif # !LIBGO_IS_LINUX
 
 
-# Define ForkExec, PtraceForkExec, Exec, and Wait4.
+# Define ForkExec, PtraceForkExec, Exec, and Waitpid.
 if LIBGO_IS_RTEMS
 syscall_exec_os_file = syscalls/exec_stubs.go
 else
diff -r 4fb11b32a76a libgo/go/debug/proc/proc_linux.go
--- a/libgo/go/debug/proc/proc_linux.go	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/go/debug/proc/proc_linux.go	Sat Mar 19 21:55:54 2011 +0100
@@ -1,4 +1,4 @@
-// Copyright 2009 The Go Authors.  All rights reserved.
+// Copyright 2009, 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.
 
@@ -22,7 +22,7 @@
 // Linux's ptrace(2) interface.  The implementation is multi-threaded.
 // Each attached process has an associated monitor thread, and each
 // running attached thread has an associated "wait" thread.  The wait
-// thread calls wait4 on the thread's TID and reports any wait events
+// thread calls waitpid on the thread's TID and reports any wait events
 // or errors via "debug events".  The monitor thread consumes these
 // wait events and updates the internally maintained state of each
 // thread.  All ptrace calls must run in the monitor thread, so the
diff -r 4fb11b32a76a libgo/go/os/exec.go
--- a/libgo/go/os/exec.go	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/go/os/exec.go	Sat Mar 19 21:55:54 2011 +0100
@@ -1,4 +1,4 @@
-// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2009, 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.
 
@@ -65,16 +65,11 @@
 
 // TODO(rsc): Should os implement its own syscall.WaitStatus
 // wrapper with the methods, or is exposing the underlying one enough?
-//
-// TODO(rsc): Certainly need to have Rusage struct,
-// since syscall one might have different field types across
-// different OS.
 
 // Waitmsg stores the information about an exited process as reported by Wait.
 type Waitmsg struct {
 	Pid                int             // The process's id.
 	syscall.WaitStatus                 // System-dependent status info.
-	Rusage             *syscall.Rusage // System-dependent resource usage info.
 }
 
 // Wait waits for process pid to exit or stop, and then returns a
diff -r 4fb11b32a76a libgo/go/os/exec_unix.go
--- a/libgo/go/os/exec_unix.go	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/go/os/exec_unix.go	Sat Mar 19 21:55:54 2011 +0100
@@ -1,4 +1,4 @@
-// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2009, 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.
 
@@ -14,13 +14,8 @@
 	WNOHANG   = syscall.WNOHANG   // Don't wait if no process has exited.
 	WSTOPPED  = syscall.WSTOPPED  // If set, status of stopped subprocesses is also reported.
 	WUNTRACED = syscall.WUNTRACED // Usually an alias for WSTOPPED.
-	WRUSAGE   = 1 << 20           // Record resource usage.
 )
 
-// WRUSAGE must not be too high a bit, to avoid clashing with Linux's
-// WCLONE, WALL, and WNOTHREAD flags, which sit in the top few bits of
-// the options
-
 // Wait waits for the Process to exit or stop, and then returns a
 // Waitmsg describing its status and an Error, if any. The options
 // (WNOHANG etc.) affect the behavior of the Wait call.
@@ -29,19 +24,13 @@
 		return nil, EINVAL
 	}
 	var status syscall.WaitStatus
-	var rusage *syscall.Rusage
-	if options&WRUSAGE != 0 {
-		rusage = new(syscall.Rusage)
-		options ^= WRUSAGE
-	}
-	pid1, e := syscall.Wait4(p.Pid, &status, options, rusage)
+	pid1, e := syscall.Waitpid(p.Pid, &status, options)
 	if e != 0 {
 		return nil, NewSyscallError("wait", e)
 	}
 	w = new(Waitmsg)
 	w.Pid = pid1
 	w.WaitStatus = status
-	w.Rusage = rusage
 	return w, nil
 }
 
diff -r 4fb11b32a76a libgo/mksysinfo.sh
--- a/libgo/mksysinfo.sh	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/mksysinfo.sh	Sat Mar 19 21:55:54 2011 +0100
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright 2009 The Go Authors. All rights reserved.
+# Copyright 2009, 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.
 
@@ -355,30 +372,6 @@
       >> ${OUT}
 echo "type DIR _DIR" >> ${OUT}
 
-# The rusage struct.
-rusage=`grep '^type _rusage struct' gen-sysinfo.go`
-if test "$rusage" != ""; then
-  rusage=`echo $rusage | sed -e 's/type _rusage struct //' -e 's/[{}]//g'`
-  rusage=`echo $rusage | sed -e 's/^ *//'`
-  nrusage=
-  while test -n "$rusage"; do
-    field=`echo $rusage | sed -e 's/^\([^;]*\);.*$/\1/'`
-    rusage=`echo $rusage | sed -e 's/^[^;]*; *\(.*\)$/\1/'`
-    # Drop the leading ru_, capitalize the next character.
-    field=`echo $field | sed -e 's/^ru_//'`
-    f=`echo $field | sed -e 's/^\(.\).*$/\1/'`
-    r=`echo $field | sed -e 's/^.\(.*\)$/\1/'`
-    f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-    # Fix _timeval _timespec, and _timestruc_t.
-    r=`echo $r | sed -e s'/ _timeval$/ Timeval/'`
-    r=`echo $r | sed -e s'/ _timespec$/ Timespec/'`
-    r=`echo $r | sed -e s'/ _timestruc_t$/ Timestruc/'`
-    field="$f$r"
-    nrusage="$nrusage $field;"
-  done
-  echo "type Rusage struct {$nrusage }" >> ${OUT}
-fi
-
 # The utsname struct.
 grep '^type _utsname ' gen-sysinfo.go | \
     sed -e 's/_utsname/Utsname/' \
diff -r 4fb11b32a76a libgo/syscalls/exec.go
--- a/libgo/syscalls/exec.go	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/syscalls/exec.go	Sat Mar 19 21:55:54 2011 +0100
@@ -1,6 +1,6 @@
 // exec.go -- fork/exec syscall support.
 
-// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2009, 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.
 
@@ -16,7 +16,7 @@
 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")
+func libc_waitpid(Pid_t, *int, int) Pid_t __asm__ ("waitpid")
 
 // 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.
@@ -204,9 +204,9 @@
 
 		// Child failed; wait for it to exit, to make sure
 		// the zombies don't accumulate.
-		_, err1 := Wait4(pid, &wstatus, 0, nil)
+		_, err1 := Waitpid(pid, &wstatus, 0)
 		for err1 == EINTR {
-			_, err1 = Wait4(pid, &wstatus, 0, nil)
+			_, err1 = Waitpid(pid, &wstatus, 0)
 		}
 		return 0, err
 	}
@@ -239,9 +239,9 @@
 	return pid, 0, err
 }
 
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
+func Waitpid(pid int, wstatus *WaitStatus, options int) (wpid int, errno int) {
 	var status int
-	r := libc_wait4(Pid_t(pid), &status, options, rusage)
+	r := libc_waitpid(Pid_t(pid), &status, options)
 	wpid = int(r)
 	if r < 0 {
 		errno = GetErrno()
diff -r 4fb11b32a76a libgo/syscalls/exec_stubs.go
--- a/libgo/syscalls/exec_stubs.go	Sat Mar 19 10:51:23 2011 +0100
+++ b/libgo/syscalls/exec_stubs.go	Sat Mar 19 21:55:54 2011 +0100
@@ -1,6 +1,6 @@
 // exec_stubs.go -- fork/exec stubs.
 
-// Copyright 2010 The Go Authors. All rights reserved.
+// Copyright 2010, 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.
 
@@ -20,6 +20,6 @@
 	return ENOSYS;
 }
 
-func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, errno int) {
+func Waitpid(pid int, wstatus *WaitStatus, options int) (wpid int, errno int) {
 	return -1, ENOSYS;
 }


-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]