package poll
import (
"errors"
"sync"
"syscall"
"time"
_ "unsafe"
)
func runtimeNano () int64
func runtime_pollServerInit ()
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 )
func runtime_pollReset (ctx uintptr , mode int ) int
func runtime_pollSetDeadline (ctx uintptr , d int64 , mode int )
func runtime_pollUnblock (ctx uintptr )
func runtime_isPollServerDescriptor (fd uintptr ) bool
type pollDesc struct {
runtimeCtx uintptr
}
var serverInit sync .Once
func (pd *pollDesc ) init (fd *FD ) error {
serverInit .Do (runtime_pollServerInit )
ctx , errno := runtime_pollOpen (uintptr (fd .Sysfd ))
if errno != 0 {
return errnoErr (syscall .Errno (errno ))
}
pd .runtimeCtx = ctx
return nil
}
func (pd *pollDesc ) close () {
if pd .runtimeCtx == 0 {
return
}
runtime_pollClose (pd .runtimeCtx )
pd .runtimeCtx = 0
}
func (pd *pollDesc ) evict () {
if pd .runtimeCtx == 0 {
return
}
runtime_pollUnblock (pd .runtimeCtx )
}
func (pd *pollDesc ) prepare (mode int , isFile bool ) error {
if pd .runtimeCtx == 0 {
return nil
}
res := runtime_pollReset (pd .runtimeCtx , mode )
return convertErr (res , isFile )
}
func (pd *pollDesc ) prepareRead (isFile bool ) error {
return pd .prepare ('r' , isFile )
}
func (pd *pollDesc ) prepareWrite (isFile bool ) error {
return pd .prepare ('w' , isFile )
}
func (pd *pollDesc ) wait (mode int , isFile bool ) error {
if pd .runtimeCtx == 0 {
return errors .New ("waiting for unsupported file type" )
}
res := runtime_pollWait (pd .runtimeCtx , mode )
return convertErr (res , isFile )
}
func (pd *pollDesc ) waitRead (isFile bool ) error {
return pd .wait ('r' , isFile )
}
func (pd *pollDesc ) waitWrite (isFile bool ) error {
return pd .wait ('w' , isFile )
}
func (pd *pollDesc ) waitCanceled (mode int ) {
if pd .runtimeCtx == 0 {
return
}
runtime_pollWaitCanceled (pd .runtimeCtx , mode )
}
func (pd *pollDesc ) pollable () bool {
return pd .runtimeCtx != 0
}
const (
pollNoError = 0
pollErrClosing = 1
pollErrTimeout = 2
pollErrNotPollable = 3
)
func convertErr (res int , isFile bool ) error {
switch res {
case pollNoError :
return nil
case pollErrClosing :
return errClosing (isFile )
case pollErrTimeout :
return ErrDeadlineExceeded
case pollErrNotPollable :
return ErrNotPollable
}
println ("unreachable: " , res )
panic ("unreachable" )
}
func (fd *FD ) SetDeadline (t time .Time ) error {
return setDeadlineImpl (fd , t , 'r' +'w' )
}
func (fd *FD ) SetReadDeadline (t time .Time ) error {
return setDeadlineImpl (fd , t , 'r' )
}
func (fd *FD ) SetWriteDeadline (t time .Time ) error {
return setDeadlineImpl (fd , t , 'w' )
}
func setDeadlineImpl (fd *FD , t time .Time , mode int ) error {
var d int64
if !t .IsZero () {
d = int64 (time .Until (t ))
if d == 0 {
d = -1
}
}
if err := fd .incref (); err != nil {
return err
}
defer fd .decref ()
if fd .pd .runtimeCtx == 0 {
return ErrNoDeadline
}
runtime_pollSetDeadline (fd .pd .runtimeCtx , d , mode )
return nil
}
func IsPollDescriptor (fd uintptr ) bool {
return runtime_isPollServerDescriptor (fd )
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .