Start adding not-complete kqueue codepaths - bparker - see if you can

finish this up
This commit is contained in:
twinaphex 2017-11-30 07:28:59 +01:00
parent 62280439b7
commit 6c69002ab4

View File

@ -14,6 +14,19 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
/* TODO/FIXME - set this once the kqueue codepath is implemented and working properly */
#if 1
#define HAVE_EPOLL
#else
#ifdef __linux__
#define HAVE_EPOLL 1
#endif
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined (__NetBSD__)
#define HAVE_KQUEUE 1
#endif
#endif
#include <stdint.h>
#include <string.h>
@ -25,7 +38,11 @@
#include <sys/types.h>
#include <sys/stat.h>
#if defined(HAVE_EPOLL)
#include <sys/epoll.h>
#elif defined(HAVE_KQUEUE)
#include <sys/event.h>
#endif
#include <sys/poll.h>
#include <libudev.h>
@ -450,7 +467,11 @@ static bool udev_input_add_device(udev_input_t *udev,
{
int fd;
struct stat st;
#if defined(HAVE_EPOLL)
struct epoll_event event;
#elif defined(HAVE_KQUEUE)
struct kevent event;
#endif
struct input_absinfo absinfo;
udev_input_device_t **tmp;
udev_input_device_t *device = NULL;
@ -518,6 +539,7 @@ static bool udev_input_add_device(udev_input_t *udev,
tmp[udev->num_devices++] = device;
udev->devices = tmp;
#if defined(HAVE_EPOLL)
event.events = EPOLLIN;
event.data.ptr = device;
@ -527,6 +549,14 @@ static bool udev_input_add_device(udev_input_t *udev,
RARCH_ERR("Failed to add FD (%d) to epoll list (%s).\n",
fd, strerror(errno));
}
#elif defined(HAVE_KQUEUE)
EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, LISTENSOCKET);
if (kevent(udev->fd, &event, 1, NULL, 0, NULL) == -1)
{
RARCH_ERR("Failed to add FD (%d) to kqueue list (%s).\n",
fd, strerror(errno));
}
#endif
return true;
@ -639,7 +669,11 @@ static bool udev_input_poll_hotplug_available(struct udev_monitor *dev)
static void udev_input_poll(void *data)
{
int i, ret;
#if defined(HAVE_EPOLL)
struct epoll_event events[32];
#elif defined(HAVE_KQUEUE)
struct kevent events[32];
#endif
udev_input_mouse_t *mouse = NULL;
udev_input_t *udev = (udev_input_t*)data;
@ -666,15 +700,30 @@ static void udev_input_poll(void *data)
while (udev->monitor && udev_input_poll_hotplug_available(udev->monitor))
udev_input_handle_hotplug(udev);
#if defined(HAVE_EPOLL)
ret = epoll_wait(udev->fd, events, ARRAY_SIZE(events), 0);
#elif defined(HAVE_KQUEUE)
{
struct timespec timeoutspec;
timeoutspec.tv_sec = timeout;
timeoutspec.tv_nsec = 0;
ret = kevent(udev->fd, NULL, 0, events,
ARRAY_SIZE(events), &timeoutspec);
}
#endif
for (i = 0; i < ret; i++)
{
/* TODO/FIXME - add HAVE_EPOLL/HAVE_KQUEUE codepaths here */
if (events[i].events & EPOLLIN)
{
int j, len;
struct input_event input_events[32];
#if defined(HAVE_EPOLL)
udev_input_device_t *device = (udev_input_device_t*)events[i].data.ptr;
#elif defined(HAVE_KQUEUE)
udev_input_device_t *device = (udev_input_device_t*)events[i].udata;
#endif
while ((len = read(device->fd,
input_events, sizeof(input_events))) > 0)
@ -978,12 +1027,21 @@ static void *udev_input_init(const char *joypad_driver)
udev->xkb_handling = string_is_equal(ctx_ident.ident, "kms");
#endif
#if defined(HAVE_EPOLL)
fd = epoll_create(32);
if (fd < 0)
{
RARCH_ERR("Failed to create epoll FD.\n");
RARCH_ERR("Failed to create poll file descriptor.\n");
goto error;
}
#elif defined(HAVE_KQUEUE)
fd = kqueue();
if (fd == -1)
{
RARCH_ERR("Failed to create poll file descriptor.\n");
goto error;
}
#endif
udev->fd = fd;