static void opd_shutdown(struct op_buffer_head * buf, size_t size, struct op_note * nbuf, size_t nsize) { ssize_t count = -1; ssize_t ncount = -1; if (fcntl(devfd, F_SETFL, fcntl(devfd, F_GETFL) | O_NONBLOCK) < 0) { perror("Failed to set non-blocking read for device: "); exit(EXIT_FAILURE); } while (ncount < 0) ncount = op_read_device(notedevfd, nbuf, nsize); if (ncount > 0) opd_do_notes(nbuf, ncount); while (1) { count = op_read_device(devfd, buf, size); if (count < 0 && errno == EAGAIN) break; verbprintf(vmisc, "Shutting down, state %d\n", buf->state); opd_do_samples(buf); } }
static void opd_do_read(struct op_buffer_head * buf, size_t size, struct op_note * nbuf, size_t nsize) { while (1) { ssize_t count = -1; ssize_t ncount = -1; while (count < 0) count = op_read_device(devfd, buf, size); while (ncount < 0) ncount = op_read_device(notedevfd, nbuf, nsize); opd_do_notes(nbuf, ncount); opd_do_samples(buf); if (signal_alarm) { signal_alarm = 0; opd_alarm(); } if (signal_hup) { signal_hup = 0; opd_sighup(); } if (signal_term) opd_sigterm(); if (buf->state == STOPPING) { verbprintf(vmisc, "Shutting down by request.\n"); opd_shutdown(buf, size, nbuf, nsize); return; } } }
/** * opd_do_read - enter processing loop * @param buf buffer to read into * @param size size of buffer * * Read some of a buffer from the device and process * the contents. */ static void opd_do_read(char * buf, size_t size) { opd_open_pipe(); while (1) { ssize_t count = -1; /* loop to handle EINTR */ while (count < 0) { count = op_read_device(devfd, buf, size); /* we can lose an alarm or a hup but * we don't care. */ if (signal_alarm) { signal_alarm = 0; opd_alarm(); } if (signal_hup) { signal_hup = 0; opd_sighup(); } if (signal_term) opd_sigterm(); if (signal_child) opd_sigchild(); if (signal_usr1) { signal_usr1 = 0; perfmon_start(); } if (signal_usr2) { signal_usr2 = 0; perfmon_stop(); } if (is_jitconv_requested()) { verbprintf(vmisc, "Start opjitconv was triggered\n"); opd_do_jitdumps(); } } opd_do_samples(buf, count); } opd_close_pipe(); }
/** * opd_do_read - enter processing loop * @param buf buffer to read into * @param size size of buffer * * Read some of a buffer from the device and process * the contents. */ static void opd_do_read(char * buf, size_t size) { while (1) { ssize_t count = -1; /* loop to handle EINTR */ while (count < 0) { count = op_read_device(devfd, buf, size); /* we can lose an alarm or a hup but * we don't care. */ if (signal_alarm) { signal_alarm = 0; opd_alarm(); } if (signal_hup) { signal_hup = 0; opd_sighup(); } if (signal_term) opd_sigterm(); if (signal_usr1) { signal_usr1 = 0; perfmon_start(); } if (signal_usr2) { signal_usr2 = 0; perfmon_stop(); } } opd_do_samples(buf, count); } }