123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- package fsnotify
- import (
- "errors"
- "syscall"
- )
- type fdPoller struct {
- fd int
- epfd int
- pipe [2]int
- }
- func emptyPoller(fd int) *fdPoller {
- poller := new(fdPoller)
- poller.fd = fd
- poller.epfd = -1
- poller.pipe[0] = -1
- poller.pipe[1] = -1
- return poller
- }
- func newFdPoller(fd int) (*fdPoller, error) {
- var errno error
- poller := emptyPoller(fd)
- defer func() {
- if errno != nil {
- poller.close()
- }
- }()
- poller.fd = fd
-
- poller.epfd, errno = syscall.EpollCreate(1)
- if poller.epfd == -1 {
- return nil, errno
- }
-
- errno = syscall.Pipe2(poller.pipe[:], syscall.O_NONBLOCK)
- if errno != nil {
- return nil, errno
- }
-
- event := syscall.EpollEvent{
- Fd: int32(poller.fd),
- Events: syscall.EPOLLIN,
- }
- errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.fd, &event)
- if errno != nil {
- return nil, errno
- }
-
- event = syscall.EpollEvent{
- Fd: int32(poller.pipe[0]),
- Events: syscall.EPOLLIN,
- }
- errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.pipe[0], &event)
- if errno != nil {
- return nil, errno
- }
- return poller, nil
- }
- func (poller *fdPoller) wait() (bool, error) {
-
-
-
-
- events := make([]syscall.EpollEvent, 7)
- for {
- n, errno := syscall.EpollWait(poller.epfd, events, -1)
- if n == -1 {
- if errno == syscall.EINTR {
- continue
- }
- return false, errno
- }
- if n == 0 {
-
- continue
- }
- if n > 6 {
-
- return false, errors.New("epoll_wait returned more events than I know what to do with")
- }
- ready := events[:n]
- epollhup := false
- epollerr := false
- epollin := false
- for _, event := range ready {
- if event.Fd == int32(poller.fd) {
- if event.Events&syscall.EPOLLHUP != 0 {
-
- epollhup = true
- }
- if event.Events&syscall.EPOLLERR != 0 {
-
-
- epollerr = true
- }
- if event.Events&syscall.EPOLLIN != 0 {
-
- epollin = true
- }
- }
- if event.Fd == int32(poller.pipe[0]) {
- if event.Events&syscall.EPOLLHUP != 0 {
-
-
- }
- if event.Events&syscall.EPOLLERR != 0 {
-
-
- return false, errors.New("Error on the pipe descriptor.")
- }
- if event.Events&syscall.EPOLLIN != 0 {
-
- err := poller.clearWake()
- if err != nil {
- return false, err
- }
- }
- }
- }
- if epollhup || epollerr || epollin {
- return true, nil
- }
- return false, nil
- }
- }
- func (poller *fdPoller) wake() error {
- buf := make([]byte, 1)
- n, errno := syscall.Write(poller.pipe[1], buf)
- if n == -1 {
- if errno == syscall.EAGAIN {
-
- return nil
- }
- return errno
- }
- return nil
- }
- func (poller *fdPoller) clearWake() error {
-
- buf := make([]byte, 100)
- n, errno := syscall.Read(poller.pipe[0], buf)
- if n == -1 {
- if errno == syscall.EAGAIN {
-
- return nil
- }
- return errno
- }
- return nil
- }
- func (poller *fdPoller) close() {
- if poller.pipe[1] != -1 {
- syscall.Close(poller.pipe[1])
- }
- if poller.pipe[0] != -1 {
- syscall.Close(poller.pipe[0])
- }
- if poller.epfd != -1 {
- syscall.Close(poller.epfd)
- }
- }
|