@@ -723,6 +723,10 @@ zloop_start (zloop_t *self)
723
723
}
724
724
rc = zmq_poll (self -> pollset , (int ) self -> poll_size , s_tickless (self ));
725
725
if (rc == -1 || (zsys_interrupted && !self -> nonstop )) {
726
+ if (errno == EINTR && self -> nonstop ) {
727
+ rc = 0 ;
728
+ continue ;
729
+ }
726
730
if (self -> verbose ) {
727
731
if (rc == -1 )
728
732
zsys_debug ("zloop: interrupted: %s" , strerror (errno ));
@@ -915,6 +919,22 @@ s_timer_event5 (zloop_t *loop, int timer_id, void *arg)
915
919
return 0 ;
916
920
}
917
921
922
+ static void
923
+ s_raise_sigint_actor (zsock_t * pipe , void * args )
924
+ {
925
+ zsock_signal (pipe , 0 );
926
+ assert (zsys_interrupted == 0 );
927
+ zsock_wait (pipe );
928
+ zclock_sleep (100 );
929
+ #if defined (__WINDOWS__ )
930
+ assert (GenerateConsoleCtrlEvent (CTRL_C_EVENT , 0 ) != 0 );
931
+ #else
932
+ assert (kill (getpid (), SIGINT ) == 0 );
933
+ #endif
934
+ zclock_sleep (100 );
935
+ assert (zsys_interrupted != 0 );
936
+ }
937
+
918
938
void
919
939
zloop_test (bool verbose )
920
940
{
@@ -976,6 +996,34 @@ zloop_test (bool verbose)
976
996
assert (timer_event_called );
977
997
zsys_interrupted = 0 ;
978
998
999
+ // Check that SIGINT terminates loop if nonstop is not set
1000
+ zloop_destroy (& loop );
1001
+ zactor_t * raise_sigint_actor = zactor_new (s_raise_sigint_actor , NULL );
1002
+ assert (raise_sigint_actor );
1003
+ loop = zloop_new ();
1004
+ zloop_set_nonstop (loop , false);
1005
+ timer_event_called = false;
1006
+ zloop_timer (loop , 1000 , 1 , s_timer_event3 , & timer_event_called );
1007
+ zsock_signal (raise_sigint_actor , 0 );
1008
+ zloop_start (loop );
1009
+ zactor_destroy (& raise_sigint_actor );
1010
+ assert (!timer_event_called );
1011
+ zsys_interrupted = 0 ;
1012
+
1013
+ // Check that SIGINT does not terminate the loop if nonstop is set
1014
+ zloop_destroy (& loop );
1015
+ raise_sigint_actor = zactor_new (s_raise_sigint_actor , NULL );
1016
+ assert (raise_sigint_actor );
1017
+ loop = zloop_new ();
1018
+ zloop_set_nonstop (loop , true);
1019
+ timer_event_called = false;
1020
+ zloop_timer (loop , 500 , 1 , s_timer_event3 , & timer_event_called );
1021
+ zsock_signal (raise_sigint_actor , 0 );
1022
+ zloop_start (loop );
1023
+ zactor_destroy (& raise_sigint_actor );
1024
+ assert (timer_event_called );
1025
+ zsys_interrupted = 0 ;
1026
+
979
1027
// Check if reader removed in timer is not called
980
1028
zloop_destroy (& loop );
981
1029
loop = zloop_new ();
0 commit comments