#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include thread_local char buf[1024]; [[__format(printf, 1, 2)]] static void zn_printf(const char* msg, ...) { va_list args; va_start(args, msg); int32_t len = vsnprintf(buf, sizeof(buf), msg, args); va_end(args); zn_log(buf, len); } zn_handle_t channel; int other_fn(void* arg) { zn_printf("posixd: Hello from the other thread named \"%s\"!\n", (const char*)arg); channel = getauxval(AT_INIT_HANDLE); struct ipc_init_register_rq msg = { .id = IPC_MSG_FOO, }; char name[] = "posixd"; zn_status_t status = zn_channel_write(channel, nullptr, &msg, 0, sizeof(msg) + sizeof(name)); if (status != ZN_OK) { zn_printf("posixd: %s\n", zn_status_to_string(status)); } return 69; } int main(int argc, char* argv[], char* envp[]) { zn_printf("posixd: starting...\n"); const char* thread_name = "posix_second_thread"; thrd_t thread; int res = thrd_create(&thread, other_fn, (void*)thread_name); if (res != thrd_success) zn_printf("posixd: errno: %s\n", strerror(errno)); zn_printf("posixd: second thread created\n"); int res2; zn_printf("posixd: waiting on second thread...\n"); thrd_join(thread, &res2); zn_printf("posixd: second thread exited with: %i\n", res2); return 0; }