1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
/*
* Copyright (c) 2005 Christophe Varoqui
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <pthread.h>
#include <sys/mman.h>
#include <memory.h>
#include "log_pthread.h"
#include "log.h"
void log_safe (int prio, char * fmt, va_list ap)
{
pthread_mutex_lock(logq_lock);
//va_start(ap, fmt);
log_enqueue(prio, fmt, ap);
va_end(ap);
pthread_mutex_unlock(logq_lock);
pthread_mutex_lock(logev_lock);
pthread_cond_signal(logev_cond);
pthread_mutex_unlock(logev_lock);
}
static void flush_logqueue (void)
{
int empty;
do {
pthread_mutex_lock(logq_lock);
empty = log_dequeue(la->buff);
pthread_mutex_unlock(logq_lock);
log_syslog(la->buff);
} while (empty == 0);
}
static void * log_thread (void * et)
{
mlockall(MCL_CURRENT | MCL_FUTURE);
logdbg(stderr,"enter log_thread\n");
while (1) {
pthread_mutex_lock(logev_lock);
pthread_cond_wait(logev_cond, logev_lock);
pthread_mutex_unlock(logev_lock);
flush_logqueue();
}
}
void log_thread_start (void)
{
pthread_attr_t attr;
logdbg(stderr,"enter log_thread_start\n");
logq_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
logev_lock = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
logev_cond = (pthread_cond_t *) malloc(sizeof(pthread_cond_t));
pthread_mutex_init(logq_lock, NULL);
pthread_mutex_init(logev_lock, NULL);
pthread_cond_init(logev_cond, NULL);
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 64 * 1024);
if (log_init("multipathd", 0)) {
fprintf(stderr,"can't initialize log buffer\n");
exit(1);
}
pthread_create(&log_thr, &attr, log_thread, NULL);
return;
}
void log_thread_stop (void)
{
logdbg(stderr,"enter log_thread_stop\n");
pthread_mutex_lock(logq_lock);
pthread_cancel(log_thr);
pthread_mutex_unlock(logq_lock);
flush_logqueue();
pthread_mutex_destroy(logq_lock);
pthread_mutex_destroy(logev_lock);
pthread_cond_destroy(logev_cond);
free_logarea();
}
|