]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: add Dup3 on Linux
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Aug 2013 06:38:53 +0000 (23:38 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Aug 2013 06:38:53 +0000 (23:38 -0700)
With dup3, we can avoid an extra system call on some machines
while holding syscall.ForkLock. Currently we have to
syscall.Dup + syscall.CloseOnExec.

On machines with Linux and a new enough kernel, this can just
be dup3.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/12170045

src/pkg/syscall/syscall_linux.go
src/pkg/syscall/zsyscall_linux_386.go
src/pkg/syscall/zsyscall_linux_amd64.go
src/pkg/syscall/zsyscall_linux_arm.go

index b6d728e9f733f910a95f6286b432d95373de4edc..79c1fda68d466bf4d7bc7cb100480cdd5727e1ca 100644 (file)
@@ -778,6 +778,7 @@ func Mount(source string, target string, fstype string, flags uintptr, data stri
 //sys  Creat(path string, mode uint32) (fd int, err error)
 //sysnb        Dup(oldfd int) (fd int, err error)
 //sysnb        Dup2(oldfd int, newfd int) (err error)
+//sysnb        Dup3(oldfd int, newfd int, flags int) (err error)
 //sysnb        EpollCreate(size int) (fd int, err error)
 //sysnb        EpollCreate1(flag int) (fd int, err error)
 //sysnb        EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)
index 810cba00425df52e690182b00c1a454e85f8a28a..6eeb11828c3630005a898e5d4f29b3deb37353a7 100644 (file)
@@ -310,6 +310,16 @@ func Dup2(oldfd int, newfd int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Dup3(oldfd int, newfd int, flags int) (err error) {
+       _, _, e1 := RawSyscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))
+       if e1 != 0 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func EpollCreate(size int) (fd int, err error) {
        r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)
        fd = int(r0)
index 9978b81383d158120a454b389c6a520e9c418f7d..c1c3d45111c092216d9f2e4c7727ce7339d9f078 100644 (file)
@@ -310,6 +310,16 @@ func Dup2(oldfd int, newfd int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Dup3(oldfd int, newfd int, flags int) (err error) {
+       _, _, e1 := RawSyscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))
+       if e1 != 0 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func EpollCreate(size int) (fd int, err error) {
        r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)
        fd = int(r0)
index 80d3f9b39deda44ade85f8e1769d88b4ac53ffe3..3380714a65eeba3d52c03998a421953e47eb83a4 100644 (file)
@@ -310,6 +310,16 @@ func Dup2(oldfd int, newfd int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Dup3(oldfd int, newfd int, flags int) (err error) {
+       _, _, e1 := RawSyscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))
+       if e1 != 0 {
+               err = e1
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func EpollCreate(size int) (fd int, err error) {
        r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)
        fd = int(r0)