mirror of https://github.com/flysand7/ciabatta.git
Add write lock to printf
This commit is contained in:
parent
4917b05771
commit
5453813e39
1
cia.c
1
cia.c
|
@ -30,6 +30,7 @@
|
||||||
#include "src/stdlib-thread/thread.c"
|
#include "src/stdlib-thread/thread.c"
|
||||||
|
|
||||||
// Module stdlib_file
|
// Module stdlib_file
|
||||||
|
#include "src/stdlib-file/common.c"
|
||||||
#include "src/stdlib-file/file.c"
|
#include "src/stdlib-file/file.c"
|
||||||
#include "src/stdlib-file/fmt.c"
|
#include "src/stdlib-file/fmt.c"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
FILE *stdin;
|
||||||
|
FILE *stdout;
|
||||||
|
FILE *stderr;
|
||||||
|
|
||||||
|
static Cia_Pool _page_allocator;
|
||||||
|
static Cia_Pool _file_pool;
|
||||||
|
static Cia_Mutex _g_pool_mutex;
|
|
@ -1,12 +1,4 @@
|
||||||
|
|
||||||
FILE *stdin;
|
|
||||||
FILE *stdout;
|
|
||||||
FILE *stderr;
|
|
||||||
|
|
||||||
static Cia_Pool _page_allocator;
|
|
||||||
static Cia_Pool _file_pool;
|
|
||||||
static Cia_Mutex _g_pool_mutex;
|
|
||||||
|
|
||||||
static void _fileapi_init() {
|
static void _fileapi_init() {
|
||||||
cia_pool_create(&_file_pool, cia_allocator_pages(), 0x1000, sizeof(FILE), 16);
|
cia_pool_create(&_file_pool, cia_allocator_pages(), 0x1000, sizeof(FILE), 16);
|
||||||
stdin = cia_pool_alloc(&_file_pool);
|
stdin = cia_pool_alloc(&_file_pool);
|
||||||
|
|
|
@ -82,6 +82,7 @@ int printf(const char *restrict fmt, ...) {
|
||||||
i64 buf_start_idx = 0;
|
i64 buf_start_idx = 0;
|
||||||
i64 buf_end_idx = 0;
|
i64 buf_end_idx = 0;
|
||||||
u64 unused;
|
u64 unused;
|
||||||
|
cia_mutex_lock(&stdout->mutex);
|
||||||
for(i64 i = 0; fmt[i] != 0;) {
|
for(i64 i = 0; fmt[i] != 0;) {
|
||||||
buf_start_idx = i;
|
buf_start_idx = i;
|
||||||
buf_end_idx = i;
|
buf_end_idx = i;
|
||||||
|
@ -98,7 +99,7 @@ int printf(const char *restrict fmt, ...) {
|
||||||
, &unused
|
, &unused
|
||||||
);
|
);
|
||||||
if(status != _RT_STATUS_OK) {
|
if(status != _RT_STATUS_OK) {
|
||||||
return -1;
|
goto _error;
|
||||||
}
|
}
|
||||||
ret_printed += buf_size;
|
ret_printed += buf_size;
|
||||||
}
|
}
|
||||||
|
@ -129,16 +130,21 @@ int printf(const char *restrict fmt, ...) {
|
||||||
int ch = va_arg(args, int);
|
int ch = va_arg(args, int);
|
||||||
_RT_Status status = _rt_file_write(&stdout->rt_file, 1, &ch, &unused);
|
_RT_Status status = _rt_file_write(&stdout->rt_file, 1, &ch, &unused);
|
||||||
if(status != _RT_STATUS_OK) {
|
if(status != _RT_STATUS_OK) {
|
||||||
return -1;
|
goto _error;
|
||||||
}
|
}
|
||||||
arg_chars = 1;
|
arg_chars = 1;
|
||||||
}
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
if(arg_chars < 0) {
|
if(arg_chars < 0) {
|
||||||
return -1;
|
goto _error;
|
||||||
}
|
}
|
||||||
ret_printed += arg_chars;
|
ret_printed += arg_chars;
|
||||||
}
|
}
|
||||||
|
cia_mutex_unlock(&stdout->mutex);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
return ret_printed;
|
return ret_printed;
|
||||||
|
_error:
|
||||||
|
cia_mutex_unlock(&stdout->mutex);
|
||||||
|
va_end(args);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue