Fix O_NONBLOCK setting on self_pipes
This commit is contained in:
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user