Tizen_4.0 base
[platform/upstream/docker-engine.git] / vendor / github.com / containerd / containerd / archutils / epoll_arm64.go
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 }