Changeset df29f24 in mainline for kernel/generic/src/console/console.c
- Timestamp:
- 2011-06-01T09:04:08Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0a7627b, c9f0975
- Parents:
- e51a514 (diff), 5d1b3aa (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/console.c
re51a514 rdf29f24 55 55 #define KLOG_PAGES 8 56 56 #define KLOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t)) 57 #define KLOG_LATENCY 858 57 59 58 /** Kernel log cyclic buffer */ … … 61 60 62 61 /** Kernel log initialized */ 63 static bool klog_inited = false;62 static atomic_t klog_inited = {false}; 64 63 65 64 /** First kernel log characters */ … … 76 75 77 76 /** Kernel log spinlock */ 78 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, " *klog_lock");77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "klog_lock"); 79 78 80 79 /** Physical memory area used for klog buffer */ … … 165 164 sysinfo_set_item_val("klog.faddr", NULL, (sysarg_t) faddr); 166 165 sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES); 167 166 168 167 event_set_unmask_callback(EVENT_KLOG, klog_update); 169 170 spinlock_lock(&klog_lock); 171 klog_inited = true; 172 spinlock_unlock(&klog_lock); 168 atomic_set(&klog_inited, true); 173 169 } 174 170 … … 265 261 void klog_update(void) 266 262 { 263 if (!atomic_get(&klog_inited)) 264 return; 265 267 266 spinlock_lock(&klog_lock); 268 267 269 if ( (klog_inited) && (klog_uspace > 0)) {268 if (klog_uspace > 0) { 270 269 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 271 270 klog_uspace) == EOK) … … 278 277 void putchar(const wchar_t ch) 279 278 { 279 bool ordy = ((stdout) && (stdout->op->write)); 280 280 281 spinlock_lock(&klog_lock); 281 282 282 if ((klog_stored > 0) && (stdout) && (stdout->op->write)) { 283 /* Print charaters stored in kernel log */ 284 size_t i; 285 for (i = klog_len - klog_stored; i < klog_len; i++) 286 stdout->op->write(stdout, klog[(klog_start + i) % KLOG_LENGTH], silent); 287 klog_stored = 0; 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 } 288 298 } 289 299 … … 295 305 klog_start = (klog_start + 1) % KLOG_LENGTH; 296 306 297 if ((stdout) && (stdout->op->write)) 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 */ 298 323 stdout->op->write(stdout, ch, silent); 299 else {324 } else { 300 325 /* 301 326 * No standard output routine defined yet. … … 307 332 * Note that the early_putc() function might be 308 333 * a no-op on certain hardware configurations. 309 *310 334 */ 311 335 early_putchar(ch); 312 313 if (klog_stored < klog_len) 314 klog_stored++; 315 } 316 317 /* The character is stored for uspace */ 318 if (klog_uspace < klog_len) 319 klog_uspace++; 320 321 /* Check notify uspace to update */ 322 bool update; 323 if ((klog_uspace > KLOG_LATENCY) || (ch == '\n')) 324 update = true; 325 else 326 update = false; 327 328 spinlock_unlock(&klog_lock); 329 330 if (update) 336 } 337 338 /* Force notification on newline */ 339 if (ch == '\n') 331 340 klog_update(); 332 341 }
Note:
See TracChangeset
for help on using the changeset viewer.