Changeset 793cce15 in mainline for uspace/srv/logger


Ignore:
Timestamp:
2012-08-16T14:22:56Z (13 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

Location:
uspace/srv/logger
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/logger/logger.h

    r9a53e00 r793cce15  
    5757
    5858void namespace_wait_for_reader_change(logging_namespace_t *, bool *);
    59 bool namespace_has_reader(logging_namespace_t *, log_level_t);
    60 void namespace_add_message(logging_namespace_t *, const char *, log_level_t);
     59bool namespace_has_reader(logging_namespace_t *, sysarg_t, log_level_t);
     60void namespace_add_message(logging_namespace_t *, const char *, sysarg_t, log_level_t);
     61
     62int namespace_create_context(logging_namespace_t *, const char *);
    6163
    6264log_level_t get_default_logging_level(void);
  • uspace/srv/logger/main.c

    r9a53e00 r793cce15  
    126126}
    127127
    128 static int handle_receive_message(logging_namespace_t *namespace, int level)
    129 {
    130         bool skip_message = !namespace_has_reader(namespace, level);
     128static int handle_receive_message(logging_namespace_t *namespace, sysarg_t context, int level)
     129{
     130        bool skip_message = !namespace_has_reader(namespace, context, level);
    131131        if (skip_message) {
    132132                /* Abort the actual message buffer transfer. */
     
    147147        }
    148148
    149         namespace_add_message(namespace, message, level);
     149        namespace_add_message(namespace, message, context, level);
    150150
    151151        free(message);
    152152
     153        return EOK;
     154}
     155
     156static int handle_create_context(logging_namespace_t *namespace, sysarg_t *idx)
     157{
     158        void *name;
     159        int rc = async_data_write_accept(&name, true, 0, 0, 0, NULL);
     160        if (rc != EOK) {
     161                return rc;
     162        }
     163
     164        rc = namespace_create_context(namespace, name);
     165
     166        free(name);
     167
     168        if (rc < 0)
     169                return rc;
     170
     171        *idx = (sysarg_t) rc;
    153172        return EOK;
    154173}
     
    166185
    167186                int rc;
     187                sysarg_t arg = 0;
    168188
    169189                switch (IPC_GET_IMETHOD(call)) {
     190                case LOGGER_CREATE_CONTEXT:
     191                        rc = handle_create_context(namespace, &arg);
     192                        async_answer_1(callid, rc, arg);
     193                        break;
    170194                case LOGGER_MESSAGE:
    171                         rc = handle_receive_message(namespace, IPC_GET_ARG1(call));
     195                        rc = handle_receive_message(namespace, IPC_GET_ARG1(call), IPC_GET_ARG2(call));
    172196                        async_answer_0(callid, rc);
    173197                        break;
  • 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.