Changeset 3272be1 in mainline


Ignore:
Timestamp:
2026-04-16T13:09:35Z (17 hours ago)
Author:
Vojtech Horky <vojtech.horky@…>
Branches:
topic/fix-logger-deadlock
Parents:
5df2570
Message:

Fix deadlock in logger service

Location:
uspace/srv/logger
Files:
3 edited

Legend:

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

    r5df2570 r3272be1  
    6767
    6868        log->logged_level = level;
    69         log->ref_counter++;
     69        refcount_up(&log->ref_counter);
    7070
    7171        log_unlock(log);
  • uspace/srv/logger/logger.h

    r5df2570 r3272be1  
    4141#include <async.h>
    4242#include <stdbool.h>
     43#include <refcount.h>
    4344#include <fibril_synch.h>
    4445#include <stdio.h>
     
    6465        link_t link;
    6566
    66         size_t ref_counter;
     67        atomic_refcount_t ref_counter;
    6768
    6869        fibril_mutex_t guard;
  • uspace/srv/logger/logs.c

    r5df2570 r3272be1  
    9999        fibril_mutex_initialize(&result->guard);
    100100        link_initialize(&result->link);
     101        refcount_init(&result->ref_counter);
     102        refcount_up(&result->ref_counter);
    101103        result->parent = parent;
    102104
     
    125127                list_append(&result->link, &log_list);
    126128                if (result->parent != NULL) {
    127                         fibril_mutex_lock(&result->parent->guard);
    128                         result->parent->ref_counter++;
    129                         fibril_mutex_unlock(&result->parent->guard);
     129                        refcount_up(&result->parent->ref_counter);
    130130                }
    131131        }
     
    209209{
    210210        assert(fibril_mutex_is_locked(&log->guard));
    211         assert(log->ref_counter > 0);
    212 
    213         /* We are definitely not the last ones. */
    214         if (log->ref_counter > 1) {
    215                 log->ref_counter--;
     211
     212        if (!refcount_down(&log->ref_counter)) {
     213                /* We are definitely not the last ones. */
    216214                fibril_mutex_unlock(&log->guard);
    217215                return;
    218216        }
     217
     218
    219219
    220220        /*
     
    225225         *   LOCKED(list), wants to LOCK(log)
    226226         */
     227        refcount_up(&log->ref_counter);
    227228        fibril_mutex_unlock(&log->guard);
    228229
     
    234235         */
    235236        fibril_mutex_lock(&log->guard);
    236         assert(log->ref_counter > 0);
    237         log->ref_counter--;
    238 
    239         if (log->ref_counter > 0) {
     237
     238        if (!refcount_down(&log->ref_counter)) {
    240239                /*
    241240                 * Meanwhile, someone else increased the ref counter.
     
    255254         * - destroy dest (if top-level log)
    256255         */
    257         assert(log->ref_counter == 0);
    258 
    259256        list_remove(&log->link);
    260257        fibril_mutex_unlock(&log_list_guard);
     
    314311
    315312        assert(fibril_mutex_is_locked(&new_log->guard));
    316         new_log->ref_counter++;
     313        refcount_up(&new_log->ref_counter);
    317314
    318315        logs->logs[logs->logs_count] = new_log;
Note: See TracChangeset for help on using the changeset viewer.