Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/console/console.c

    r712c4ba r0496c17  
    5555#define KLOG_PAGES    8
    5656#define KLOG_LENGTH   (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t))
     57#define KLOG_LATENCY  8
    5758
    5859/** Kernel log cyclic buffer */
     
    6061
    6162/** Kernel log initialized */
    62 static atomic_t klog_inited = {false};
     63static bool klog_inited = false;
    6364
    6465/** First kernel log characters */
     
    7576
    7677/** Kernel log spinlock */
    77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "klog_lock");
     78SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "*klog_lock");
    7879
    7980/** Physical memory area used for klog buffer */
     
    164165        sysinfo_set_item_val("klog.faddr", NULL, (sysarg_t) faddr);
    165166        sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES);
    166        
     167
    167168        event_set_unmask_callback(EVENT_KLOG, klog_update);
    168         atomic_set(&klog_inited, true);
     169       
     170        spinlock_lock(&klog_lock);
     171        klog_inited = true;
     172        spinlock_unlock(&klog_lock);
    169173}
    170174
     
    261265void klog_update(void)
    262266{
    263         if (!atomic_get(&klog_inited))
    264                 return;
    265        
    266267        spinlock_lock(&klog_lock);
    267268       
    268         if (klog_uspace > 0) {
     269        if ((klog_inited) && (klog_uspace > 0)) {
    269270                if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len,
    270271                    klog_uspace) == EOK)
     
    277278void putchar(const wchar_t ch)
    278279{
    279         bool ordy = ((stdout) && (stdout->op->write));
    280        
    281280        spinlock_lock(&klog_lock);
    282281       
    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                 }
     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;
    298288        }
    299289       
     
    305295                klog_start = (klog_start + 1) % KLOG_LENGTH;
    306296       
    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                  */
     297        if ((stdout) && (stdout->op->write))
    323298                stdout->op->write(stdout, ch, silent);
    324         } else {
     299        else {
    325300                /*
    326301                 * No standard output routine defined yet.
     
    332307                 * Note that the early_putc() function might be
    333308                 * a no-op on certain hardware configurations.
     309                 *
    334310                 */
    335311                early_putchar(ch);
    336         }
    337        
    338         /* Force notification on newline */
    339         if (ch == '\n')
     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)
    340331                klog_update();
    341332}
Note: See TracChangeset for help on using the changeset viewer.