92 lines
1.6 KiB
C
92 lines
1.6 KiB
C
|
|
/*
|
|
* 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;
|
|
}
|