Changeset 2e39656 in mainline for uspace/lib/c/generic/io/log.c


Ignore:
Timestamp:
2012-07-14T17:41:01Z (12 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ceafd1b
Parents:
ef5be68
Message:

Check for log readers in separate fibril

Do not even try to send when no reader was announced.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/io/log.c

    ref5be68 r2e39656  
    5252#define MESSAGE_BUFFER_SIZE 4096
    5353
     54FIBRIL_RWLOCK_INITIALIZE(current_observed_level_lock);
     55log_level_t current_observed_level;
     56
    5457static int logger_register(async_sess_t *session, const char *prog_name)
    5558{
     
    101104}
    102105
     106static void cannot_use_level_changed_monitor(void)
     107{
     108        assert(false && "not implemented yet");
     109}
     110
     111static int observed_level_changed_monitor(void *arg)
     112{
     113        async_sess_t *monitor_session = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_LOGGER, LOGGER_INTERFACE_SINK, 0);
     114        if (monitor_session == NULL) {
     115                cannot_use_level_changed_monitor();
     116                return ENOMEM;
     117        }
     118
     119        int rc = logger_register(monitor_session, log_prog_name);
     120        if (rc != EOK) {
     121                cannot_use_level_changed_monitor();
     122                return rc;
     123        }
     124
     125        async_exch_t *exchange = async_exchange_begin(monitor_session);
     126        if (exchange == NULL) {
     127                cannot_use_level_changed_monitor();
     128                return ENOMEM;
     129        }
     130
     131        while (true) {
     132                sysarg_t has_reader;
     133                sysarg_t msg_rc = async_req_0_1(exchange,
     134                    LOGGER_BLOCK_UNTIL_READER_CHANGED, &has_reader);
     135                if (msg_rc != EOK) {
     136                        cannot_use_level_changed_monitor();
     137                        break;
     138                }
     139
     140                fibril_rwlock_write_lock(&current_observed_level_lock);
     141                if ((bool) has_reader) {
     142                        current_observed_level = LVL_LIMIT;
     143                } else {
     144                        current_observed_level = LVL_NOTE;
     145                }
     146                fibril_rwlock_write_unlock(&current_observed_level_lock);
     147        }
     148
     149        async_exchange_end(exchange);
     150
     151        return EOK;
     152}
     153
     154static log_level_t get_current_observed_level(void)
     155{
     156        fibril_rwlock_read_lock(&current_observed_level_lock);
     157        log_level_t level = current_observed_level;
     158        fibril_rwlock_read_unlock(&current_observed_level_lock);
     159        return level;
     160}
     161
    103162/** Initialize the logging system.
    104163 *
     
    120179
    121180        int rc = logger_register(logger_session, log_prog_name);
     181
     182        current_observed_level = LVL_NOTE;
     183
     184        fid_t observed_level_changed_fibril = fibril_create(observed_level_changed_monitor, NULL);
     185        if (observed_level_changed_fibril == 0) {
     186                cannot_use_level_changed_monitor();
     187        } else {
     188                fibril_add_ready(observed_level_changed_fibril);
     189        }
    122190
    123191        return rc;
     
    151219        assert(level < LVL_LIMIT);
    152220
     221        if (get_current_observed_level() < level) {
     222                return;
     223        }
     224
    153225        char *message_buffer = malloc(MESSAGE_BUFFER_SIZE);
    154226        if (message_buffer == NULL) {
Note: See TracChangeset for help on using the changeset viewer.