void setCallback( SV *cb1, SV* cb2, SV *cb3, SV *cb4 ) { int i; saved = Perl_get_context(); callbacks[0] = cb1; SvREFCNT_inc( cb1 ); callbacks[1] = cb2; SvREFCNT_inc( cb2 ); callbacks[2] = cb3; SvREFCNT_inc( cb2 ); callbacks[3] = cb4; SvREFCNT_inc( cb2 ); for( i=1; i < 4; ++i ) InitializeSRWLock( &locks[ i ] ); _beginthread( &thread1, 0, NULL ); _beginthread( &thread2, 0, NULL ); return; } END_C $|++; { package fred; my @c = (0) x 4; sub callback1 { ++$c[0]; print "PCB1: $_[0] ($c[0])"; return; } sub callback2 { ++$c[1]; print "PCB2: $_[0] ($c[1])"; return; } sub callback3 { ++$c[2]; print "PCB3: $_[0] ($c[2])"; return; } sub callback4 { ++$c[3]; print "PCB4: $_[0] ($c[3])"; return; } } setCallback( \&fred::callback1, \&fred::callback2, \&fred::callback3, \&fred::callback4 ); sleep 100;