2 * @file logger_manager.c
4 * @brief Logger manager. Manages globaly all logger objects
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24 #include "logger_manager.h"
26 #include "allocator.h"
27 #include "linked_list.h"
30 * Maximum length of a logger name
32 #define MAX_LOGGER_NAME 45
34 typedef struct private_logger_manager_s private_logger_manager_t
;
35 struct private_logger_manager_s
{
39 logger_manager_t
public;
44 linked_list_t
*loggers
;
49 linked_list_t
*logger_levels
;
52 * Used to manage logger list.
54 pthread_mutex_t mutex
;
57 * Default logger level for a created logger used if no specific logger_level is set
59 logger_level_t default_log_level
;
62 * Sets set logger_level of a specific context.
63 * @param this calling object
64 * @param context context to set level
65 * @param logger_level logger_level to set
66 * @param enable enable specific level or disable it
69 status_t (*set_logger_level
) (private_logger_manager_t
*this, logger_context_t context
,logger_level_t logger_level
,bool enable
);
74 * Entry in the logger_levels linked list
76 typedef struct logger_levels_entry_s logger_levels_entry_t
;
78 struct logger_levels_entry_s
{
79 logger_context_t context
;
84 * Entry in the loggers linked list
86 typedef struct loggers_entry_s loggers_entry_t
;
88 struct loggers_entry_s
{
89 logger_context_t context
;
94 * Implements logger_manager_t-function create_logger.
95 * @see logger_manager_s.create_logger.
97 static logger_t
*create_logger(private_logger_manager_t
*this, logger_context_t context
, char * name
)
101 FILE * output
= NULL
;
102 char buffer
[MAX_LOGGER_NAME
];
103 loggers_entry_t
*entry
;
105 logger_level_t logger_level
= this->public.get_logger_level(&(this->public),context
);
110 context_name
= "PARSER";
113 context_name
= "GENERATOR";
116 context_name
= "IKE_SA";
119 context_name
= "MESSAGE";
122 context_name
= "WORKER_THREAD";
125 context_name
= "EVENT_THREAD";
128 context_name
= "SENDER_THREAD";
130 case RECEIVER_THREAD
:
131 context_name
= "RECEIVER_THREAD";
134 context_name
= "THREAD_POOL";
137 context_name
= "TESTER";
141 context_name
= "NO CONTEXT";
145 pthread_mutex_lock(&(this->mutex
));
148 snprintf(buffer
, MAX_LOGGER_NAME
, "%s - %s",context_name
,name
);
149 /* create logger with default log_level */
150 logger
= logger_create(buffer
,logger_level
,output
);
154 logger
= logger_create(context_name
,logger_level
,output
);
160 pthread_mutex_unlock(&(this->mutex
));
164 entry
= allocator_alloc_thing(loggers_entry_t
);
168 logger
->destroy(logger
);
169 pthread_mutex_unlock(&(this->mutex
));
173 entry
->context
= context
;
174 entry
->logger
= logger
;
176 if (this->loggers
->insert_last(this->loggers
,entry
) != SUCCESS
)
178 allocator_free(entry
);
179 logger
->destroy(logger
);
180 pthread_mutex_unlock(&(this->mutex
));
184 pthread_mutex_unlock(&(this->mutex
));
189 static logger_level_t
get_logger_level (private_logger_manager_t
*this, logger_context_t context
)
191 linked_list_iterator_t
*iterator
;
192 logger_level_t logger_level
= this->default_log_level
;
194 pthread_mutex_lock(&(this->mutex
));
196 if (this->logger_levels
->create_iterator(this->logger_levels
,&iterator
,TRUE
) != SUCCESS
)
198 pthread_mutex_unlock(&(this->mutex
));
201 while (iterator
->has_next(iterator
))
204 logger_levels_entry_t
* entry
;
205 if (iterator
->current(iterator
,(void **)&entry
) != SUCCESS
)
209 if (entry
->context
== context
)
211 logger_level
= entry
->level
;
216 iterator
->destroy(iterator
);
218 pthread_mutex_unlock(&(this->mutex
));
223 * Implements logger_manager_t-function destroy_logger.
224 * @see logger_manager_s.destroy_logger.
226 static status_t
destroy_logger (private_logger_manager_t
*this,logger_t
*logger
)
229 linked_list_iterator_t
*iterator
;
232 pthread_mutex_lock(&(this->mutex
));
233 if (this->loggers
->create_iterator(this->loggers
,&iterator
,TRUE
) != SUCCESS
)
235 pthread_mutex_unlock(&(this->mutex
));
239 while (iterator
->has_next(iterator
))
242 loggers_entry_t
* entry
;
243 status
= iterator
->current(iterator
,(void **)&entry
);
244 if (status
!= SUCCESS
)
249 if (entry
->logger
== logger
)
251 this->loggers
->remove(this->loggers
,iterator
);
252 allocator_free(entry
);
253 logger
->destroy(logger
);
258 iterator
->destroy(iterator
);
259 pthread_mutex_unlock(&(this->mutex
));
264 * Implements private_logger_manager_t-function set_logger_level.
265 * @see private_logger_manager_s.set_logger_level.
267 static status_t
set_logger_level (private_logger_manager_t
*this, logger_context_t context
,logger_level_t logger_level
,bool enable
)
270 linked_list_iterator_t
*iterator
;
273 pthread_mutex_lock(&(this->mutex
));
274 if (this->logger_levels
->create_iterator(this->logger_levels
,&iterator
,TRUE
) != SUCCESS
)
276 pthread_mutex_unlock(&(this->mutex
));
281 while (iterator
->has_next(iterator
))
283 logger_levels_entry_t
* entry
;
284 status
= iterator
->current(iterator
,(void **)&entry
);
285 if (status
!= SUCCESS
)
287 iterator
->destroy(iterator
);
288 pthread_mutex_unlock(&(this->mutex
));
292 if (entry
->context
== context
)
296 entry
->level
|= logger_level
;
300 entry
->level
&= ~logger_level
;
307 iterator
->destroy(iterator
);
309 if (status
== NOT_FOUND
)
312 logger_levels_entry_t
*entry
= allocator_alloc_thing(logger_levels_entry_t
);
315 pthread_mutex_unlock(&(this->mutex
));
318 entry
->context
= context
;
319 entry
->level
= (enable
) ? logger_level
: this->default_log_level
;
321 status
= this->logger_levels
->insert_last(this->logger_levels
,entry
);
322 if (status
!= SUCCESS
)
324 pthread_mutex_unlock(&(this->mutex
));
329 if (this->loggers
->create_iterator(this->loggers
,&iterator
,TRUE
) != SUCCESS
)
331 pthread_mutex_unlock(&(this->mutex
));
335 while (iterator
->has_next(iterator
))
338 loggers_entry_t
* entry
;
339 status
= iterator
->current(iterator
,(void **)&entry
);
340 if (status
!= SUCCESS
)
342 iterator
->destroy(iterator
);
343 pthread_mutex_unlock(&(this->mutex
));
346 if (entry
->context
== context
)
350 status
= entry
->logger
->enable_level(entry
->logger
,logger_level
);
354 status
= entry
->logger
->disable_level(entry
->logger
,logger_level
);
360 iterator
->destroy(iterator
);
361 pthread_mutex_unlock(&(this->mutex
));
366 * Implements logger_manager_t-function enable_logger_level.
367 * @see logger_manager_s.enable_logger_level.
369 static status_t
enable_logger_level (private_logger_manager_t
*this, logger_context_t context
,logger_level_t logger_level
)
371 return set_logger_level(this,context
,logger_level
,TRUE
);
375 * Implements logger_manager_t-function disable_logger_level.
376 * @see logger_manager_s.disable_logger_level.
378 static status_t
disable_logger_level (private_logger_manager_t
*this, logger_context_t context
,logger_level_t logger_level
)
380 return set_logger_level(this,context
,logger_level
,FALSE
);
384 * Implements logger_manager_t-function destroy.
385 * @see logger_manager_s.destroy.
387 static status_t
destroy(private_logger_manager_t
*this)
389 while (this->loggers
->get_count(this->loggers
) > 0)
391 loggers_entry_t
*current_entry
;
393 this->loggers
->remove_first(this->loggers
,(void **)¤t_entry
);
395 /* destroy logger object */
396 current_entry
->logger
->destroy(current_entry
->logger
);
398 /* entry can be destroyed */
399 allocator_free(current_entry
);
402 while (this->logger_levels
->get_count(this->logger_levels
) > 0)
404 logger_levels_entry_t
*current_entry
;
406 this->logger_levels
->remove_first(this->logger_levels
,(void **)¤t_entry
);
408 /* entry can be destroyed */
409 allocator_free(current_entry
);
412 this->loggers
->destroy(this->loggers
);
413 this->logger_levels
->destroy(this->logger_levels
);
414 pthread_mutex_destroy(&(this->mutex
));
416 allocator_free(this);
421 * Described in header
423 logger_manager_t
*logger_manager_create(logger_level_t default_log_level
)
425 private_logger_manager_t
*this = allocator_alloc_thing(private_logger_manager_t
);
432 this->public.create_logger
= (logger_t
*(*)(logger_manager_t
*,logger_context_t context
, char *))create_logger
;
433 this->public.destroy_logger
= (status_t(*)(logger_manager_t
*,logger_t
*logger
))destroy_logger
;
434 this->public.destroy
= (status_t(*)(logger_manager_t
*))destroy
;
435 this->public.get_logger_level
= (logger_level_t (*)(logger_manager_t
*, logger_context_t
)) get_logger_level
;
436 this->public.enable_logger_level
= (status_t (*)(logger_manager_t
*, logger_context_t
,logger_level_t
)) enable_logger_level
;
437 this->public.disable_logger_level
= (status_t (*)(logger_manager_t
*, logger_context_t
,logger_level_t
)) disable_logger_level
;
438 this->set_logger_level
= (status_t (*)(private_logger_manager_t
*, logger_context_t
,logger_level_t
,bool)) set_logger_level
;
440 /* private variables */
441 this->loggers
= linked_list_create();
443 if (this->loggers
== NULL
)
445 allocator_free(this);
448 this->logger_levels
= linked_list_create();
449 if (this->logger_levels
== NULL
)
451 this->loggers
->destroy(this->loggers
);
452 allocator_free(this);
455 this->default_log_level
= default_log_level
;
457 pthread_mutex_init(&(this->mutex
), NULL
);
459 return (logger_manager_t
*)this;