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