Changeset 3272be1 in mainline
- Timestamp:
- 2026-04-16T13:09:35Z (17 hours ago)
- Branches:
- topic/fix-logger-deadlock
- Parents:
- 5df2570
- Location:
- uspace/srv/logger
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/logger/initlvl.c
r5df2570 r3272be1 67 67 68 68 log->logged_level = level; 69 log->ref_counter++;69 refcount_up(&log->ref_counter); 70 70 71 71 log_unlock(log); -
uspace/srv/logger/logger.h
r5df2570 r3272be1 41 41 #include <async.h> 42 42 #include <stdbool.h> 43 #include <refcount.h> 43 44 #include <fibril_synch.h> 44 45 #include <stdio.h> … … 64 65 link_t link; 65 66 66 size_t ref_counter;67 atomic_refcount_t ref_counter; 67 68 68 69 fibril_mutex_t guard; -
uspace/srv/logger/logs.c
r5df2570 r3272be1 99 99 fibril_mutex_initialize(&result->guard); 100 100 link_initialize(&result->link); 101 refcount_init(&result->ref_counter); 102 refcount_up(&result->ref_counter); 101 103 result->parent = parent; 102 104 … … 125 127 list_append(&result->link, &log_list); 126 128 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); 130 130 } 131 131 } … … 209 209 { 210 210 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. */ 216 214 fibril_mutex_unlock(&log->guard); 217 215 return; 218 216 } 217 218 219 219 220 220 /* … … 225 225 * LOCKED(list), wants to LOCK(log) 226 226 */ 227 refcount_up(&log->ref_counter); 227 228 fibril_mutex_unlock(&log->guard); 228 229 … … 234 235 */ 235 236 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)) { 240 239 /* 241 240 * Meanwhile, someone else increased the ref counter. … … 255 254 * - destroy dest (if top-level log) 256 255 */ 257 assert(log->ref_counter == 0);258 259 256 list_remove(&log->link); 260 257 fibril_mutex_unlock(&log_list_guard); … … 314 311 315 312 assert(fibril_mutex_is_locked(&new_log->guard)); 316 new_log->ref_counter++;313 refcount_up(&new_log->ref_counter); 317 314 318 315 logs->logs[logs->logs_count] = new_log;
Note:
See TracChangeset
for help on using the changeset viewer.
