fixed arena + some niceties
This commit is contained in:
parent
df0187bdb3
commit
b601ace92b
3 changed files with 258 additions and 54 deletions
105
colla_win32.c
105
colla_win32.c
|
|
@ -161,6 +161,8 @@ struct {
|
|||
os_entity_t *entity_free;
|
||||
oshandle_t hstdout;
|
||||
oshandle_t hstdin;
|
||||
oshandle_t hconin;
|
||||
oshandle_t hconout;
|
||||
WORD default_fg;
|
||||
WORD default_bg;
|
||||
} w32_data = {0};
|
||||
|
|
@ -212,14 +214,22 @@ void os_init(void) {
|
|||
|
||||
info->machine_name = str_from_tstr(&w32_data.arena, (tstr_t){ namebuf, namebuflen});
|
||||
|
||||
HANDLE hstdout = CreateFile(TEXT("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||
HANDLE hstdin = CreateFile(TEXT("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
||||
HANDLE hconout = CreateFile(TEXT("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||
HANDLE hconin = CreateFile(TEXT("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
|
||||
HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
HANDLE hstdin = GetStdHandle(STD_INPUT_HANDLE);
|
||||
|
||||
if (hstdout == INVALID_HANDLE_VALUE) err("couldn't open CONOUT$");
|
||||
else w32_data.hstdout.data = (uptr)hstdout;
|
||||
if (hstdout == INVALID_HANDLE_VALUE) err("couldn't open STD_OUTPUT_HANDLE");
|
||||
else w32_data.hstdout.data = (uptr)hstdout;
|
||||
|
||||
if (hstdin == INVALID_HANDLE_VALUE) err("couldn't open CONIN$");
|
||||
else w32_data.hstdin.data = (uptr)hstdin;
|
||||
if (hstdin == INVALID_HANDLE_VALUE) err("couldn't open STD_INPUT_HANDLE");
|
||||
else w32_data.hstdin.data = (uptr)hstdin;
|
||||
|
||||
if (hconout == INVALID_HANDLE_VALUE) err("couldn't open CONOUT$");
|
||||
else w32_data.hconout.data = (uptr)hconout;
|
||||
|
||||
if (hconin == INVALID_HANDLE_VALUE) err("couldn't open CONIN$");
|
||||
else w32_data.hconin.data = (uptr)hconin;
|
||||
|
||||
CONSOLE_SCREEN_BUFFER_INFO console_info = {0};
|
||||
if (GetConsoleScreenBufferInfo(hstdout, &console_info)) {
|
||||
|
|
@ -324,6 +334,14 @@ oshandle_t os_stdin(void) {
|
|||
return w32_data.hstdin;
|
||||
}
|
||||
|
||||
oshandle_t os_win_conout(void) {
|
||||
return w32_data.hconout;
|
||||
}
|
||||
|
||||
oshandle_t os_win_conin(void) {
|
||||
return w32_data.hconin;
|
||||
}
|
||||
|
||||
// == FILE ======================================
|
||||
|
||||
#define OS_SMALL_SCRATCH() \
|
||||
|
|
@ -343,6 +361,25 @@ DWORD os__win_mode_to_creation(filemode_e mode) {
|
|||
return OPEN_ALWAYS;
|
||||
}
|
||||
|
||||
str_t os_path_join(arena_t *arena, strview_t left, strview_t right) {
|
||||
if (left.len == 0) {
|
||||
return str(arena, right);
|
||||
}
|
||||
|
||||
char a = strv_back(left);
|
||||
char b = strv_front(right);
|
||||
|
||||
if (a == '/' || a == '\\') {
|
||||
left.len--;
|
||||
}
|
||||
|
||||
if (b == '/' || b == '\\') {
|
||||
right = strv_remove_prefix(right, 1);
|
||||
}
|
||||
|
||||
return str_fmt(arena, "%v/%v", left, right);
|
||||
}
|
||||
|
||||
bool os_file_exists(strview_t path) {
|
||||
OS_SMALL_SCRATCH();
|
||||
tstr_t name = strv_to_tstr(&scratch, path);
|
||||
|
|
@ -695,8 +732,9 @@ oshandle_t os_run_cmd_async(arena_t scratch, os_cmd_t *cmd, os_cmd_options_t *op
|
|||
ostr_pop(&cmdline, 1);
|
||||
ostr_putc(&cmdline, '\0');
|
||||
|
||||
strview_t cmd_view = ostr_as_view(&cmdline);
|
||||
str16_t command = strv_to_str16(&scratch, cmd_view);
|
||||
str_t cmd_str = ostr_to_str(&cmdline);
|
||||
debug("(%v)", cmd_str);
|
||||
str16_t command = strv_to_str16(&scratch, strv(cmd_str));
|
||||
|
||||
WCHAR* env = (options && options->env) ? options->env->data : NULL;
|
||||
|
||||
|
|
@ -731,7 +769,7 @@ oshandle_t os_run_cmd_async(arena_t scratch, os_cmd_t *cmd, os_cmd_options_t *op
|
|||
}
|
||||
|
||||
if (!success) {
|
||||
err("couldn't create process (%v): %v", cmd_view, os_get_error_string(os_get_last_error()));
|
||||
err("couldn't create process (%v): %v", cmd_str, os_get_error_string(os_get_last_error()));
|
||||
return os_handle_zero();
|
||||
}
|
||||
|
||||
|
|
@ -806,11 +844,17 @@ bool os_release(void *ptr, usize size) {
|
|||
|
||||
// == THREAD ====================================
|
||||
|
||||
DWORD os__win_thread_entry_point(void *ptr) {
|
||||
thread_local i64 os_thread_id = 0;
|
||||
i64 os_thread_count = 0;
|
||||
|
||||
DWORD WINAPI os__win_thread_entry_point(void *ptr) {
|
||||
os_entity_t *entity = (os_entity_t *)ptr;
|
||||
thread_func_t *func = entity->thread.func;
|
||||
void *userdata = entity->thread.userdata;
|
||||
u64 id = entity->thread.id;
|
||||
|
||||
os_thread_id = atomic_inc_i64(&os_thread_count) - 1;
|
||||
|
||||
return func(id, userdata);
|
||||
}
|
||||
|
||||
|
|
@ -926,6 +970,47 @@ void os_cond_wait(oshandle_t cond, oshandle_t mutex, int milliseconds) {
|
|||
|
||||
#endif
|
||||
|
||||
// == ATOMICS ========================================
|
||||
|
||||
#if COLLA_TCC
|
||||
#undef InterlockedExchangeAdd64
|
||||
#define InterlockedExchangeAdd64(dst, val) *dst += val
|
||||
#endif
|
||||
|
||||
i64 atomic_set_i64(i64 *dest, i64 val) {
|
||||
return InterlockedExchange64(dest, val);
|
||||
}
|
||||
|
||||
i64 atomic_add_i64(i64 *dest, i64 val) {
|
||||
return InterlockedExchangeAdd64(dest, val);
|
||||
}
|
||||
|
||||
i64 atomic_and_i64(i64 *dest, i64 val) {
|
||||
return InterlockedAnd64(dest, val);
|
||||
}
|
||||
|
||||
i64 atomic_cmp_i64(i64 *dest, i64 val, i64 cmp) {
|
||||
return InterlockedCompareExchange64(dest, val, cmp);
|
||||
}
|
||||
|
||||
i64 atomic_inc_i64(i64 *dest) {
|
||||
return InterlockedIncrement64(dest);
|
||||
}
|
||||
|
||||
i64 atomic_dec_i64(i64 *dest) {
|
||||
return InterlockedDecrement64(dest);
|
||||
}
|
||||
|
||||
i64 atomic_or_i64(i64 *dest, i64 val) {
|
||||
return InterlockedOr64(dest, val);
|
||||
}
|
||||
|
||||
i64 atomic_xor_i64(i64 *dest, i64 val) {
|
||||
return InterlockedXor64(dest, val);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if !COLLA_NO_NET
|
||||
|
||||
struct {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue