ndktest

annotate src/logger.c @ 0:1310df7cdf25

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Apr 2015 20:54:02 +0300
parents
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <assert.h>
nuclear@0 3 #include <unistd.h>
nuclear@0 4 #include <pthread.h>
nuclear@0 5 #include <android/log.h>
nuclear@0 6 #include "logger.h"
nuclear@0 7 #include "app.h"
nuclear@0 8
nuclear@0 9 static void *thread_func(void *arg);
nuclear@0 10
nuclear@0 11 static int pfd[2];
nuclear@0 12 static pthread_t thr;
nuclear@0 13 static int initialized;
nuclear@0 14
nuclear@0 15 int start_logger(void)
nuclear@0 16 {
nuclear@0 17 if(initialized) {
nuclear@0 18 return 1;
nuclear@0 19 }
nuclear@0 20
nuclear@0 21 /* set stdout to line-buffered, and stderr to unbuffered */
nuclear@0 22 setvbuf(stdout, 0, _IOLBF, 0);
nuclear@0 23 setvbuf(stderr, 0, _IONBF, 0);
nuclear@0 24
nuclear@0 25 if(pipe(pfd) == -1) {
nuclear@0 26 perror("failed to create logging pipe");
nuclear@0 27 return -1;
nuclear@0 28 }
nuclear@0 29 assert(pfd[0] > 2 && pfd[1] > 2);
nuclear@0 30
nuclear@0 31 /* redirect stdout & stderr to the write-end of the pipe */
nuclear@0 32 dup2(pfd[1], 1);
nuclear@0 33 dup2(pfd[1], 2);
nuclear@0 34
nuclear@0 35 /* start the logging thread */
nuclear@0 36 if(pthread_create(&thr, 0, thread_func, 0) == -1) {
nuclear@0 37 perror("failed to spawn logging thread");
nuclear@0 38 return -1;
nuclear@0 39 }
nuclear@0 40 pthread_detach(thr);
nuclear@0 41 return 0;
nuclear@0 42 }
nuclear@0 43
nuclear@0 44 static void *thread_func(void *arg)
nuclear@0 45 {
nuclear@0 46 ssize_t rdsz;
nuclear@0 47 char buf[257];
nuclear@0 48
nuclear@0 49 __android_log_print(ANDROID_LOG_DEBUG, APP_NAME, "logger starting up...");
nuclear@0 50
nuclear@0 51 while((rdsz = read(pfd[0], buf, sizeof buf - 1)) > 0) {
nuclear@0 52 if(buf[rdsz - 1] == '\n') {
nuclear@0 53 --rdsz;
nuclear@0 54 }
nuclear@0 55 buf[rdsz] = 0;
nuclear@0 56 __android_log_write(ANDROID_LOG_DEBUG, APP_NAME, buf);
nuclear@0 57 }
nuclear@0 58
nuclear@0 59 __android_log_print(ANDROID_LOG_DEBUG, APP_NAME, "logger shutting down...");
nuclear@0 60 return 0;
nuclear@0 61 }