Changeset 6e9e12b in mainline for uspace/srv/logger/namespace.c
- Timestamp:
- 2012-08-16T09:15:21Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0a6a996
- Parents:
- 669f5cae
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/logger/namespace.c
r669f5cae r6e9e12b 44 44 fibril_mutex_t guard; 45 45 size_t writers_count; 46 fibril_condvar_t reader_appeared_cv; 47 bool has_reader; 46 fibril_condvar_t level_changed_cv; 48 47 FILE *logfile; 49 log_level_t l ogfile_level;48 log_level_t level; 50 49 const char *name; 50 51 51 link_t link; 52 prodcons_t messages;53 52 }; 54 53 55 54 static FIBRIL_MUTEX_INITIALIZE(namespace_list_guard); 56 55 static LIST_INITIALIZE(namespace_list); 57 58 log_message_t *message_create(const char *name, log_level_t level)59 {60 log_message_t *message = malloc(sizeof(log_message_t));61 if (message == NULL)62 return NULL;63 64 message->message = str_dup(name);65 if (message->message == NULL) {66 free(message);67 return NULL;68 }69 70 message->level = level;71 link_initialize(&message->link);72 73 return message;74 }75 76 void message_destroy(log_message_t *message)77 {78 assert(message);79 free(message->message);80 free(message);81 }82 56 83 57 static logging_namespace_t *namespace_find_no_lock(const char *name) … … 126 100 } 127 101 128 namespace->l ogfile_level = get_default_logging_level();102 namespace->level = get_default_logging_level(); 129 103 130 104 fibril_mutex_initialize(&namespace->guard); 131 fibril_condvar_initialize(&namespace->reader_appeared_cv); 132 prodcons_initialize(&namespace->messages); 133 namespace->has_reader = false; 105 fibril_condvar_initialize(&namespace->level_changed_cv); 134 106 namespace->writers_count = 0; 135 107 link_initialize(&namespace->link); … … 161 133 162 134 fibril_mutex_lock(&namespace->guard); 163 if (namespace-> has_reader || (namespace->writers_count > 0)) {135 if (namespace->writers_count > 0) { 164 136 fibril_mutex_unlock(&namespace->guard); 165 137 fibril_mutex_unlock(&namespace_list_guard); … … 183 155 } 184 156 185 logging_namespace_t *namespace_reader_attach(const char *name)186 {187 logging_namespace_t *namespace = NULL;188 189 fibril_mutex_lock(&namespace_list_guard);190 191 namespace = namespace_find_no_lock(name);192 193 if (namespace != NULL) {194 fibril_mutex_lock(&namespace->guard);195 namespace->has_reader = true;196 fibril_condvar_broadcast(&namespace->reader_appeared_cv);197 fibril_mutex_unlock(&namespace->guard);198 }199 200 fibril_mutex_unlock(&namespace_list_guard);201 202 return namespace;203 }204 205 157 logging_namespace_t *namespace_writer_attach(const char *name) 206 158 { … … 224 176 } 225 177 226 void namespace_reader_detach(logging_namespace_t *namespace)227 {228 fibril_mutex_lock(&namespace->guard);229 namespace->has_reader = false;230 fibril_condvar_broadcast(&namespace->reader_appeared_cv);231 fibril_mutex_unlock(&namespace->guard);232 233 namespace_destroy_careful(namespace);234 }235 236 178 void namespace_writer_detach(logging_namespace_t *namespace) 237 179 { … … 247 189 { 248 190 fibril_mutex_lock(&namespace->guard); 249 bool has_reader = namespace->has_reader 250 || level <= namespace->logfile_level; 191 bool has_reader = level <= namespace->level; 251 192 fibril_mutex_unlock(&namespace->guard); 252 193 return has_reader; … … 256 197 { 257 198 fibril_mutex_lock(&namespace->guard); 258 bool had_reader = namespace->has_reader;259 while ( had_reader == namespace->has_reader) {260 fibril_condvar_wait(&namespace-> reader_appeared_cv, &namespace->guard);261 } 262 *has_reader_now = namespace->has_reader;199 log_level_t previous_level = namespace->level; 200 while (previous_level == namespace->level) { 201 fibril_condvar_wait(&namespace->level_changed_cv, &namespace->guard); 202 } 203 *has_reader_now = true; 263 204 fibril_mutex_unlock(&namespace->guard); 264 205 } … … 267 208 void namespace_add_message(logging_namespace_t *namespace, const char *message, log_level_t level) 268 209 { 269 if (level <= get_default_logging_level()) {210 if (level <= namespace->level) { 270 211 printf("[%s %d]: %s\n", namespace->name, level, message); 271 }272 if (level <= namespace->logfile_level) {273 212 fprintf(namespace->logfile, "[%d]: %s\n", level, message); 274 213 fflush(namespace->logfile); 275 } 276 277 fibril_mutex_lock(&namespace->guard); 278 if (namespace->has_reader) { 279 log_message_t *msg = message_create(message, level); 280 if (msg != NULL) { 281 prodcons_produce(&namespace->messages, &msg->link); 282 } 283 } 284 fibril_mutex_unlock(&namespace->guard); 285 } 286 287 log_message_t *namespace_get_next_message(logging_namespace_t *namespace) 288 { 289 link_t *message = prodcons_consume(&namespace->messages); 290 291 return list_get_instance(message, log_message_t, link); 214 fflush(stdout); 215 } 292 216 } 293 217
Note:
See TracChangeset
for help on using the changeset viewer.