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