Fix O_NONBLOCK setting on self_pipes

This commit is contained in:
Alex Young
2012-06-08 10:11:06 +01:00
parent 2d9d00b636
commit 5fb0cd4cca
2 changed files with 14 additions and 3 deletions

View File

@@ -63,7 +63,7 @@ struct self_pipe * self_pipe_create(void)
return NULL; return NULL;
} }
if ( fcntl( fds[0], F_SETFD, O_NONBLOCK ) || fcntl( fds[1], F_SETFD, O_NONBLOCK ) ) { if ( fcntl( fds[0], F_SETFL, O_NONBLOCK ) || fcntl( fds[1], F_SETFL, O_NONBLOCK ) ) {
fcntl_err = errno; fcntl_err = errno;
while( close( fds[0] ) == -1 && errno == EINTR ); while( close( fds[0] ) == -1 && errno == EINTR );
while( close( fds[1] ) == -1 && errno == EINTR ); while( close( fds[1] ) == -1 && errno == EINTR );
@@ -99,7 +99,8 @@ int self_pipe_signal( struct self_pipe * sig )
/** /**
* Clear a received signal from the pipe. Every signal sent must be * Clear a received signal from the pipe. Every signal sent must be
* cleared by one (and only one) recipient when they return from select(). * cleared by one (and only one) recipient when they return from select()
* if the signal is to be used more than once.
* Returns the number of bytes read, which will be 1 on success and 0 if * Returns the number of bytes read, which will be 1 on success and 0 if
* there was no signal. * there was no signal.
*/ */
@@ -107,7 +108,7 @@ int self_pipe_signal_clear( struct self_pipe *sig )
{ {
char buf[1]; char buf[1];
return read( sig->read_fd, buf, 1 ); return 1 == read( sig->read_fd, buf, 1 );
} }

View File

@@ -69,6 +69,15 @@ START_TEST( test_signals )
END_TEST END_TEST
START_TEST( test_clear_returns_immediately )
{
struct self_pipe *sig;
sig = self_pipe_create();
fail_unless( 0 == self_pipe_signal_clear( sig ), "Wrong clear result." );
}
END_TEST
START_TEST( test_destroy_closes_read_pipe ) START_TEST( test_destroy_closes_read_pipe )
{ {
struct self_pipe* sig; struct self_pipe* sig;
@@ -170,6 +179,7 @@ Suite *self_pipe_suite()
tcase_add_test(tc_create, test_opens_pipe); tcase_add_test(tc_create, test_opens_pipe);
tcase_add_test(tc_signal, test_signals ); tcase_add_test(tc_signal, test_signals );
tcase_add_test(tc_signal, test_clear_returns_immediately );
tcase_add_test(tc_destroy, test_destroy_closes_read_pipe ); tcase_add_test(tc_destroy, test_destroy_closes_read_pipe );
tcase_add_test(tc_destroy, test_destroy_closes_write_pipe ); tcase_add_test(tc_destroy, test_destroy_closes_write_pipe );
/* We don't test that destroy free()'s the self_pipe pointer because /* We don't test that destroy free()'s the self_pipe pointer because