lc.Listen(context.Background(), network, address)--> sl.listenTCP(ctx, la)--> fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)--> socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr, ctrlFn)--> sysSocket(family, sotype, proto) // syscall.Socket and return fd fd, err = newFD(s, family, sotype, net) // fd.pfd.sysfd = sysfd(socket fd) fd.listenStream(laddr, listenerBacklog(), ctrlFn)--> syscall.Bind(fd.pfd.Sysfd, lsa) // bind socket with address listenFunc() // syscall.Listen fd.init()--> runtime_pollServerInit()--> // fd_poll_runtime.go poll_runtime_pollServerInit()--> // netpoll.go netpollGenericInit()--> netpollinit()--> // netpoll_epoll.go epollcreate1() epollctl(epfd, _EPOLL_CTL_ADD, r, &ev) runtime_po"> lc.Listen(context.Background(), network, address)--> sl.listenTCP(ctx, la)--> fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)--> socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr, ctrlFn)--> sysSocket(family, sotype, proto) // syscall.Socket and return fd fd, err = newFD(s, family, sotype, net) // fd.pfd.sysfd = sysfd(socket fd) fd.listenStream(laddr, listenerBacklog(), ctrlFn)--> syscall.Bind(fd.pfd.Sysfd, lsa) // bind socket with address listenFunc() // syscall.Listen fd.init()--> runtime_pollServerInit()--> // fd_poll_runtime.go poll_runtime_pollServerInit()--> // netpoll.go netpollGenericInit()--> netpollinit()--> // netpoll_epoll.go epollcreate1() epollctl(epfd, _EPOLL_CTL_ADD, r, &ev) runtime_po"> lc.Listen(context.Background(), network, address)--> sl.listenTCP(ctx, la)--> fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)--> socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr, ctrlFn)--> sysSocket(family, sotype, proto) // syscall.Socket and return fd fd, err = newFD(s, family, sotype, net) // fd.pfd.sysfd = sysfd(socket fd) fd.listenStream(laddr, listenerBacklog(), ctrlFn)--> syscall.Bind(fd.pfd.Sysfd, lsa) // bind socket with address listenFunc() // syscall.Listen fd.init()--> runtime_pollServerInit()--> // fd_poll_runtime.go poll_runtime_pollServerInit()--> // netpoll.go netpollGenericInit()--> netpollinit()--> // netpoll_epoll.go epollcreate1() epollctl(epfd, _EPOLL_CTL_ADD, r, &ev) runtime_po">
http.ListenAndServe()-->
server.ListenAndServe()-->
net.Listen("tcp", addr)-->
lc.Listen(context.Background(), network, address)-->
sl.listenTCP(ctx, la)-->
fd, err := internetSocket(ctx, sl.network, laddr, nil, syscall.SOCK_STREAM, 0, "listen", sl.ListenConfig.Control)-->
socket(ctx, net, family, sotype, proto, ipv6only, laddr, raddr, ctrlFn)-->
sysSocket(family, sotype, proto) // **syscall.Socket** and return fd
fd, err = newFD(s, family, sotype, net) // fd.pfd.sysfd = sysfd(socket fd)
fd.listenStream(laddr, listenerBacklog(), ctrlFn)-->
**syscall.Bind**(fd.pfd.Sysfd, lsa) // bind socket with address
listenFunc() // **syscall.Listen**
fd.init()-->
runtime_pollServerInit()--> // fd_poll_runtime.go
poll_runtime_pollServerInit()--> // netpoll.go
netpollGenericInit()-->
netpollinit()--> // netpoll_epoll.go
epollcreate1()
**epollctl(epfd, _EPOLL_CTL_ADD, r, &ev)**
runtime_pollOpen()-->
poll_runtime_pollOpen()--> // netpoll.go
netpollopen()--> // netpoll_epoll.go
var ev epollevent
ev.events = _EPOLLIN | _EPOLLOUT | _EPOLLRDHUP | _EPOLLET
*(**pollDesc)(unsafe.Pointer(&ev.data)) = pd
return -**epollctl(epfd, _EPOLL_CTL_ADD, int32(fd), &ev)**
srv.Serve(ln)-->
l.Accept()--> // tcpsocket.go
l.accept()--> // return TCPConn which holds the connection fd
fd := ln.fd.accept()-->
fd.pfd.Accept()--> // fd_unix.go **syscall.Accept4**
if err == nil {
return s, rsa, "", err
}
switch err {
case syscall.EAGAIN:
if fd.pd.pollable() {
fd.pd.waitRead()-->
runtime_pollWait()-->poll_runtime_pollWait()-->netpollblock()-->
atomic.Casuintptr(gpp, 0, pdWait)
**gopark**(netpollblockcommit, unsafe.Pointer(gpp), waitReasonIOWait, traceEvGoBlockNet, 5)-->
mcall(park_m) // put the go routine to park, schedule->findrunnable will wake it up
}
go c.serve(connCtx)-->c.readRequest(ctx)-->
req, err := readRequest(c.bufr, keepHostHeader)-->tp.ReadLine()-->r.readLineSlice()-->r.R.ReadLine()-->b.fill()-->
b.rd.Read(b.buf[b.w:])--> // fd_unix.go Read implements io.Reader.
ignoringEINTRIO(syscall.Read, fd.Sysfd, p) // syscall.Read
// shedule parked go routine
schedule()-->**findrunnable**()-->
list := netpoll(0)--> //proc.go
n := epollwait(epfd, &events[0], int32(len(events)), waitms)
for i := int32(0); i < n; i++ {
netpollready(&toRun, pd, mode)-->
rg = netpollunblock(pd, 'r', true) // find related go routine of the epoll fd
toRun.push(rg)
}
startIdle(n)-->startm