@@ -101,6 +101,7 @@ package DB::Fork;
101
101
102
102
use strict;
103
103
use warnings;
104
+ use Carp;
104
105
use Time::HiRes qw| usleep | ;
105
106
use DBI;
106
107
use Test::More;
@@ -109,12 +110,13 @@ use Data::Dumper;
109
110
use lib ' t/lib' ;
110
111
use DBDOracleTestLib qw/ db_handle / ;
111
112
112
-
113
113
our $VERSION ;
114
114
our $VERBOSE ;
115
115
our $ENABLED ;
116
116
our $CHILDREN ;
117
117
our $PARENT ;
118
+ our $SIG_PING ;
119
+ our $SIG_EXIT ;
118
120
119
121
our $ONETHR :shared;
120
122
@@ -123,6 +125,27 @@ BEGIN {
123
125
$VERBOSE = $main::VERBOSE || 0;
124
126
$CHILDREN = [];
125
127
$PARENT = $$ ;
128
+ $SIG_PING = ' USR1' ;
129
+ $SIG_EXIT = ' USR2' ;
130
+
131
+ eval {
132
+ local $SIG {__WARN__ } = sub
133
+ {
134
+ croak @_ ;
135
+ };
136
+
137
+ # # Not all OS's support USR1 / USR2
138
+ $SIG_PING = ' USR1' ;
139
+ $SIG_EXIT = ' USR2' ;
140
+ local $SIG {$SIG_PING } = sub { 1; };
141
+ local $SIG {$SIG_EXIT } = sub { 1; };
142
+ } or
143
+ do {
144
+ note " # Using HUP as alternative to unsupported USR1 (PING/ACK)\n " ;
145
+ note " # Using INT as alternative to unsupported USR2 (EXIT)\n " ;
146
+ $SIG_PING = ' HUP' ;
147
+ $SIG_EXIT = ' INT' ;
148
+ };
126
149
127
150
# DBI->trace(9);
128
151
}
@@ -204,7 +227,7 @@ sub ping
204
227
my $olimit = 3 * scalar @ $CHILDREN ;
205
228
my $signaled = {};
206
229
207
- local $SIG {USR1 } = sub
230
+ local $SIG {$SIG_PING } = sub
208
231
{
209
232
return unless $child_pid ;
210
233
$signaled -> {$child_pid } = $child_pid ;
@@ -222,9 +245,9 @@ sub ping
222
245
223
246
last unless $child_pid ;
224
247
225
- # # USR1 == ping
248
+ # # ping
226
249
usleep 100000;
227
- ok kill ( ' USR1 ' , $child_pid ), ' kill USR1(ping) ' . $child_pid ;
250
+ ok kill ( $SIG_PING , $child_pid ), sprintf ' kill %s %d ' , $SIG_PING , $child_pid ;
228
251
229
252
while ( $limit -- && ! exists $signaled -> { $child_pid } )
230
253
{
@@ -242,17 +265,17 @@ QUEUE_BACKEND:
242
265
my $do_ping ;
243
266
my $do_exit ;
244
267
245
- sub _USER1 { printf " # USR1 =PING on-child=%d received\n " , $$ ; return ( $do_ping = 1 ); }
246
- sub _USER2 { printf " # USR2 =EXIT on-child=%d received\n " , $$ ; return ( $do_exit = 1 ); }
268
+ sub _USER1 { printf " # %s =PING on-child=%d received\n " , $SIG_PING , $$ ; return ( $do_ping = 1 ); }
269
+ sub _USER2 { printf " # %s =EXIT on-child=%d received\n " , $SIG_EXIT , $$ ; return ( $do_exit = 1 ); }
247
270
248
271
sub _FORK_WORKER
249
272
{
250
273
$do_ping = $do_exit = 0;
251
274
252
275
printf " # PID=%d (START)\n " , $$ ;
253
276
254
- local $SIG {USR1 } = \&_USER1;
255
- local $SIG {USR2 } = \&_USER2;
277
+ local $SIG {$SIG_PING } = \&_USER1;
278
+ local $SIG {$SIG_EXIT } = \&_USER2;
256
279
257
280
BUSY:
258
281
while (1)
@@ -262,7 +285,8 @@ QUEUE_BACKEND:
262
285
{
263
286
printf " # pid=%s PING received (hold on, this is going to be a bumpy ride!)\n " , $$ ;
264
287
_connect();
265
- printf " # PARENT=%s CHILD=%d %s =kill USR1\n " , $PARENT , $$ , kill ( ' USR1' , $PARENT );
288
+ # # AKA PING-ACK
289
+ printf " # PARENT=%s CHILD=%d %s =kill %s \n " , $PARENT , $$ , kill ( $SIG_PING , $PARENT ), $SIG_PING ;
266
290
$do_ping = 0;
267
291
next ;
268
292
}
0 commit comments