blob: 454e6ce713d934b94cbdd8b327da145de8d559bd [file] [log] [blame]
/*
* Copyright (c) 2002, Intel Corporation.
* Created by: julie.n.fleischer REMOVE-THIS AT intel DOT com
* This file is licensed under the GPL license. For the full content
* of this license, see the COPYING file at the top level of this
* source tree.
*/
#include <sys/select.h>
int sync_pipe_create(int fd[])
{
return pipe (fd);
}
int sync_pipe_close(int fd[])
{
int r = 0;
if (fd[0] != -1)
r = close (fd[0]);
if (fd[1] != -1)
r |= close (fd[1]);
return r;
}
int sync_pipe_wait(int fd[])
{
char buf;
int r;
if (fd[1] != -1) {
close (fd[1]);
fd[1] = -1;
}
r = read (fd[0], &buf, 1);
if ((r != 1) || (buf != 'A'))
return -1;
return 0;
}
int sync_pipe_wait_select(int fd[], long tv_sec)
{
int r;
fd_set rfds;
struct timeval tv;
int err;
tv.tv_sec = tv_sec;
tv.tv_usec = 0;
if (fd[1] != -1) {
close (fd[1]);
fd[1] = -1;
}
FD_ZERO(&rfds);
FD_SET(fd[0], &rfds);
r = select(fd[0] + 1, &rfds, NULL, NULL, &tv);
err = errno;
if (FD_ISSET(fd[0], &rfds)) {
return sync_pipe_wait(fd);
}
return r ? err : -ETIMEDOUT;
}
int sync_pipe_notify(int fd[])
{
char buf = 'A';
int r;
if (fd[0] != -1) {
close (fd[0]);
fd[0] = -1;
}
r = write (fd[1], &buf, 1);
if (r != 1)
return -1;
return 0;
}