aboutsummaryrefslogtreecommitdiffstats
path: root/compatfd.c
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:35 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-03 18:28:35 -0800
commitf721e3ac031f892af46f255a47d7f54a91317b30 (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /compatfd.c
parentbae1bc39312d5019bd9a5b8d840a529213a69a17 (diff)
downloadexternal_qemu-f721e3ac031f892af46f255a47d7f54a91317b30.zip
external_qemu-f721e3ac031f892af46f255a47d7f54a91317b30.tar.gz
external_qemu-f721e3ac031f892af46f255a47d7f54a91317b30.tar.bz2
auto import from //depot/cupcake/@135843
Diffstat (limited to 'compatfd.c')
-rw-r--r--compatfd.c128
1 files changed, 0 insertions, 128 deletions
diff --git a/compatfd.c b/compatfd.c
deleted file mode 100644
index 46b0ae7..0000000
--- a/compatfd.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * signalfd/eventfd compatibility
- *
- * Copyright IBM, Corp. 2008
- *
- * Authors:
- * Anthony Liguori <aliguori@us.ibm.com>
- *
- * This work is licensed under the terms of the GNU GPL, version 2. See
- * the COPYING file in the top-level directory.
- *
- */
-
-#include "qemu-common.h"
-#include "compatfd.h"
-
-#include <sys/syscall.h>
-#include <pthread.h>
-
-struct sigfd_compat_info
-{
- sigset_t mask;
- int fd;
-};
-
-static void *sigwait_compat(void *opaque)
-{
- struct sigfd_compat_info *info = opaque;
- int err;
- sigset_t all;
-
- sigfillset(&all);
- sigprocmask(SIG_BLOCK, &all, NULL);
-
- do {
- siginfo_t siginfo;
-
- err = sigwaitinfo(&info->mask, &siginfo);
- if (err == -1 && errno == EINTR) {
- err = 0;
- continue;
- }
-
- if (err > 0) {
- char buffer[128];
- size_t offset = 0;
-
- memcpy(buffer, &err, sizeof(err));
- while (offset < sizeof(buffer)) {
- ssize_t len;
-
- len = write(info->fd, buffer + offset,
- sizeof(buffer) - offset);
- if (len == -1 && errno == EINTR)
- continue;
-
- if (len <= 0) {
- err = -1;
- break;
- }
-
- offset += len;
- }
- }
- } while (err >= 0);
-
- return NULL;
-}
-
-static int qemu_signalfd_compat(const sigset_t *mask)
-{
- pthread_attr_t attr;
- pthread_t tid;
- struct sigfd_compat_info *info;
- int fds[2];
-
- info = malloc(sizeof(*info));
- if (info == NULL) {
- errno = ENOMEM;
- return -1;
- }
-
- if (pipe(fds) == -1) {
- free(info);
- return -1;
- }
-
- memcpy(&info->mask, mask, sizeof(*mask));
- info->fd = fds[1];
-
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
- pthread_create(&tid, &attr, sigwait_compat, info);
-
- pthread_attr_destroy(&attr);
-
- return fds[0];
-}
-
-int qemu_signalfd(const sigset_t *mask)
-{
-#if defined(SYS_signalfd)
- int ret;
-
- ret = syscall(SYS_signalfd, -1, mask, _NSIG / 8);
- if (!(ret == -1 && errno == ENOSYS))
- return ret;
-#endif
-
- return qemu_signalfd_compat(mask);
-}
-
-int qemu_eventfd(int *fds)
-{
-#if defined(SYS_eventfd)
- int ret;
-
- ret = syscall(SYS_eventfd, 0);
- if (ret >= 0) {
- fds[0] = fds[1] = ret;
- return 0;
- } else if (!(ret == -1 && errno == ENOSYS))
- return ret;
-#endif
-
- return pipe(fds);
-}