Source File
fd_unix.go
Belonging Package
internal/poll
package poll
import (
)
.isBlocking = 1
}
return
}
:= CloseFunc(.Sysfd)
.Sysfd = -1
runtime_Semrelease(&.csema)
return
}
func ( *FD) () error {
if !.fdmu.increfAndClose() {
return errClosing(.isFile)
}
:= .decref()
if .isBlocking == 0 {
runtime_Semacquire(&.csema)
}
return
}
atomic.StoreUint32(&.isBlocking, 1)
return syscall.SetNonblock(.Sysfd, false)
}
const maxRW = 1 << 30
return 0, nil
}
if := .pd.prepareRead(.isFile); != nil {
return 0,
}
if .IsStream && len() > maxRW {
= [:maxRW]
}
for {
, := ignoringEINTRIO(syscall.Read, .Sysfd, )
if != nil {
= 0
if == syscall.EAGAIN && .pd.pollable() {
if = .pd.waitRead(.isFile); == nil {
continue
}
}
}
= .eofError(, )
return ,
}
}
func ( *FD) ( []byte) (int, syscall.Sockaddr, error) {
if := .readLock(); != nil {
return 0, nil,
}
defer .readUnlock()
if := .pd.prepareRead(.isFile); != nil {
return 0, nil,
}
for {
, , := syscall.Recvfrom(.Sysfd, , 0)
if != nil {
if == syscall.EINTR {
continue
}
= 0
if == syscall.EAGAIN && .pd.pollable() {
if = .pd.waitRead(.isFile); == nil {
continue
}
}
}
= .eofError(, )
return , ,
}
}
func ( *FD) ( []byte) (int, error) {
if := .writeLock(); != nil {
return 0,
}
defer .writeUnlock()
if := .pd.prepareWrite(.isFile); != nil {
return 0,
}
var int
for {
:= len()
if .IsStream && - > maxRW {
= + maxRW
}
, := ignoringEINTRIO(syscall.Write, .Sysfd, [:])
if > 0 {
+=
}
if == len() {
return ,
}
if == syscall.EAGAIN && .pd.pollable() {
if = .pd.waitWrite(.isFile); == nil {
continue
}
}
if != nil {
return ,
}
if == 0 {
return , io.ErrUnexpectedEOF
}
}
}
func ( *FD) ( []byte, syscall.Sockaddr) (int, error) {
if := .writeLock(); != nil {
return 0,
}
defer .writeUnlock()
if := .pd.prepareWrite(.isFile); != nil {
return 0,
}
for {
:= syscall.Sendto(.Sysfd, , 0, )
if == syscall.EINTR {
continue
}
if == syscall.EAGAIN && .pd.pollable() {
if = .pd.waitWrite(.isFile); == nil {
continue
}
}
if != nil {
return 0,
}
return len(), nil
}
}
func ( *FD) ( []byte, []byte, syscall.Sockaddr) (int, int, error) {
if := .writeLock(); != nil {
return 0, 0,
}
defer .writeUnlock()
if := .pd.prepareWrite(.isFile); != nil {
return 0, 0,
}
for {
, := syscall.SendmsgN(.Sysfd, , , , 0)
if == syscall.EINTR {
continue
}
if == syscall.EAGAIN && .pd.pollable() {
if = .pd.waitWrite(.isFile); == nil {
continue
}
}
if != nil {
return , 0,
}
return , len(),
}
}
func ( *FD) () (int, syscall.Sockaddr, string, error) {
if := .readLock(); != nil {
return -1, nil, "",
}
defer .readUnlock()
if := .pd.prepareRead(.isFile); != nil {
return -1, nil, "",
}
for {
, , , := accept(.Sysfd)
if == nil {
return , , "",
}
switch {
case syscall.EINTR:
continue
case syscall.EAGAIN:
if .pd.pollable() {
if = .pd.waitRead(.isFile); == nil {
continue
}
}
continue
}
return -1, nil, ,
}
}
return ,
}
}
var tryDupCloexec = int32(1)
atomic.StoreInt32(&tryDupCloexec, 0)
default:
return -1, "fcntl",
}
}
return dupCloseOnExecOld()
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin 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. |