nuclear@23: #include nuclear@23: #include nuclear@23: #include nuclear@23: #include nuclear@23: #include nuclear@23: #include "logger.h" nuclear@23: nuclear@23: static void *thread_func(void *arg); nuclear@23: nuclear@23: static int pfd[2]; nuclear@23: static pthread_t thr; nuclear@23: static int initialized; nuclear@23: nuclear@23: int start_logger(void) nuclear@23: { nuclear@23: if(initialized) { nuclear@23: return 1; nuclear@23: } nuclear@23: nuclear@23: /* set stdout to line-buffered, and stderr to unbuffered */ nuclear@23: setvbuf(stdout, 0, _IOLBF, 0); nuclear@23: setvbuf(stderr, 0, _IONBF, 0); nuclear@23: nuclear@23: if(pipe(pfd) == -1) { nuclear@23: perror("failed to create logging pipe"); nuclear@23: return -1; nuclear@23: } nuclear@23: assert(pfd[0] > 2 && pfd[1] > 2); nuclear@23: nuclear@23: /* redirect stdout & stderr to the write-end of the pipe */ nuclear@23: dup2(pfd[1], 1); nuclear@23: dup2(pfd[1], 2); nuclear@23: nuclear@23: /* start the logging thread */ nuclear@23: if(pthread_create(&thr, 0, thread_func, 0) == -1) { nuclear@23: perror("failed to spawn logging thread"); nuclear@23: return -1; nuclear@23: } nuclear@23: pthread_detach(thr); nuclear@23: return 0; nuclear@23: } nuclear@23: nuclear@23: static void *thread_func(void *arg) nuclear@23: { nuclear@23: ssize_t rdsz; nuclear@23: char buf[257]; nuclear@23: nuclear@23: __android_log_print(ANDROID_LOG_DEBUG, APP_NAME, "logger starting up..."); nuclear@23: nuclear@23: while((rdsz = read(pfd[0], buf, sizeof buf - 1)) > 0) { nuclear@23: if(buf[rdsz - 1] == '\n') { nuclear@23: --rdsz; nuclear@23: } nuclear@23: buf[rdsz] = 0; nuclear@23: __android_log_write(ANDROID_LOG_DEBUG, APP_NAME, buf); nuclear@23: } nuclear@23: nuclear@23: __android_log_print(ANDROID_LOG_DEBUG, APP_NAME, "logger shutting down..."); nuclear@23: return 0; nuclear@23: }