372447ebb84591c55f3b134ef48dcf1ab6a44024
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / eventfd.c
1 /* Copyright (c) 2015 Google Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Implementation of glibc's eventfd interface, hooking in to #eventfd */
6
7 #include <sys/eventfd.h>
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 /* Gets a new EFD instance, returning the FD on success. */
15 int eventfd(int initval, int flags)
16 {
17         const char *pathname = "#eventfd/efd";
18         int oflags = 0;
19         int efd;
20
21         /* we choose semaphore mode by passing 'sem' as the device spec */
22         if (flags & EFD_SEMAPHORE)
23                 pathname = "#eventfd.sem/efd";
24         if (flags & EFD_CLOEXEC)
25                 oflags |= O_CLOEXEC;
26         if (flags & EFD_NONBLOCK)
27                 oflags |= O_NONBLOCK;
28         efd = open(pathname, O_READ | O_WRITE | oflags);
29         if (efd < 0)
30                 return efd;
31         /* default initval for an #eventfd is 0. */
32         if (initval) {
33                 if (eventfd_write(efd, initval)) {
34                         close(efd);
35                         return -1;
36                 }
37         }
38         return efd;
39 }
40
41 /* Reads into *value, in host-endian format, from the efd.  Returns 0 on
42  * success.  */
43 int eventfd_read(int efd, eventfd_t *value)
44 {
45         int ret;
46         char num64[32];
47         ret = read(efd, num64, sizeof(num64));
48         if (ret <= 0)
49                 return -1;
50         *value = strtoul(num64, 0, 0);
51         return 0;
52 }
53
54 /* Writes value, in host-endian format, into the efd.  Returns 0 on success. */
55 int eventfd_write(int efd, eventfd_t value)
56 {
57         int ret;
58         char num64[32];
59         ret = snprintf(num64, sizeof(num64), "0x%llx", value);
60         if (write(efd, num64, ret) == ret)
61                 return 0;
62         else
63                 return -1;
64 }