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