pipeutils: Add utils for pipe signals

Add pipeutils.c with utility functions for working with pipes as
signals across threads. Using pipes for signals makes it easy for
the main thread to wait on (multiple) file descriptors with or
without a timeout.
This commit is contained in:
Jon Lund Steffensen
2017-08-17 19:52:29 -07:00
parent 153dec0e21
commit ce037545dd
3 changed files with 127 additions and 0 deletions
+1
View File
@@ -14,6 +14,7 @@ redshift_SOURCES = \
gamma-dummy.c gamma-dummy.h \
hooks.c hooks.h \
location-manual.c location-manual.h \
pipeutils.c pipeutils.h \
redshift.c redshift.h \
signals.c signals.h \
solar.c solar.h \
+98
View File
@@ -0,0 +1,98 @@
/* pipeutils.c -- Utilities for using pipes as signals
This file is part of Redshift.
Redshift is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Redshift is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Redshift. If not, see <http://www.gnu.org/licenses/>.
Copyright (c) 2017 Jon Lund Steffensen <jonlst@gmail.com>
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#ifndef _WIN32
/* Create non-blocking set of pipe fds. */
int
pipeutils_create_nonblocking(int pipefds[2])
{
int r = pipe(pipefds);
if (r == -1) {
perror("pipe");
return -1;
}
int flags = fcntl(pipefds[0], F_GETFL);
if (flags == -1) {
perror("fcntl");
close(pipefds[0]);
close(pipefds[1]);
return -1;
}
r = fcntl(pipefds[0], F_SETFL, flags | O_NONBLOCK);
if (r == -1) {
perror("fcntl");
close(pipefds[0]);
close(pipefds[1]);
return -1;
}
flags = fcntl(pipefds[1], F_GETFL);
if (flags == -1) {
perror("fcntl");
close(pipefds[0]);
close(pipefds[1]);
return -1;
}
r = fcntl(pipefds[1], F_SETFL, flags | O_NONBLOCK);
if (r == -1) {
perror("fcntl");
close(pipefds[0]);
close(pipefds[1]);
return -1;
}
return 0;
}
#else /* _WIN32 */
/* Create non-blocking set of pipe fds.
Not supported on Windows! Always fails. */
int
pipeutils_create_nonblocking(int pipefds[2])
{
return -1;
}
#endif
/* Signal on write-end of pipe. */
void
pipeutils_signal(int write_fd)
{
write(write_fd, "", 1);
}
/* Mark signal as handled on read-end of pipe. */
void
pipeutils_handle_signal(int read_fd)
{
char data;
read(read_fd, &data, 1);
}
+28
View File
@@ -0,0 +1,28 @@
/* pipeutils.h -- Utilities for using pipes as signals
This file is part of Redshift.
Redshift is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Redshift is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Redshift. If not, see <http://www.gnu.org/licenses/>.
Copyright (c) 2017 Jon Lund Steffensen <jonlst@gmail.com>
*/
#ifndef REDSHIFT_PIPEUTILS_H
#define REDSHIFT_PIPEUTILS_H
int pipeutils_create_nonblocking(int pipefds[2]);
void pipeutils_signal(int write_fd);
void pipeutils_handle_signal(int read_fd);
#endif /* ! REDSHIFT_PIPEUTILS_H */