2 * Copyright (c) 2005 Christophe Varoqui
13 #include "log_pthread.h"
19 pthread_mutex_t logq_lock;
20 pthread_mutex_t logev_lock;
21 pthread_cond_t logev_cond;
28 pthread_mutex_lock(&logq_lock);
29 log_reset("multipathd");
30 pthread_mutex_unlock(&logq_lock);
33 void log_safe (int prio, const char * fmt, va_list ap)
37 if (log_thr == (pthread_t)0) {
38 syslog(prio, fmt, ap);
42 block_signal(SIGUSR1, &old);
43 block_signal(SIGHUP, NULL);
45 pthread_mutex_lock(&logq_lock);
46 log_enqueue(prio, fmt, ap);
47 pthread_mutex_unlock(&logq_lock);
49 pthread_mutex_lock(&logev_lock);
50 pthread_cond_signal(&logev_cond);
51 pthread_mutex_unlock(&logev_lock);
53 pthread_sigmask(SIG_SETMASK, &old, NULL);
56 void log_thread_flush (void)
61 pthread_mutex_lock(&logq_lock);
62 empty = log_dequeue(la->buff);
63 pthread_mutex_unlock(&logq_lock);
69 static void flush_logqueue (void)
74 pthread_mutex_lock(&logq_lock);
75 empty = log_dequeue(la->buff);
76 pthread_mutex_unlock(&logq_lock);
82 static void * log_thread (void * et)
87 sig.sa_handler = sigusr1;
88 sigemptyset(&sig.sa_mask);
90 if (sigaction(SIGUSR1, &sig, NULL) < 0)
91 logdbg(stderr, "Cannot set signal handler");
93 pthread_mutex_lock(&logev_lock);
95 pthread_mutex_unlock(&logev_lock);
97 mlockall(MCL_CURRENT | MCL_FUTURE);
98 logdbg(stderr,"enter log_thread\n");
101 pthread_mutex_lock(&logev_lock);
102 pthread_cond_wait(&logev_cond, &logev_lock);
103 running = logq_running;
104 pthread_mutex_unlock(&logev_lock);
112 void log_thread_start (pthread_attr_t *attr)
114 logdbg(stderr,"enter log_thread_start\n");
116 pthread_mutex_init(&logq_lock, NULL);
117 pthread_mutex_init(&logev_lock, NULL);
118 pthread_cond_init(&logev_cond, NULL);
120 if (log_init("multipathd", 0)) {
121 fprintf(stderr,"can't initialize log buffer\n");
124 if (pthread_create(&log_thr, attr, log_thread, NULL)) {
125 fprintf(stderr,"can't start log thread\n");
132 void log_thread_stop (void)
134 logdbg(stderr,"enter log_thread_stop\n");
136 pthread_mutex_lock(&logev_lock);
138 pthread_cond_signal(&logev_cond);
139 pthread_mutex_unlock(&logev_lock);
141 pthread_mutex_lock(&logq_lock);
142 pthread_cancel(log_thr);
143 pthread_mutex_unlock(&logq_lock);
144 pthread_join(log_thr, NULL);
145 log_thr = (pthread_t)0;
149 pthread_mutex_destroy(&logq_lock);
150 pthread_mutex_destroy(&logev_lock);
151 pthread_cond_destroy(&logev_cond);