KQueueEventLoop(EventLoopGroup parent, Executor executor, int maxEvents, SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) { super(parent, executor, false, DEFAULT_MAX_PENDING_TASKS, rejectedExecutionHandler); selectStrategy = ObjectUtil.checkNotNull(strategy, "strategy"); this.kqueueFd = Native.newKQueue(); if (maxEvents == 0) { allowGrowing = true; maxEvents = 4096; } else { allowGrowing = false; } changeList = new KQueueEventArray(maxEvents); eventList = new KQueueEventArray(maxEvents); int result = Native.keventAddUserEvent(kqueueFd.intValue(), KQUEUE_WAKE_UP_IDENT); if (result < 0) { cleanup(); throw new IllegalStateException("kevent failed to add user event with errno: " + (-result)); } }
static int keventWait(int kqueueFd, KQueueEventArray changeList, KQueueEventArray eventList, int tvSec, int tvNsec) throws IOException { int ready = keventWait(kqueueFd, changeList.memoryAddress(), changeList.size(), eventList.memoryAddress(), eventList.capacity(), tvSec, tvNsec); if (ready < 0) { throw newIOException("kevent", ready); } return ready; }
private int kqueueWait(int timeoutSec, int timeoutNs) throws IOException { int numEvents = Native.keventWait(kqueueFd.intValue(), changeList, eventList, timeoutSec, timeoutNs); changeList.clear(); return numEvents; }
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { reallocIfNeeded(); evSet(getKEventOffset(size++) + memoryAddress, ch.socket.intValue(), filter, flags, fflags); }
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { checkSize(); evSet(getKEventOffset(size++), ch, ch.socket.intValue(), filter, flags, fflags); }
private void processReady(int ready) { for (int i = 0; i < ready; ++i) { final short filter = eventList.filter(i); final short flags = eventList.flags(i); final int fd = eventList.fd(i); if (filter == Native.EVFILT_USER || (flags & Native.EV_ERROR) != 0) { logger.warn("events[{}]=[{}, {}] had no channel!", i, eventList.fd(i), filter); continue; } else if (filter == Native.EVFILT_READ) { unsafe.readReady(eventList.data(i)); } else if (filter == Native.EVFILT_SOCK && (eventList.fflags(i) & Native.NOTE_RDHUP) != 0) { unsafe.readEOF();
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { changeList.evSet(ch, filter, flags, fflags); }
private void processReady(int ready) { for (int i = 0; i < ready; ++i) { final short filter = eventList.filter(i); final short flags = eventList.flags(i); if (filter == Native.EVFILT_USER || (flags & Native.EV_ERROR) != 0) { (filter == Native.EVFILT_USER && eventList.fd(i) == KQUEUE_WAKE_UP_IDENT); continue; AbstractKQueueChannel channel = eventList.channel(i); if (channel == null) { logger.warn("events[{}]=[{}, {}] had no channel!", i, eventList.fd(i), filter); continue; } else if (filter == Native.EVFILT_READ) { unsafe.readReady(eventList.data(i)); } else if (filter == Native.EVFILT_SOCK && (eventList.fflags(i) & Native.NOTE_RDHUP) != 0) { unsafe.readEOF();
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { checkSize(); evSet(getKEventOffset(size++), ch, ch.socket.intValue(), filter, flags, fflags); }
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { reallocIfNeeded(); evSet(getKEventOffset(size++) + memoryAddress, ch.socket.intValue(), filter, flags, fflags); }
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { changeList.evSet(ch, filter, flags, fflags); }
@Override protected void cleanup() { try { try { kqueueFd.close(); } catch (IOException e) { logger.warn("Failed to close the kqueue fd.", e); } } finally { // Cleanup all native memory! // The JNI channel pointers should already be deleted because we should wait on kevent before this method, // but lets just be sure we cleanup native memory. deleteJniChannelPointers(); jniChannelPointers.free(); changeList.free(); eventList.free(); } }
private void processReady(int ready) { for (int i = 0; i < ready; ++i) { final short filter = eventList.filter(i); final short flags = eventList.flags(i); if (filter == Native.EVFILT_USER || (flags & Native.EV_ERROR) != 0) { (filter == Native.EVFILT_USER && eventList.fd(i) == KQUEUE_WAKE_UP_IDENT); continue; AbstractKQueueChannel channel = eventList.channel(i); if (channel == null) { logger.warn("events[{}]=[{}, {}] had no channel!", i, eventList.fd(i), filter); continue; } else if (filter == Native.EVFILT_READ) { unsafe.readReady(eventList.data(i)); } else if (filter == Native.EVFILT_SOCK && (eventList.fflags(i) & Native.NOTE_RDHUP) != 0) { unsafe.readEOF();
static int keventWait(int kqueueFd, KQueueEventArray changeList, KQueueEventArray eventList, int tvSec, int tvNsec) throws IOException { int ready = keventWait(kqueueFd, changeList.memoryAddress(), changeList.size(), eventList.memoryAddress(), eventList.capacity(), tvSec, tvNsec); if (ready < 0) { throw newIOException("kevent", ready); } return ready; }
void evSet(AbstractKQueueChannel ch, short filter, short flags, int fflags) { checkSize(); evSet(getKEventOffset(size++), ch, ch.socket.intValue(), filter, flags, fflags); }
private int kqueueWait(int timeoutSec, int timeoutNs) throws IOException { deleteJniChannelPointers(); int numEvents = Native.keventWait(kqueueFd.intValue(), changeList, eventList, timeoutSec, timeoutNs); changeList.clear(); return numEvents; }