47 lines
1.1 KiB
C
47 lines
1.1 KiB
C
#include "pstruya.h"
|
|
|
|
typedef struct {
|
|
struya_vnutr__TStruya routine;
|
|
TTagPair arg;
|
|
} tri_thread_launch_compound;
|
|
|
|
void* tri_thread_wrapper(void* arg) {
|
|
tri_thread_launch_compound* compound = (tri_thread_launch_compound*) arg;
|
|
compound->routine.func(compound->routine.receiver, compound->arg);
|
|
|
|
free(compound);
|
|
return NULL;
|
|
}
|
|
|
|
int64_t tri_thread_create(struya_vnutr__TStruya routine, TTagPair arg) {
|
|
pthread_t thread;
|
|
pthread_attr_t attr;
|
|
|
|
pthread_attr_init(&attr);
|
|
pthread_attr_setstacksize(&attr, 512 * 1024);
|
|
|
|
tri_thread_launch_compound* compound = malloc(sizeof(tri_thread_launch_compound));
|
|
compound->routine = routine;
|
|
compound->arg = arg;
|
|
|
|
int result = pthread_create(&thread, &attr, tri_thread_wrapper, (void*) compound);
|
|
|
|
if (result != 0) {
|
|
return 0;
|
|
}
|
|
|
|
return (int64_t)(uintptr_t)thread;
|
|
}
|
|
|
|
void tri_thread_join(int64_t thread) {
|
|
if (!thread) return;
|
|
|
|
pthread_join((pthread_t)(uintptr_t)thread, NULL);
|
|
}
|
|
|
|
void tri_thread_detach(int64_t thread) {
|
|
if (!thread) return;
|
|
|
|
pthread_detach((pthread_t)(uintptr_t)thread);
|
|
}
|