github.com/vbatts/containerd@v0.2.5/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  }