diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 507f18a166..efd983ded8 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2368,6 +2368,9 @@ SWITCH_DECLARE(void) switch_core_recovery_untrack(switch_core_session_t *session SWITCH_DECLARE(void) switch_core_recovery_track(switch_core_session_t *session); SWITCH_DECLARE(void) switch_core_recovery_flush(const char *technology, const char *profile_name); + +SWITCH_DECLARE(pid_t) switch_fork(void); + SWITCH_END_EXTERN_C #endif /* For Emacs: diff --git a/src/mod/endpoints/mod_gsmopen/asterisk/celliax_additional.c b/src/mod/endpoints/mod_gsmopen/asterisk/celliax_additional.c index f72c8d8552..efae699ab7 100644 --- a/src/mod/endpoints/mod_gsmopen/asterisk/celliax_additional.c +++ b/src/mod/endpoints/mod_gsmopen/asterisk/celliax_additional.c @@ -1185,7 +1185,7 @@ int celliax_serial_getstatus_AT(struct celliax_pvt *p) NOTICA("incoming SMS message:>>>%s<<<\n", CELLIAX_P_LOG, p->sms_message); pipe(fd1); - pid1 = fork(); + pid1 = switch_fork(); if (pid1 == 0) { //child int err; @@ -1735,7 +1735,7 @@ int celliax_serial_read_AT(struct celliax_pvt *p, int look_for_ack, int timeout_ NOTICA("incoming SMS message:>>>%s<<<\n", CELLIAX_P_LOG, p->sms_message); pipe(fd1); - pid1 = fork(); + pid1 = switch_fork(); if (pid1 == 0) { //child int err; diff --git a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp index ffa4e3d014..5bdda08f81 100644 --- a/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp +++ b/src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp @@ -3101,7 +3101,7 @@ int gsmopen_serial_getstatus_AT(private_t *tech_pvt) DEBUGA_AT("incoming SMS message:---%s---\n", GSMOPEN_P_LOG, p->sms_message); pipe(fd1); - pid1 = fork(); + pid1 = switch_fork(); if (pid1 == 0) { //child int err; diff --git a/src/mod/formats/mod_shell_stream/mod_shell_stream.c b/src/mod/formats/mod_shell_stream/mod_shell_stream.c index 38969c84f6..a682eb424d 100644 --- a/src/mod/formats/mod_shell_stream/mod_shell_stream.c +++ b/src/mod/formats/mod_shell_stream/mod_shell_stream.c @@ -108,7 +108,7 @@ static switch_status_t shell_stream_file_open(switch_file_handle_t *handle, cons if (pipe(context->fds)) { goto error; } else { /* good to go */ - context->pid = fork(); + context->pid = switch_fork(); if (context->pid < 0) { /* ok maybe not */ goto error; diff --git a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl index 0f4af275bc..c10fd515ee 100644 --- a/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl +++ b/src/mod/xml_int/mod_xml_scgi/xml_scgi_server.pl @@ -65,7 +65,7 @@ $SIG{CHLD} = "IGNORE"; while (my $request = $scgi->accept) { # fork every new req into its own process (optional) - my $pid = fork(); + my $pid = switch_fork(); if ($pid) { $request->close(); diff --git a/src/switch.c b/src/switch.c index 4f8678a97f..0ddefbc5da 100644 --- a/src/switch.c +++ b/src/switch.c @@ -262,7 +262,7 @@ static void daemonize(int do_wait) } } - pid = fork(); + pid = switch_fork(); switch (pid) { case 0: /* child process */ diff --git a/src/switch_core.c b/src/switch_core.c index 1d87d9ce2e..70d4cd5d0f 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -2731,15 +2731,33 @@ SWITCH_DECLARE(void) switch_close_extra_files(int *keep, int keep_ttl) } - #ifdef WIN32 static int switch_system_fork(const char *cmd, switch_bool_t wait) { return switch_system_thread(cmd, wait); } +SWITCH_DECLARE(pid_t) switch_fork(void) +{ + return -1; +} + + #else +SWITCH_DECLARE(pid_t) switch_fork(void) +{ + int i = fork(); + + if (!i) { + set_low_priority(); + } + + return i; +} + + + static int switch_system_fork(const char *cmd, switch_bool_t wait) { int pid; @@ -2747,7 +2765,7 @@ static int switch_system_fork(const char *cmd, switch_bool_t wait) switch_core_set_signal_handlers(); - pid = fork(); + pid = switch_fork(); if (pid) { if (wait) { @@ -2757,7 +2775,6 @@ static int switch_system_fork(const char *cmd, switch_bool_t wait) } else { switch_close_extra_files(NULL, 0); - set_low_priority(); if (system(dcmd) == -1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to execute because of a command error : %s\n", dcmd); } @@ -2793,7 +2810,7 @@ SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_han if (pipe(fds)) { goto end; } else { /* good to go */ - pid = fork(); + pid = switch_fork(); if (pid < 0) { /* ok maybe not */ close(fds[0]); diff --git a/src/switch_xml.c b/src/switch_xml.c index a4da3ca6cf..f441567cac 100644 --- a/src/switch_xml.c +++ b/src/switch_xml.c @@ -1238,7 +1238,7 @@ static FILE *preprocess_exec(const char *cwd, const char *command, FILE *write_f if (pipe(fds)) { goto end; } else { /* good to go */ - pid = fork(); + pid = switch_fork(); if (pid < 0) { /* ok maybe not */ close(fds[0]);