1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
//===--------------------- KQueue.cpp ---------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "KQueue.h"
#ifdef LLDB_USE_KQUEUES
#include "lldb/Core/Error.h"
#include "Utility/TimeSpecTimeout.h"
using namespace lldb_private;
int
KQueue::GetFD (bool can_create)
{
if (!IsValid () && can_create)
m_fd = kqueue();
return m_fd;
}
int
KQueue::Close ()
{
const int fd = m_fd;
if (fd >= 0)
{
m_fd = -1;
return close(fd);
}
return 0;
}
int
KQueue::WaitForEvents (struct kevent *events, int num_events, Error &error, uint32_t timeout_usec)
{
const int fd_kqueue = GetFD(false);
if (fd_kqueue >= 0)
{
TimeSpecTimeout timeout;
const struct timespec *timeout_ptr = timeout.SetRelativeTimeoutMircoSeconds32 (timeout_usec);
int result = ::kevent(fd_kqueue, NULL, 0, events, num_events, timeout_ptr);
if (result == -1)
error.SetErrorToErrno();
else
error.Clear();
return result;
}
else
{
error.SetErrorString("invalid kqueue fd");
}
return 0;
}
bool
KQueue::AddFDEvent (int fd, bool read, bool write, bool vnode)
{
const int fd_kqueue = GetFD(true);
if (fd_kqueue >= 0)
{
struct kevent event;
event.ident = fd;
event.filter = 0;
if (read)
event.filter |= EVFILT_READ;
if (write)
event.filter |= EVFILT_WRITE;
if (vnode)
event.filter |= EVFILT_VNODE;
event.flags = EV_ADD | EV_CLEAR;
event.fflags = 0;
event.data = 0;
event.udata = NULL;
int err = ::kevent(fd_kqueue, &event, 1, NULL, 0, NULL);
return err == 0;
}
return false;
}
#endif
|