git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix: corner cases when printing large content through term interface
[lunaix-os.git]
/
lunaix-os
/
kernel
/
kprint
/
kprintf.c
diff --git
a/lunaix-os/kernel/kprint/kprintf.c
b/lunaix-os/kernel/kprint/kprintf.c
index c3bd04ccb0ee36890166f5353b773ceb1092300d..158a799ad5d4f8cf52b4f9d5274c1b1fda118883 100644
(file)
--- a/
lunaix-os/kernel/kprint/kprintf.c
+++ b/
lunaix-os/kernel/kprint/kprintf.c
@@
-2,6
+2,10
@@
#include <lunaix/fs/twimap.h>
#include <lunaix/syscall.h>
#include <lunaix/syslog.h>
#include <lunaix/fs/twimap.h>
#include <lunaix/syscall.h>
#include <lunaix/syslog.h>
+#include <lunaix/device.h>
+#include <lunaix/owloysius.h>
+
+#include <hal/term.h>
#include <klibc/strfmt.h>
#include <klibc/strfmt.h>
@@
-19,6
+23,7
@@
static struct kp_records kprecs = {
.max_recs = MAX_KPENT_NUM,
.kp_ent_wp = &kprecs.kp_ents.ents
};
.max_recs = MAX_KPENT_NUM,
.kp_ent_wp = &kprecs.kp_ents.ents
};
+export_symbol(debug, kprecs);
static char*
shift_level(const char* str, int* level)
static char*
shift_level(const char* str, int* level)
@@
-33,38
+38,44
@@
shift_level(const char* str, int* level)
return str;
}
return str;
}
-static void
-
__kprintf_leve
l(const char* component, int level, const char* fmt, va_list args)
+static
inline
void
+
kprintf_m
l(const char* component, int level, const char* fmt, va_list args)
{
char* buf = &tmp_buf[MAX_BUFSZ_HLF];
{
char* buf = &tmp_buf[MAX_BUFSZ_HLF];
- ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s", component, fmt);
+ ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s
\n
", component, fmt);
size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args);
size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args);
- kp_rec_put(&kprecs, level, tmp_buf, sz);
+ kprec_put(&kprecs, level, tmp_buf, sz);
+
+ if (likely(sysconsole)) {
+ sysconsole->ops.write(sysconsole, tmp_buf, 0, sz);
+ }
}
void
}
void
-
__kprintf
(const char* component, const char* fmt, va_list args)
+
kprintf_m
(const char* component, const char* fmt, va_list args)
{
int level;
fmt = shift_level(fmt, &level);
{
int level;
fmt = shift_level(fmt, &level);
-
__kprintf_leve
l(component, level, fmt, args);
+
kprintf_m
l(component, level, fmt, args);
}
static void
__twimap_kprintf_read(struct twimap* map)
{
}
static void
__twimap_kprintf_read(struct twimap* map)
{
- struct kp_records* kprecs = twimap_data(map, struct kp_records*);
+ struct kp_records*
__
kprecs = twimap_data(map, struct kp_records*);
/*
XXX we can foreach all records in a single twimap read call,
as records is monotonic increasing by design.
*/
struct kp_entry *pos, *n;
/*
XXX we can foreach all records in a single twimap read call,
as records is monotonic increasing by design.
*/
struct kp_entry *pos, *n;
- llist_for_each(pos, n, kprecs->kp_ent_wp, ents)
+ llist_for_each(pos, n,
__
kprecs->kp_ent_wp, ents)
{
{
- twimap_printf(map, "[%05d] %s\n", pos->time, pos->content);
+ time_t s = pos->time / 1000;
+ time_t ms = pos->time % 1000;
+ twimap_printf(map, "[%05d.%03d] %s\n", s, ms, pos->content);
}
}
}
}
@@
-75,7
+86,21
@@
kprintf_mapping_init()
}
EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init);
}
EXPORT_TWIFS_PLUGIN(kprintf, kprintf_mapping_init);
+
+void
+kprintf_dump_logs() {
+ if (unlikely(!sysconsole)) {
+ return;
+ }
+
+ struct kp_entry *pos, *n;
+ llist_for_each(pos, n, kprecs.kp_ent_wp, ents)
+ {
+ sysconsole->ops.write(sysconsole, pos->content, 0, pos->len);
+ }
+}
+
__DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args)
{
__DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args)
{
-
__kprintf_leve
l("syslog", level, fmt, args);
+
kprintf_m
l("syslog", level, fmt, args);
}
\ No newline at end of file
}
\ No newline at end of file