#include <lunaix/fs/twifs.h>
#include <lunaix/fs/twimap.h>
#include <lunaix/syscall.h>
+#include <lunaix/syscall_utils.h>
#include <lunaix/syslog.h>
#include <lunaix/device.h>
#include <lunaix/owloysius.h>
+#include <lunaix/ds/flipbuf.h>
#include <hal/term.h>
#include "kp_records.h"
-#define MAX_BUFSZ 512
#define MAX_BUFSZ_HLF 256
#define MAX_KPENT_NUM 1024
-static char tmp_buf[MAX_BUFSZ];
+static char tmp_buf[MAX_BUFSZ_HLF * 2];
+static DEFINE_FLIPBUF(fmtbuf, MAX_BUFSZ_HLF, tmp_buf);
static struct kp_records kprecs = {
.kp_ents = { .ents = { .next = &kprecs.kp_ents.ents,
return str;
}
+static inline void
+__put_console(const struct kp_entry* ent)
+{
+ char* buf;
+ time_t s, ms;
+ size_t sz;
+
+ if (unlikely(!sysconsole)) {
+ return;
+ }
+
+ s = ent->time / 1000;
+ ms = ent->time % 1000;
+ buf = flipbuf_flip(&fmtbuf);
+ sz = ksnprintf(buf, MAX_BUFSZ_HLF,
+ "[%04d.%03d] %s", s, ms, ent->content);
+
+ sysconsole->ops.write(sysconsole, buf, 0, sz);
+}
+
+static inline void
+kprintf_put(int level, const char* buf, size_t sz)
+{
+ __put_console(kprec_put(&kprecs, level, buf, sz));
+}
+
static inline void
kprintf_ml(const char* component, int level, const char* fmt, va_list args)
{
- char* buf = &tmp_buf[MAX_BUFSZ_HLF];
- ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s\n", component, fmt);
+ char* buf;
+ size_t sz;
- size_t sz = ksnprintfv(tmp_buf, buf, MAX_BUFSZ_HLF, args);
- kprec_put(&kprecs, level, tmp_buf, sz);
+ buf = flipbuf_top(&fmtbuf);
+ ksnprintf(buf, MAX_BUFSZ_HLF, "%s: %s\n", component, fmt);
- if (likely(sysconsole)) {
- sysconsole->ops.write(sysconsole, tmp_buf, 0, sz);
- }
+ sz = ksnprintfv(flipbuf_flip(&fmtbuf), buf, MAX_BUFSZ_HLF, args);
+
+ kprintf_put(level, flipbuf_top(&fmtbuf), sz);
}
void
kprintf_ml(component, level, fmt, args);
}
+void
+kprintf_v(const char* component, const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ kprintf_m(component, fmt, args);
+ va_end(args);
+}
+
static void
__twimap_kprintf_read(struct twimap* map)
{
struct kp_entry *pos, *n;
llist_for_each(pos, n, kprecs.kp_ent_wp, ents)
{
- sysconsole->ops.write(sysconsole, pos->content, 0, pos->len);
+ __put_console(pos);
}
}
-__DEFINE_LXSYSCALL3(void, syslog, int, level, const char*, fmt, va_list, args)
+__DEFINE_LXSYSCALL3(void, syslog, int, level,
+ const char*, buf, unsigned int, size)
{
- kprintf_ml("syslog", level, fmt, args);
+ kprintf_put(level, buf, size);
}
\ No newline at end of file