public bool Add(int fd, EpollEvents flags) { var ev = new EpollEvent() { events = flags, u32 = (uint)fd }; Log.Epoll("[{0}] EPOLL_CTL_ADD({1})", fd, flags); var r = Syscall.epoll_ctl(epfd, EpollOp.EPOLL_CTL_ADD, fd, ref ev); if (r != 0) { Log.Error($"Call to epoll_ctl(ADD) failed with code {r}: {Stdlib.GetLastError()}"); return(false); } return(true); }
// busy wait private void ioLoop(object threadObj) { try { int MAX_EVENTS = 256; EpollEvent[] events = new EpollEvent[MAX_EVENTS]; while (true) { listener.PollOnce(events, timeoutMode); } } catch (Exception e) { Log.Error(e.Message); Log.Error(e.StackTrace); } }
// blocked on postQueue private void mainLoop(object threadObj) { try { int MAX_EVENTS = 256; EpollEvent[] events = new EpollEvent[MAX_EVENTS]; while (true) { listener.PollOnce(events, timeoutMode * (-100)); while (postQueue.TryDequeue(out var action)) { action.Invoke(); } router.Tick(); } } catch (Exception e) { Log.Error(e.Message); Log.Error(e.StackTrace); } }
private void RunHandlers(EpollEvent [] new_events, int num_events) { for (int i = 0; i < num_events; i++) { events.Enqueue (new_events [i]); } while (events.Count > 0) { var e = events.Dequeue (); RunHandler (e.fd, e.events); } }
public int WaitOnInterrupt(int pollFd) { var eventObject = new EpollEvent[1]; return(Syscall.epoll_wait(pollFd, eventObject, 1, -1)); }
public int WaitOnInterrupt(int pollFd) { var eventObject = new EpollEvent[1]; return Syscall.epoll_wait(pollFd, eventObject, 1, -1); }
public void Start() { running = true; EpollEvent [] new_events = new EpollEvent [MAX_EVENTS]; while (true) { int timeout = 5000; transactions.Clear (); RunCallbacks (); if (callbacks.Count > 0) timeout = 0; RunTimeouts (); if (timeouts.Count > 0 ) { int milli = (int) ((timeouts [0].expires - DateTime.UtcNow).TotalMilliseconds + 0.5); timeout = Math.Min ((int) milli, timeout); } if (!running) break; int num_events = Syscall.epoll_wait (epfd, new_events, MAX_EVENTS, timeout); if (num_events == -1) throw new Exception ("Something catastrophic happened."); RunHandlers (new_events, num_events); RunTransactions (); } running = false; }
private static int sys_epoll_wait (int epfd, EpollEvent [] ee, int maxevents, int timeout) { throw new System.NotImplementedException(); }
private static int sys_epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee) { throw new System.NotImplementedException(); }
public void MainLoop() { // Init socket // var socketFileDescriptorFlags = Check(Fcntl(UdpSocket, F_GETFL, 0)); // Check(Fcntl(socketFileDescriptor, F_SETFL, socketFileDescriptorFlags | O_NONBLOCK)); _logger.LogInformation("Start listening on {bindAddress}:{bindPort}", ListenEndPoint.Address, ListenEndPoint.Port); // Register to server Register(); // Create epoll const int maxEvents = 64; using var epollFileDescriptor = EpollCreate(); // Add tun to epoll var tunEpollEvent = new EpollEvent(); tunEpollEvent.events = EpollEvents.EPOLLIN | EpollEvents.EPOLLOUT; tunEpollEvent.fd = (int)Tun.TunFileDescriptor.DangerousGetHandle().ToInt64(); Check(EpollCtl(epollFileDescriptor, EPOLL_CTL_ADD, Tun.TunFileDescriptor, ref tunEpollEvent)); // Add UDP socket to epoll var socketEpollEvent = new EpollEvent(); socketEpollEvent.events = EpollEvents.EPOLLIN | EpollEvents.EPOLLOUT; tunEpollEvent.fd = (int)UdpSocket.SocketFileDescriptor.DangerousGetHandle().ToInt64(); Check(EpollCtl(epollFileDescriptor, EPOLL_CTL_ADD, UdpSocket.SocketFileDescriptor, ref socketEpollEvent)); // main loop Message message; IPEndPoint remote; TunFrame tunFrame; var epollReceivedEvents = new EpollEvent[maxEvents]; while (true) { var epollWaitRet = Check(EpollWait(epollFileDescriptor, epollReceivedEvents, maxEvents, -1)); for (var i = 0; i < epollWaitRet; i++) { var fd = epollReceivedEvents[i].fd; if (epollReceivedEvents[i].events == EpollEvents.EPOLLIN) { if (fd == Tun.TunFileDescriptor) { var data = Tun.Read(BufferSize); TunnelSendQueue.Enqueue(new TunFrame(data)); } else if (fd == UdpSocket.SocketFileDescriptor) { var data = UdpSocket.Recv(BufferSize, out remote); message = DeserializeMessage(data); ListenDispatch(message, remote); } else { throw new AliceException("Unexpected file descriptor"); } } else if (epollReceivedEvents[i].events == EpollEvents.EPOLLOUT) { if (fd == Tun.TunFileDescriptor) { if (TunnelReceiveQueue.TryDequeue(out tunFrame)) { Tun.Write(tunFrame.FrameData); } } else if (fd == UdpSocket.SocketFileDescriptor) { if (TunnelSendQueue.TryDequeue(out tunFrame)) { SendTunnel(tunFrame); } } } } } }
private static int sys_epoll_ctl(int epfd, EpollOp op, int fd, ref EpollEvent ee) { throw new System.NotImplementedException(); }
private static extern int sys_epoll_ctl (int epfd, EpollOp op, int fd, ref EpollEvent ee);