mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Improve posix thread error handling.
This commit is contained in:
@@ -148,17 +148,26 @@ fn void! NativeConditionVariable.wait_timeout(&cond, NativeMutex* mtx, ulong ms)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tlocal PosixThreadData *_thread_data @private;
|
||||||
|
|
||||||
|
fn void free_thread_data() @private
|
||||||
|
{
|
||||||
|
if (_thread_data)
|
||||||
|
{
|
||||||
|
allocator::free(_thread_data.allocator, _thread_data);
|
||||||
|
_thread_data = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
fn void* callback(void* arg) @private
|
fn void* callback(void* arg) @private
|
||||||
{
|
{
|
||||||
PosixThreadData *data = arg;
|
_thread_data = arg;
|
||||||
return (void*)(iptr)data.thread_fn(data.arg);
|
defer free_thread_data();
|
||||||
|
return (void*)(iptr)_thread_data.thread_fn(_thread_data.arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn void! NativeThread.create(&thread, ThreadFn thread_fn, void* arg)
|
fn void! NativeThread.create(&thread, ThreadFn thread_fn, void* arg)
|
||||||
{
|
{
|
||||||
|
PosixThreadData *thread_data = mem::new(PosixThreadData, { .thread_fn = thread_fn, .arg = arg, .allocator = allocator::heap() });
|
||||||
PosixThreadData *thread_data = mem::new(PosixThreadData, { .thread_fn = thread_fn, .arg = arg });
|
|
||||||
if (posix::pthread_create(thread, null, &callback, thread_data) != 0)
|
if (posix::pthread_create(thread, null, &callback, thread_data) != 0)
|
||||||
{
|
{
|
||||||
*thread = null;
|
*thread = null;
|
||||||
@@ -174,6 +183,7 @@ fn void! NativeThread.detach(thread)
|
|||||||
|
|
||||||
fn void native_thread_exit(int result)
|
fn void native_thread_exit(int result)
|
||||||
{
|
{
|
||||||
|
free_thread_data();
|
||||||
posix::pthread_exit((void*)(iptr)result);
|
posix::pthread_exit((void*)(iptr)result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -208,6 +218,7 @@ struct PosixThreadData @private
|
|||||||
{
|
{
|
||||||
ThreadFn thread_fn;
|
ThreadFn thread_fn;
|
||||||
void* arg;
|
void* arg;
|
||||||
|
Allocator allocator;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn void! native_sleep_nano(NanoDuration nano)
|
fn void! native_sleep_nano(NanoDuration nano)
|
||||||
|
|||||||
Reference in New Issue
Block a user