Changeset f039dba in mainline for uspace/srv/logger/logs.c
- Timestamp:
- 2012-08-17T09:57:27Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b1912b0c
- Parents:
- f72ae3b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/logger/logs.c
rf72ae3b rf039dba 37 37 #include "logger.h" 38 38 39 static FIBRIL_MUTEX_INITIALIZE(toplog_list_guard);40 static LIST_INITIALIZE(toplog_list);41 39 42 static logger_toplevel_log_t *find_log_by_name_no_lock(const char *name) 40 static FIBRIL_MUTEX_INITIALIZE(log_list_guard); 41 static LIST_INITIALIZE(log_list); 42 43 44 static logger_log_t *find_log_by_name_and_parent_no_lock(const char *name, logger_log_t *parent) 43 45 { 44 list_foreach(toplog_list, it) { 45 logger_toplevel_log_t *log = list_get_instance(it, logger_toplevel_log_t, link); 46 if (str_cmp(log->name, name) == 0) { 47 return log; 48 } 49 } 50 51 return NULL; 52 } 53 54 logger_toplevel_log_t *find_or_create_toplevel_log(const char *name) 55 { 56 logger_toplevel_log_t *result = NULL; 57 58 fibril_mutex_lock(&toplog_list_guard); 59 60 result = find_log_by_name_no_lock(name); 61 if (result != NULL) 62 goto leave; 63 64 result = malloc(sizeof(logger_toplevel_log_t)); 65 if (result == NULL) 66 goto leave; 67 68 char *logfilename; 69 asprintf(&logfilename, "/log/%s", name); 70 result->logfile = fopen(logfilename, "a"); 71 result->logged_level = LOG_LEVEL_USE_DEFAULT; 72 result->name = str_dup(name); 73 result->sublog_count = 1; 74 result->sublogs[0].name = ""; 75 result->sublogs[0].logged_level = LOG_LEVEL_USE_DEFAULT; 76 77 link_initialize(&result->link); 78 79 list_append(&result->link, &toplog_list); 80 81 leave: 82 fibril_mutex_unlock(&toplog_list_guard); 83 84 return result; 85 } 86 87 logger_toplevel_log_t *find_toplevel_log(sysarg_t id) 88 { 89 list_foreach(toplog_list, it) { 90 logger_toplevel_log_t *log = list_get_instance(it, logger_toplevel_log_t, link); 91 if ((sysarg_t) log == id) 46 list_foreach(log_list, it) { 47 logger_log_t *log = list_get_instance(it, logger_log_t, link); 48 if ((parent == log->parent) && (str_cmp(log->name, name) == 0)) 92 49 return log; 93 50 } … … 96 53 } 97 54 98 bool shall_log_message(logger_toplevel_log_t *toplog, sysarg_t log, log_level_t level)55 static logger_dest_t *create_dest(const char *name) 99 56 { 100 if (log >= toplog->sublog_count) 101 return false; 57 logger_dest_t *result = malloc(sizeof(logger_dest_t)); 58 char *logfilename; 59 asprintf(&logfilename, "/log/%s", name); 60 result->logfile = fopen(logfilename, "a"); 61 return result; 62 } 102 63 103 log_level_t logged_level = toplog->sublogs[log].logged_level; 104 if (logged_level == LOG_LEVEL_USE_DEFAULT) { 105 logged_level = toplog->logged_level; 106 if (logged_level == LOG_LEVEL_USE_DEFAULT) 107 logged_level = get_default_logging_level(); 108 } 64 logger_log_t *find_or_create_log(const char *name, sysarg_t parent_id) 65 { 66 logger_log_t *result = NULL; 67 logger_log_t *parent = (logger_log_t *) parent_id; 68 69 fibril_mutex_lock(&log_list_guard); 70 71 result = find_log_by_name_and_parent_no_lock(name, parent); 72 if (result != NULL) 73 goto leave; 74 75 result = malloc(sizeof(logger_log_t)); 76 if (result == NULL) 77 goto leave; 109 78 110 79 111 return level <= logged_level; 80 result->logged_level = LOG_LEVEL_USE_DEFAULT; 81 result->name = str_dup(name); 82 if (parent == NULL) { 83 result->full_name = str_dup(name); 84 result->dest = create_dest(name); 85 } else { 86 asprintf(&result->full_name, "%s/%s", parent->full_name, name); 87 result->dest = parent->dest; 88 } 89 result->parent = parent; 90 91 link_initialize(&result->link); 92 93 list_append(&result->link, &log_list); 94 95 leave: 96 fibril_mutex_unlock(&log_list_guard); 97 98 return result; 112 99 } 113 100 114 int add_sub_log(logger_toplevel_log_t *toplog, const char *name, sysarg_t *id)101 logger_log_t *find_log_by_name(const char *name) 115 102 { 116 if (toplog->sublog_count >= MAX_SUBLOGS) 117 return ELIMIT; 103 logger_log_t *result = NULL; 118 104 119 logger_sublog_t *sublog = &toplog->sublogs[toplog->sublog_count]; 120 sublog->name = str_dup(name); 121 sublog->logged_level = toplog->logged_level; 105 fibril_mutex_lock(&log_list_guard); 106 list_foreach(log_list, it) { 107 logger_log_t *log = list_get_instance(it, logger_log_t, link); 108 if (str_cmp(log->full_name, name) == 0) { 109 result = log; 110 break; 111 } 112 } 113 fibril_mutex_unlock(&log_list_guard); 122 114 123 *id = toplog->sublog_count; 124 125 toplog->sublog_count++; 126 127 return EOK; 115 return result; 128 116 } 129 117 118 logger_log_t *find_log_by_id(sysarg_t id) 119 { 120 logger_log_t *result = NULL; 121 122 fibril_mutex_lock(&log_list_guard); 123 list_foreach(log_list, it) { 124 logger_log_t *log = list_get_instance(it, logger_log_t, link); 125 if ((sysarg_t) log == id) { 126 result = log; 127 break; 128 } 129 } 130 fibril_mutex_unlock(&log_list_guard); 131 132 return result; 133 } 134 135 static log_level_t get_actual_log_level(logger_log_t *log) 136 { 137 /* Find recursively proper log level. */ 138 if (log->logged_level == LOG_LEVEL_USE_DEFAULT) { 139 if (log->parent == NULL) 140 return get_default_logging_level(); 141 else 142 return get_actual_log_level(log->parent); 143 } 144 return log->logged_level; 145 } 146 147 bool shall_log_message(logger_log_t *log, log_level_t level) 148 { 149 return level <= get_actual_log_level(log); 150 } 130 151 131 152 /**
Note:
See TracChangeset
for help on using the changeset viewer.