Changes in kernel/generic/src/console/console.c [712c4ba:d7533c7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/console.c
r712c4ba rd7533c7 53 53 #include <str.h> 54 54 55 #define KLOG_PAGES 855 #define KLOG_PAGES 4 56 56 #define KLOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t)) 57 #define KLOG_LATENCY 8 57 58 58 59 /** Kernel log cyclic buffer */ … … 60 61 61 62 /** Kernel log initialized */ 62 static atomic_t klog_inited = {false};63 static bool klog_inited = false; 63 64 64 65 /** First kernel log characters */ … … 75 76 76 77 /** Kernel log spinlock */ 77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, " klog_lock");78 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "*klog_lock"); 78 79 79 80 /** Physical memory area used for klog buffer */ … … 165 166 sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES); 166 167 167 event_set_unmask_callback(EVENT_KLOG, klog_update); 168 atomic_set(&klog_inited, true); 168 spinlock_lock(&klog_lock); 169 klog_inited = true; 170 spinlock_unlock(&klog_lock); 169 171 } 170 172 … … 261 263 void klog_update(void) 262 264 { 263 if (!atomic_get(&klog_inited))264 return;265 266 265 spinlock_lock(&klog_lock); 267 266 268 if (klog_uspace > 0) { 269 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 270 klog_uspace) == EOK) 271 klog_uspace = 0; 267 if ((klog_inited) && (event_is_subscribed(EVENT_KLOG)) && (klog_uspace > 0)) { 268 event_notify_3(EVENT_KLOG, klog_start, klog_len, klog_uspace); 269 klog_uspace = 0; 272 270 } 273 271 … … 277 275 void putchar(const wchar_t ch) 278 276 { 279 bool ordy = ((stdout) && (stdout->op->write));280 281 277 spinlock_lock(&klog_lock); 282 278 283 /* Print charaters stored in kernel log */ 284 if (ordy) { 285 while (klog_stored > 0) { 286 wchar_t tmp = klog[(klog_start + klog_len - klog_stored) % KLOG_LENGTH]; 287 klog_stored--; 288 289 /* 290 * We need to give up the spinlock for 291 * the physical operation of writting out 292 * the character. 293 */ 294 spinlock_unlock(&klog_lock); 295 stdout->op->write(stdout, tmp, silent); 296 spinlock_lock(&klog_lock); 297 } 279 if ((klog_stored > 0) && (stdout) && (stdout->op->write)) { 280 /* Print charaters stored in kernel log */ 281 size_t i; 282 for (i = klog_len - klog_stored; i < klog_len; i++) 283 stdout->op->write(stdout, klog[(klog_start + i) % KLOG_LENGTH], silent); 284 klog_stored = 0; 298 285 } 299 286 … … 305 292 klog_start = (klog_start + 1) % KLOG_LENGTH; 306 293 307 if (!ordy) { 308 if (klog_stored < klog_len) 309 klog_stored++; 310 } 311 312 /* The character is stored for uspace */ 313 if (klog_uspace < klog_len) 314 klog_uspace++; 315 316 spinlock_unlock(&klog_lock); 317 318 if (ordy) { 319 /* 320 * Output the character. In this case 321 * it should be no longer buffered. 322 */ 294 if ((stdout) && (stdout->op->write)) 323 295 stdout->op->write(stdout, ch, silent); 324 }else {296 else { 325 297 /* 326 298 * No standard output routine defined yet. … … 332 304 * Note that the early_putc() function might be 333 305 * a no-op on certain hardware configurations. 306 * 334 307 */ 335 308 early_putchar(ch); 336 } 337 338 /* Force notification on newline */ 339 if (ch == '\n') 309 310 if (klog_stored < klog_len) 311 klog_stored++; 312 } 313 314 /* The character is stored for uspace */ 315 if (klog_uspace < klog_len) 316 klog_uspace++; 317 318 /* Check notify uspace to update */ 319 bool update; 320 if ((klog_uspace > KLOG_LATENCY) || (ch == '\n')) 321 update = true; 322 else 323 update = false; 324 325 spinlock_unlock(&klog_lock); 326 327 if (update) 340 328 klog_update(); 341 329 }
Note:
See TracChangeset
for help on using the changeset viewer.