Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- svar data_packets
- $def init_svar mode preempt data_packets @ array? not if 0 array_make_dict data_packets ! then setmode
- : clean_packets
- mode var! start_mode
- data_packets @ foreach pop var! cur
- preempt
- cur @ ispid? if start_mode @ setmode continue then
- data_packets @ cur @ array_delitem data_packets !
- start_mode @ setmode
- repeat
- start_mode @ setmode
- ; PUBLIC clean_packets
- $libdef safe_fork_clean_packets
- : safe_fork[ dbref:program_to_call str:function_to_call ?:data -- int ]
- init_svar
- mode
- "prog" program_to_call @ "func" function_to_call "data" data @ 3 array_make_dict
- preempt
- data_packets @ pid array_setitem data_packets !
- setmode
- "*me" match "safe_fork" prog pid intostr enqueue ?dup if exit else -1 exit then
- ; PUBLIC safe_fork
- $libdef safe_fork
- : main[ str:calling_pid - ]
- command @ tolower "safe_fork" strcmp if me @ dup "%D(%d) attempted to abuse lib/safe_fork" fmtstring abort then
- data_packets @ not if "Bad data packet" abort then
- data_packets @ calling_pid @ atoi array_getitem var! data_packet
- data_packet @ not if pid kill then
- preempt
- data_packets @ calling_pid @ atoi array_delitem data_packets !
- background
- data_packet @ "data" array_getitem data_packet @ "prog" array_getitem data_packet @ "func" array_getitem ?dup pop call
- ;
Advertisement
Add Comment
Please, Sign In to add comment