void AsyncAcks::add_request(MPI_Request request) { if (next_slot_ == MAX_POSTED_ASYNC) { // std::cout << "AsyncAcks posted_async_ array is full. SIAL line number " // << current_line() << std::endl << std::flush wait_and_cleanup(); } posted_async_[next_slot_++] = request; }
static char * handler_internal2(const char *tempfile, char * const * arguments, const char *proname, TriggerData *trigger_data, EventTriggerData *event_trigger_data) { int stdout_pipe[2]; int stderr_pipe[2]; pid_t child_pid; int child_status; FILE * file; char * stdout_buffer; char * stderr_buffer; size_t len; bool return_null; /* start process voodoo */ if (pipe(stdout_pipe) == -1) { remove(tempfile); ereport(ERROR, (errcode_for_file_access(), errmsg("could not make pipe: %m"))); } if (pipe(stderr_pipe) == -1) { remove(tempfile); close(stdout_pipe[0]); close(stdout_pipe[1]); ereport(ERROR, (errcode_for_file_access(), errmsg("could not make pipe: %m"))); } child_pid = fork(); if (child_pid == -1) /* fork failed */ { remove(tempfile); close(stdout_pipe[0]); close(stdout_pipe[1]); close(stderr_pipe[0]); close(stderr_pipe[1]); ereport(ERROR, (errcode_for_file_access(), errmsg("fork failed: %m"))); } else if (child_pid == 0) /* child */ { /* close reading end */ close(stdout_pipe[0]); close(stderr_pipe[0]); dup2(stdout_pipe[1], 1); dup2(stderr_pipe[1], 2); close(stdout_pipe[1]); close(stderr_pipe[1]); if (trigger_data) set_trigger_data_envvars(trigger_data); if (event_trigger_data) set_event_trigger_data_envvars(event_trigger_data); set_libpq_envvars(); execv(arguments[0], arguments); ereport(ERROR, (errcode_for_file_access(), errmsg("could not exec: %m"))); } /* parent continues... */ close(stdout_pipe[1]); /* writing end */ close(stderr_pipe[1]); /* fetch return value from stdout */ return_null = false; file = fdopen(stdout_pipe[0], "r"); if (!file) { close(stdout_pipe[0]); close(stderr_pipe[0]); wait_and_cleanup(child_pid, tempfile); ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file stream to stdout pipe: %m"))); } stdout_buffer = read_from_file(file); fclose(file); if (!stdout_buffer) { close(stderr_pipe[0]); wait_and_cleanup(child_pid, tempfile); ereport(ERROR, (errcode_for_file_access(), errmsg("could not read script's stdout: %m"))); } len = strlen(stdout_buffer); if (len == 0) return_null = true; /* strip one trailing newline */ else if (stdout_buffer[len - 1] == '\n') stdout_buffer[len - 1] = '\0'; elog(DEBUG2, "stdout was \"%s\"", stdout_buffer); /* print stderr as error */ file = fdopen(stderr_pipe[0], "r"); if (!file) { close(stderr_pipe[0]); wait_and_cleanup(child_pid, tempfile); ereport(ERROR, (errcode_for_file_access(), errmsg("could not open file stream to stderr pipe: %m"))); } stderr_buffer = read_from_file(file); fclose(file); if (!stderr_buffer) { wait_and_cleanup(child_pid, tempfile); ereport(ERROR, (errcode_for_file_access(), errmsg("could not read script's stderr: %m"))); } len = strlen(stderr_buffer); if (stderr_buffer[len - 1] == '\n') stderr_buffer[len - 1] = '\0'; if (stderr_buffer[0] != '\0') { wait_and_cleanup(child_pid, tempfile); ereport(ERROR, (errmsg("%s: %s", proname, stderr_buffer))); } child_status = wait_and_cleanup(child_pid, tempfile); if (WIFEXITED(child_status)) { if (WEXITSTATUS(child_status) != 0) ereport(ERROR, (errmsg("script exited with status %d", WEXITSTATUS(child_status)))); } if (WIFSIGNALED(child_status)) { ereport(ERROR, (errmsg("script was terminated by signal %d", (int)WTERMSIG(child_status)))); } if (return_null) return NULL; else return stdout_buffer; }