diff options
Diffstat (limited to 'src/pkg/net/fd_poll_runtime.go')
-rw-r--r-- | src/pkg/net/fd_poll_runtime.go | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/src/pkg/net/fd_poll_runtime.go b/src/pkg/net/fd_poll_runtime.go index e3b4f7e46..e2b276886 100644 --- a/src/pkg/net/fd_poll_runtime.go +++ b/src/pkg/net/fd_poll_runtime.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin linux +// +build darwin dragonfly freebsd linux netbsd openbsd windows package net @@ -13,27 +13,23 @@ import ( ) func runtime_pollServerInit() -func runtime_pollOpen(fd int) (uintptr, int) +func runtime_pollOpen(fd uintptr) (uintptr, int) func runtime_pollClose(ctx uintptr) func runtime_pollWait(ctx uintptr, mode int) int +func runtime_pollWaitCanceled(ctx uintptr, mode int) int func runtime_pollReset(ctx uintptr, mode int) int func runtime_pollSetDeadline(ctx uintptr, d int64, mode int) func runtime_pollUnblock(ctx uintptr) -var canCancelIO = true // used for testing current package - type pollDesc struct { runtimeCtx uintptr } var serverInit sync.Once -func sysInit() { -} - func (pd *pollDesc) Init(fd *netFD) error { serverInit.Do(runtime_pollServerInit) - ctx, errno := runtime_pollOpen(fd.sysfd) + ctx, errno := runtime_pollOpen(uintptr(fd.sysfd)) if errno != 0 { return syscall.Errno(errno) } @@ -42,7 +38,11 @@ func (pd *pollDesc) Init(fd *netFD) error { } func (pd *pollDesc) Close() { + if pd.runtimeCtx == 0 { + return + } runtime_pollClose(pd.runtimeCtx) + pd.runtimeCtx = 0 } func (pd *pollDesc) Lock() { @@ -57,28 +57,49 @@ func (pd *pollDesc) Wakeup() { // Evict evicts fd from the pending list, unblocking any I/O running on fd. // Return value is whether the pollServer should be woken up. func (pd *pollDesc) Evict() bool { + if pd.runtimeCtx == 0 { + return false + } runtime_pollUnblock(pd.runtimeCtx) return false } -func (pd *pollDesc) PrepareRead() error { - res := runtime_pollReset(pd.runtimeCtx, 'r') +func (pd *pollDesc) Prepare(mode int) error { + res := runtime_pollReset(pd.runtimeCtx, mode) return convertErr(res) } +func (pd *pollDesc) PrepareRead() error { + return pd.Prepare('r') +} + func (pd *pollDesc) PrepareWrite() error { - res := runtime_pollReset(pd.runtimeCtx, 'w') + return pd.Prepare('w') +} + +func (pd *pollDesc) Wait(mode int) error { + res := runtime_pollWait(pd.runtimeCtx, mode) return convertErr(res) } func (pd *pollDesc) WaitRead() error { - res := runtime_pollWait(pd.runtimeCtx, 'r') - return convertErr(res) + return pd.Wait('r') } func (pd *pollDesc) WaitWrite() error { - res := runtime_pollWait(pd.runtimeCtx, 'w') - return convertErr(res) + return pd.Wait('w') +} + +func (pd *pollDesc) WaitCanceled(mode int) { + runtime_pollWaitCanceled(pd.runtimeCtx, mode) +} + +func (pd *pollDesc) WaitCanceledRead() { + pd.WaitCanceled('r') +} + +func (pd *pollDesc) WaitCanceledWrite() { + pd.WaitCanceled('w') } func convertErr(res int) error { @@ -90,19 +111,20 @@ func convertErr(res int) error { case 2: return errTimeout } + println("unreachable: ", res) panic("unreachable") } -func setReadDeadline(fd *netFD, t time.Time) error { - return setDeadlineImpl(fd, t, 'r') +func (fd *netFD) setDeadline(t time.Time) error { + return setDeadlineImpl(fd, t, 'r'+'w') } -func setWriteDeadline(fd *netFD, t time.Time) error { - return setDeadlineImpl(fd, t, 'w') +func (fd *netFD) setReadDeadline(t time.Time) error { + return setDeadlineImpl(fd, t, 'r') } -func setDeadline(fd *netFD, t time.Time) error { - return setDeadlineImpl(fd, t, 'r'+'w') +func (fd *netFD) setWriteDeadline(t time.Time) error { + return setDeadlineImpl(fd, t, 'w') } func setDeadlineImpl(fd *netFD, t time.Time, mode int) error { @@ -110,7 +132,7 @@ func setDeadlineImpl(fd *netFD, t time.Time, mode int) error { if t.IsZero() { d = 0 } - if err := fd.incref(false); err != nil { + if err := fd.incref(); err != nil { return err } runtime_pollSetDeadline(fd.pd.runtimeCtx, d, mode) |