Skip to content

Commit

Permalink
runtime: use pipe2 for nonblockingPipe on dragonfly
Browse files Browse the repository at this point in the history
The pipe2 syscall is available since DragonflyBSD 4.2, see
https://www.dragonflybsd.org/release42/

Change-Id: Ifc67c4935cc59bae29be459167e2fa765843ac03
Reviewed-on: https://go-review.googlesource.com/c/go/+/295471
Trust: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
  • Loading branch information
tklauser committed Feb 25, 2021
1 parent 1f7a014 commit ee2a45e
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 10 deletions.
4 changes: 4 additions & 0 deletions src/runtime/defs_dragonfly.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ const (
EFAULT = C.EFAULT
EBUSY = C.EBUSY
EAGAIN = C.EAGAIN
ENOSYS = C.ENOSYS

O_NONBLOCK = C.O_NONBLOCK
O_CLOEXEC = C.O_CLOEXEC

PROT_NONE = C.PROT_NONE
PROT_READ = C.PROT_READ
Expand Down
4 changes: 4 additions & 0 deletions src/runtime/defs_dragonfly_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ const (
_EFAULT = 0xe
_EBUSY = 0x10
_EAGAIN = 0x23
_ENOSYS = 0x4e

_O_NONBLOCK = 0x4
_O_CLOEXEC = 0x20000

_PROT_NONE = 0x0
_PROT_READ = 0x1
Expand Down
4 changes: 2 additions & 2 deletions src/runtime/export_pipe2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build freebsd || linux || netbsd || openbsd || solaris
// +build freebsd linux netbsd openbsd solaris
//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
// +build dragonfly freebsd linux netbsd openbsd solaris

package runtime

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/export_pipe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build aix || darwin || dragonfly
// +build aix darwin dragonfly
//go:build aix || darwin
// +build aix darwin

package runtime

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/nbpipe_pipe.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build aix || darwin || dragonfly
// +build aix darwin dragonfly
//go:build aix || darwin
// +build aix darwin

package runtime

Expand Down
4 changes: 2 additions & 2 deletions src/runtime/nbpipe_pipe2.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build freebsd || linux || netbsd || openbsd || solaris
// +build freebsd linux netbsd openbsd solaris
//go:build dragonfly || freebsd || linux || netbsd || openbsd || solaris
// +build dragonfly freebsd linux netbsd openbsd solaris

package runtime

Expand Down
5 changes: 3 additions & 2 deletions src/runtime/os_dragonfly.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,11 @@ func kqueue() int32

//go:noescape
func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32
func closeonexec(fd int32)
func setNonblock(fd int32)

func pipe() (r, w int32, errno int32)
func pipe2(flags int32) (r, w int32, errno int32)
func closeonexec(fd int32)
func setNonblock(fd int32)

// From DragonFly's <sys/sysctl.h>
const (
Expand Down
18 changes: 18 additions & 0 deletions src/runtime/sys_dragonfly_amd64.s
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,24 @@ pipeok:
MOVL $0, errno+8(FP)
RET

// func pipe2(flags int32) (r, w int32, errno int32)
TEXT runtime·pipe2(SB),NOSPLIT,$0-20
MOVL $0, DI
// dragonfly expects flags as the 2nd argument
MOVL flags+0(FP), SI
MOVL $538, AX
SYSCALL
JCC pipe2ok
MOVL $-1,r+8(FP)
MOVL $-1,w+12(FP)
MOVL AX, errno+16(FP)
RET
pipe2ok:
MOVL AX, r+8(FP)
MOVL DX, w+12(FP)
MOVL $0, errno+16(FP)
RET

TEXT runtime·write1(SB),NOSPLIT,$-8
MOVQ fd+0(FP), DI // arg 1 fd
MOVQ p+8(FP), SI // arg 2 buf
Expand Down

0 comments on commit ee2a45e

Please sign in to comment.