static int read_data(char *buf) { int count; int sig = 0; while(1){ count = read(DATA_PATH , buf, MAX_DATA); if(count < 0){ #ifdef DEBUG write_log("LM(P) read error\n"); #endif /* read error !? and check */ sig = check_signals(); if(signal_last(sig)) continue; /* retry */ if(signal_start(sig)){ start_signal = 0; continue; } return -1; /* SIGTERM or EAGAIN or other read error */ } break; /* read SUCCESS */ } return count; }
bool obs_output_begin_data_capture(obs_output_t output, uint32_t flags) { bool encoded, has_video, has_audio, has_service; if (!output) return false; if (output->active) return false; convert_flags(output, flags, &encoded, &has_video, &has_audio, &has_service); if (!can_begin_data_capture(output, encoded, has_video, has_audio, has_service)) return false; hook_data_capture(output, encoded, has_video, has_audio); if (has_service) obs_service_activate(output->service); output->active = true; if (output->reconnecting) { signal_reconnect_success(output); output->reconnecting = false; } else { signal_start(output); } return true; }
int wait_restart(void) { int sig; /* wait restart(BSCC success) */ while(1){ sig = check_signals(); if(signal_end(sig)) return DETECT_END; /* SIGTERM */ if(signal_start(sig)){ start_signal = 0; return DETECT_START; } pause(); /* wait signal */ } }
static bool begin_delayed_capture(obs_output_t *output) { if (delay_capturing(output)) return false; pthread_mutex_lock(&output->interleaved_mutex); reset_packet_data(output); os_atomic_set_bool(&output->delay_capturing, true); pthread_mutex_unlock(&output->interleaved_mutex); if (reconnecting(output)) { signal_reconnect_success(output); os_atomic_set_bool(&output->reconnecting, false); } else { signal_start(output); } return true; }
bool obs_output_begin_data_capture(obs_output_t *output, uint32_t flags) { bool encoded, has_video, has_audio, has_service; if (!obs_output_valid(output, "obs_output_begin_data_capture")) return false; if (delay_active(output)) return begin_delayed_capture(output); if (active(output)) return false; output->total_frames = 0; convert_flags(output, flags, &encoded, &has_video, &has_audio, &has_service); if (!can_begin_data_capture(output, encoded, has_video, has_audio, has_service)) return false; os_atomic_set_bool(&output->data_active, true); hook_data_capture(output, encoded, has_video, has_audio); if (has_service) obs_service_activate(output->service); do_output_signal(output, "activate"); os_atomic_set_bool(&output->active, true); if (reconnecting(output)) { signal_reconnect_success(output); os_atomic_set_bool(&output->reconnecting, false); } else if (delay_active(output)) { do_output_signal(output, "starting"); } else { signal_start(output); } return true; }
/* * start an editing session: process the EDIT/VIEW message * if view == 1, text will be viewed, else edited */ void message_edit __P4 (char *,text, int,msglen, char,view, char,builtin) { char tmpname[BUFSIZE], command_str[BUFSIZE], buf[BUFSIZE]; char *errdesc = "#warning: protocol error (message_edit, no %s)\n"; int tmpfd, i, childpid; unsigned int key; editsess *s; char *editor, *descr; char *args[4]; int waitforeditor; status(1); args[0] = "/bin/sh"; args[1] = "-c"; args[2] = command_str; args[3] = 0; if (view) { key = (unsigned int)-1; i = 0; } else { if (text[0] != 'M') { tty_printf(errdesc, "M"); free(text); return; } for (i = 1; i < msglen && isdigit(text[i]); i++) ; if (text[i++] != '\n' || i >= msglen) { tty_printf(errdesc, "\\n"); free(text); return; } key = strtoul(text + 1, NULL, 10); } descr = text + i; while (i < msglen && text[i] != '\n') i++; if (i >= msglen) { tty_printf(errdesc, "desc"); free(text); return; } text[i++] = '\0'; sprintf(tmpname, "/tmp/powwow.%u.%d%d", key, getpid(), abs(rand()) >> 8); if ((tmpfd = open(tmpname, O_WRONLY | O_CREAT, 0600)) < 0) { errmsg("create temp edit file"); free(text); return; } if (write(tmpfd, text + i, msglen - i) < msglen - i) { errmsg("write to temp edit file"); free(text); close(tmpfd); return; } close(tmpfd); s = (editsess*)malloc(sizeof(editsess)); if (!s) { errmsg("malloc"); return; } s->ctime = time((time_t*)NULL); s->oldsize = msglen - i; s->key = key; s->fd = (view || builtin) ? -1 : tcp_fd; /* MUME doesn't expect a reply. */ s->cancel = 0; s->descr = my_strdup(descr); s->file = my_strdup(tmpname); free(text); /* send a edit_start message (if wanted) */ if ((!edit_sess) && (*edit_start)) { error = 0; parse_instruction(edit_start, 0, 0, 1); history_done = 0; } if (view) { if (!(editor = getenv("POWWOWPAGER")) && !(editor = getenv("PAGER"))) editor = "more"; } else { if (!(editor = getenv("POWWOWEDITOR")) && !(editor = getenv("EDITOR"))) editor = "emacs"; } if (editor[0] == '&') { waitforeditor = 0; editor++; } else waitforeditor = 1; if (waitforeditor) { tty_quit(); /* ignore SIGINT since interrupting the child would interrupt us too, if we are in the same tty group */ sig_permanent(SIGINT, SIG_IGN); sig_permanent(SIGCHLD, SIG_DFL); } switch(childpid = fork()) { /* let's get schizophrenic */ case 0: sprintf(command_str, "%s %s", editor, s->file); sprintf(buf, "TITLE=%s", s->descr); putenv(buf); /* setenv("TITLE", s->descr, 1);*/ execvp((char *)args[0], (char **)args); syserr("execve"); break; case -1: errmsg("fork"); free(s->descr); free(s->file); free(s); return; } s->pid = childpid; if (waitforeditor) { while ((i = waitpid(childpid, (int*)NULL, 0)) == -1 && errno == EINTR) ; signal_start(); /* reset SIGINT and SIGCHLD handlers */ tty_start(); if (s->fd != -1) { tty_gotoxy(0, lines - 1); tty_putc('\n'); } if (i == -1) errmsg("waitpid"); else finish_edit(s); free(s->descr); free(s->file); if (i != -1 && !edit_sess && *edit_end) { error = 0; parse_instruction(edit_end, 0, 0, 1); history_done = 0; } free(s); } else { s->next = edit_sess; edit_sess = s; } }
static void *thread_function(void *arg) { JNIEnv *env; jclass klass; jmethodID method; jobject instance; jthrowable exception; JavaVM *vm; ThreadFunctionArgs *pThreadArgs = (ThreadFunctionArgs *)arg; pThreadArgs->result = JNI_CreateJavaVM(&vm, (void **)&env, pThreadArgs->pVMArgs); *pThreadArgs->pvm = vm; if (pThreadArgs->result) { strcpy(pThreadArgs->message, "Failed to create Java virtual machine.\n"); signal_start(); return NULL; } klass = (*env)->FindClass(env, pThreadArgs->class_name); if ((*env)->ExceptionOccurred(env)) { snprintf(pThreadArgs->message, 256, "Failed to find class %s\n", pThreadArgs->class_name); pThreadArgs->result = -1; signal_start(); goto STOP_VM; } method = (*env)->GetMethodID(env, klass, "<init>", "()V"); if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); snprintf(pThreadArgs->message, 256, "%s has no default constructor\n", pThreadArgs->class_name); pThreadArgs->result = -2; signal_start(); goto STOP_VM; } instance = (*env)->NewObjectA(env, klass, method, NULL); if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); snprintf(pThreadArgs->message, 256, "Failed to construct %s\n", pThreadArgs->class_name); pThreadArgs->result = -3; signal_start(); goto STOP_VM; } signal_start(); method = (*env)->GetMethodID(env, klass, "run", "()V"); if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); snprintf(pThreadArgs->message, 256, "%s has no run method\n", pThreadArgs->class_name); pThreadArgs->result = -4; goto STOP_VM; } (*env)->CallVoidMethodA(env, instance, method, NULL); if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); snprintf(pThreadArgs->message, 256, "Failed to execute run method for %s\n", pThreadArgs->class_name); pThreadArgs->result = -5; goto STOP_VM; } STOP_VM: pthread_mutex_lock(&stop_mutex); while (stopped == 0) { pthread_cond_wait(&stop_cv, &stop_mutex); } started = 0; pthread_mutex_unlock(&stop_mutex); (*vm)->DestroyJavaVM(vm); return NULL; }