forked from OSchip/llvm-project
88 lines
2.0 KiB
C++
88 lines
2.0 KiB
C++
//===--------------------- 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
|