// Copyright 2013 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. //go:build js && wasm package poll import ( "syscall" "time" ) type pollDesc struct { fd *FD closing bool } func (pd *pollDesc) init(fd *FD) error { pd.fd = fd; return nil } func (pd *pollDesc) close() {} func (pd *pollDesc) evict() { pd.closing = true if pd.fd != nil { syscall.StopIO(pd.fd.Sysfd) } } func (pd *pollDesc) prepare(mode int, isFile bool) error { if pd.closing { return errClosing(isFile) } return nil } 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.closing { return errClosing(isFile) } if isFile { // TODO(neelance): js/wasm: Use callbacks from JS to block until the read/write finished. return nil } return ErrDeadlineExceeded } 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) {} func (pd *pollDesc) pollable() bool { return true } // SetDeadline sets the read and write deadlines associated with fd. func (fd *FD) SetDeadline(t time.Time) error { return setDeadlineImpl(fd, t, 'r'+'w') } // SetReadDeadline sets the read deadline associated with fd. func (fd *FD) SetReadDeadline(t time.Time) error { return setDeadlineImpl(fd, t, 'r') } // SetWriteDeadline sets the write deadline associated with fd. func (fd *FD) SetWriteDeadline(t time.Time) error { return setDeadlineImpl(fd, t, 'w') } func setDeadlineImpl(fd *FD, t time.Time, mode int) error { d := t.UnixNano() if t.IsZero() { d = 0 } if err := fd.incref(); err != nil { return err } switch mode { case 'r': syscall.SetReadDeadline(fd.Sysfd, d) case 'w': syscall.SetWriteDeadline(fd.Sysfd, d) case 'r' + 'w': syscall.SetReadDeadline(fd.Sysfd, d) syscall.SetWriteDeadline(fd.Sysfd, d) } fd.decref() return nil } // IsPollDescriptor reports whether fd is the descriptor being used by the poller. // This is only used for testing. func IsPollDescriptor(fd uintptr) bool { return false }