Ignore:
File:
1 edited

Legend:

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

    r712c4ba rd7533c7  
    5353#include <str.h>
    5454
    55 #define KLOG_PAGES    8
     55#define KLOG_PAGES    4
    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 */
     
    165166        sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES);
    166167       
    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);
    169171}
    170172
     
    261263void klog_update(void)
    262264{
    263         if (!atomic_get(&klog_inited))
    264                 return;
    265        
    266265        spinlock_lock(&klog_lock);
    267266       
    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;
    272270        }
    273271       
     
    277275void putchar(const wchar_t ch)
    278276{
    279         bool ordy = ((stdout) && (stdout->op->write));
    280        
    281277        spinlock_lock(&klog_lock);
    282278       
    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;
    298285        }
    299286       
     
    305292                klog_start = (klog_start + 1) % KLOG_LENGTH;
    306293       
    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))
    323295                stdout->op->write(stdout, ch, silent);
    324         } else {
     296        else {
    325297                /*
    326298                 * No standard output routine defined yet.
     
    332304                 * Note that the early_putc() function might be
    333305                 * a no-op on certain hardware configurations.
     306                 *
    334307                 */
    335308                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)
    340328                klog_update();
    341329}
Note: See TracChangeset for help on using the changeset viewer.