Changeset 793cce15 in mainline for uspace/srv/logger/namespace.c


Ignore:
Timestamp:
2012-08-16T14:22:56Z (12 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
32b26cf7
Parents:
9a53e00
Message:

Add logging contexts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/logger/namespace.c

    r9a53e00 r793cce15  
    4141 */
    4242
     43#define CONTEXT_SIZE 16
     44
     45typedef struct {
     46        const char *name;
     47        log_level_t level;
     48} logging_context_t;
    4349
    4450struct logging_namespace {
     
    5056        const char *name;
    5157
     58        // FIXME: make dynamic
     59        size_t context_count;
     60        logging_context_t context[CONTEXT_SIZE];
     61
    5262        link_t link;
    5363};
     
    5666static LIST_INITIALIZE(namespace_list);
    5767
    58 static log_level_t namespace_get_actual_log_level(logging_namespace_t *namespace)
    59 {
    60         fibril_mutex_lock(&namespace->guard);
    61         log_level_t level = namespace->level;
     68static log_level_t namespace_get_actual_log_level(logging_namespace_t *namespace, sysarg_t context)
     69{
     70        fibril_mutex_lock(&namespace->guard);
     71        if (context >= namespace->context_count) {
     72                fibril_mutex_unlock(&namespace->guard);
     73                return LVL_FATAL;
     74        }
     75        log_level_t level = namespace->context[context].level;
    6276        fibril_mutex_unlock(&namespace->guard);
    6377
     
    115129        namespace->level = LOG_LEVEL_USE_DEFAULT;
    116130
     131        namespace->context_count = 1;
     132        namespace->context[0].name = "";
     133        namespace->context[0].level = LOG_LEVEL_USE_DEFAULT;
     134
    117135        fibril_mutex_initialize(&namespace->guard);
    118136        fibril_condvar_initialize(&namespace->level_changed_cv);
     
    206224        fibril_mutex_lock(&namespace->guard);
    207225        namespace->level = level;
     226        for (size_t i = 0; i < namespace->context_count; i++) {
     227                namespace->context[i].level = level;
     228        }
    208229        fibril_condvar_broadcast(&namespace->level_changed_cv);
    209230        fibril_mutex_unlock(&namespace->guard);
     
    213234
    214235
    215 bool namespace_has_reader(logging_namespace_t *namespace, log_level_t level)
    216 {
    217         return level <= namespace_get_actual_log_level(namespace);
     236bool namespace_has_reader(logging_namespace_t *namespace, sysarg_t context, log_level_t level)
     237{
     238        return level <= namespace_get_actual_log_level(namespace, context);
     239}
     240
     241int namespace_create_context(logging_namespace_t *namespace, const char *name)
     242{
     243        int rc;
     244        fibril_mutex_lock(&namespace->guard);
     245        if (namespace->context_count >= CONTEXT_SIZE) {
     246                rc = ELIMIT;
     247                goto leave;
     248        }
     249
     250        namespace->context[namespace->context_count].level
     251            = LOG_LEVEL_USE_DEFAULT;
     252        namespace->context[namespace->context_count].name
     253            = str_dup(name);
     254        if (namespace->context[namespace->context_count].name == NULL) {
     255                rc = ENOMEM;
     256                goto leave;
     257        }
     258        rc = (int) namespace->context_count;
     259        namespace->context_count++;
     260
     261
     262leave:
     263        fibril_mutex_unlock(&namespace->guard);
     264        return rc;
    218265}
    219266
     
    230277
    231278
    232 void namespace_add_message(logging_namespace_t *namespace, const char *message, log_level_t level)
    233 {
    234         if (level <= namespace_get_actual_log_level(namespace)) {
     279void namespace_add_message(logging_namespace_t *namespace, const char *message, sysarg_t context, log_level_t level)
     280{
     281        if (level <= namespace_get_actual_log_level(namespace, context)) {
    235282                const char *level_name = log_level_str(level);
    236                 printf("[%s %s]: %s\n", namespace->name, level_name, message);
    237                 fprintf(namespace->logfile, "%s: %s\n", level_name, message);
     283                if (context == 0) {
     284                        printf("[%s %s]: %s\n",
     285                            namespace->name, level_name, message);
     286                        fprintf(namespace->logfile, "%s: %s\n",
     287                            level_name, message);
     288                } else {
     289                        const char *context_name = namespace->context[context].name;
     290                        printf("[%s/%s %s]: %s\n",
     291                            namespace->name, context_name, level_name, message);
     292                        fprintf(namespace->logfile, "[%s] %s: %s\n",
     293                            context_name, level_name, message);
     294                }
    238295                fflush(namespace->logfile);
    239296                fflush(stdout);
Note: See TracChangeset for help on using the changeset viewer.