Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 62 lines (56 sloc) 1.352 kb
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
/*
* event notifier support
*
* Copyright Red Hat, Inc. 2010
*
* Authors:
* Michael S. Tsirkin <mst@redhat.com>
*
* This work is licensed under the terms of the GNU GPL, version 2. See
* the COPYING file in the top-level directory.
*/

#include "hw.h"
#include "event_notifier.h"
#ifdef CONFIG_EVENTFD
#include <sys/eventfd.h>
#endif

int event_notifier_init(EventNotifier *e, int active)
{
#ifdef CONFIG_EVENTFD
    int fd = eventfd(!!active, EFD_NONBLOCK | EFD_CLOEXEC);
    if (fd < 0)
        return -errno;
    e->fd = fd;
    return 0;
#else
    return -ENOSYS;
#endif
}

void event_notifier_cleanup(EventNotifier *e)
{
    close(e->fd);
}

int event_notifier_get_fd(EventNotifier *e)
{
    return e->fd;
}

int event_notifier_test_and_clear(EventNotifier *e)
{
    uint64_t value;
    int r = read(e->fd, &value, sizeof(value));
    return r == sizeof(value);
}

int event_notifier_test(EventNotifier *e)
{
    uint64_t value;
    int r = read(e->fd, &value, sizeof(value));
    if (r == sizeof(value)) {
        /* restore previous value. */
        int s = write(e->fd, &value, sizeof(value));
        /* never blocks because we use EFD_SEMAPHORE.
* If we didn't we'd get EAGAIN on overflow
* and we'd have to write code to ignore it. */
        assert(s == sizeof(value));
    }
    return r == sizeof(value);
}
Something went wrong with that request. Please try again.