github.com/docker/containerd@v0.2.9-0.20170509230648-8ef7df579710/archutils/epoll_arm64.go (about) 1 // +build linux,arm64 2 3 package archutils 4 5 // #include <sys/epoll.h> 6 /* 7 int EpollCreate1(int flag) { 8 return epoll_create1(flag); 9 } 10 11 int EpollCtl(int efd, int op,int sfd, int events, int fd) { 12 struct epoll_event event; 13 event.events = events; 14 event.data.fd = fd; 15 16 return epoll_ctl(efd, op, sfd, &event); 17 } 18 19 struct event_t { 20 uint32_t events; 21 int fd; 22 }; 23 24 struct epoll_event events[128]; 25 int run_epoll_wait(int fd, struct event_t *event) { 26 int n, i; 27 n = epoll_wait(fd, events, 128, -1); 28 for (i = 0; i < n; i++) { 29 event[i].events = events[i].events; 30 event[i].fd = events[i].data.fd; 31 } 32 return n; 33 } 34 */ 35 import "C" 36 37 import ( 38 "fmt" 39 "syscall" 40 "unsafe" 41 ) 42 43 // EpollCreate1 calls a C implementation 44 func EpollCreate1(flag int) (int, error) { 45 fd := int(C.EpollCreate1(C.int(flag))) 46 if fd < 0 { 47 return fd, fmt.Errorf("failed to create epoll, errno is %d", fd) 48 } 49 return fd, nil 50 } 51 52 // EpollCtl calls a C implementation 53 func EpollCtl(epfd int, op int, fd int, event *syscall.EpollEvent) error { 54 errno := C.EpollCtl(C.int(epfd), C.int(syscall.EPOLL_CTL_ADD), C.int(fd), C.int(event.Events), C.int(event.Fd)) 55 if errno < 0 { 56 return fmt.Errorf("Failed to ctl epoll") 57 } 58 return nil 59 } 60 61 // EpollWait calls a C implementation 62 func EpollWait(epfd int, events []syscall.EpollEvent, msec int) (int, error) { 63 var c_events [128]C.struct_event_t 64 n := int(C.run_epoll_wait(C.int(epfd), (*C.struct_event_t)(unsafe.Pointer(&c_events)))) 65 if n < 0 { 66 return int(n), fmt.Errorf("Failed to wait epoll") 67 } 68 for i := 0; i < n; i++ { 69 events[i].Fd = int32(c_events[i].fd) 70 events[i].Events = uint32(c_events[i].events) 71 } 72 return int(n), nil 73 }