/* * Authored by Alex Hultman, 2018-2019. * Intellectual property of third-party. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EPOLL_KQUEUE_H #define EPOLL_KQUEUE_H #include "internal/loop_data.h" #ifdef LIBUS_USE_EPOLL #include #include #include #define LIBUS_SOCKET_READABLE EPOLLIN #define LIBUS_SOCKET_WRITABLE EPOLLOUT #else #include /* Kqueue's EVFILT_ is NOT a bitfield, you cannot OR together them. * We therefore have our own bitfield we then translate in every call */ #define LIBUS_SOCKET_READABLE 1 #define LIBUS_SOCKET_WRITABLE 2 #include #endif struct us_loop_t { alignas(LIBUS_EXT_ALIGNMENT) struct us_internal_loop_data_t data; /* Number of non-fallthrough polls in the loop */ int num_polls; /* Number of ready polls this iteration */ int num_ready_polls; /* Current index in list of ready polls */ int current_ready_poll; /* Loop's own file descriptor */ int fd; /* Number of polls owned by bun */ unsigned int bun_polls; /* The list of ready polls */ #ifdef LIBUS_USE_EPOLL alignas(LIBUS_EXT_ALIGNMENT) struct epoll_event ready_polls[1024]; #else alignas(LIBUS_EXT_ALIGNMENT) struct kevent64_s ready_polls[1024]; #endif }; struct us_poll_t { alignas(LIBUS_EXT_ALIGNMENT) struct { signed int fd : 28; // we could have this unsigned if we wanted to, -1 should never be used unsigned int poll_type : 4; } state; }; #endif // EPOLL_KQUEUE_H