4#include "clod_thread_config.h"
7#include "thread_impl.h"
9enum clod_process_result
15 auto res = clod_process_start_pthread(opts, common);
16 if (res == CLOD_PROCESS_OK && common) (*common)->type =
CLOD_THREAD;
19 #elif CLOD_HAVE_STDTHREADS
21 auto res = clod_process_start_stdthreads(opts, common);
22 if (res == CLOD_PROCESS_OK && common) (*common)->type =
CLOD_THREAD;
27 #if CLOD_HAVE_LINUX_SCHED
29 auto res = clod_process_start_linux(opts, common);
30 if (res == CLOD_PROCESS_OK && common) (*common)->type = opts->
type;
35 return CLOD_PROCESS_UNSUPPORTED;
38enum clod_process_result
44 return clod_process_join_pthread(common);
45 #elif CLOD_HAVE_STDTHREADS
47 return clod_process_join_stdthreads(common);
50 #if CLOD_HAVE_LINUX_SCHED
52 return clod_process_join_linux(common);
55 return CLOD_PROCESS_INVALID;
60 const size_t sizes_size =
sizeof(args->arg_sizes[0]) * (size_t)args->arg_count;
61 const size_t vector_size =
sizeof(args->arg_vector[0]) * ((size_t)args->arg_count + 1);
63 const size_t sizes_offset = ALIGN(head_size,
alignof(typeof(args->arg_sizes[0])));
64 const size_t vector_offset = ALIGN(sizes_offset + sizes_size,
alignof(typeof(args->arg_vector[0])));
65 const size_t arg_offset = ALIGN(vector_offset + vector_size, 16);
67 size_t size = arg_offset;
68 for (
int i = 0; i < args->arg_count; i++) {
69 if (args->arg_vector[i] ==
nullptr)
72 if (args->arg_sizes) {
73 size += ALIGN(args->arg_sizes[i] + 1, 16);
75 size += ALIGN(strlen(args->arg_vector[i]) + 1, 16);
79 assert(size % 16 == 0);
83 assert((uintptr_t)dst % 16 == 0);
86 const size_t sizes_size =
sizeof(src->arg_sizes[0]) * (size_t)src->arg_count;
87 const size_t vector_size =
sizeof(src->arg_vector[0]) * ((size_t)src->arg_count + 1);
89 const size_t sizes_offset = ALIGN(head_size,
alignof(typeof(src->arg_sizes[0])));
90 const size_t vector_offset = ALIGN(sizes_offset + sizes_size,
alignof(typeof(src->arg_vector[0])));
91 const size_t arg_offset = ALIGN(vector_offset + vector_size, 16);
93 dst->arg_count = src->arg_count;
94 dst->arg_sizes = (
size_t*)((
char*)dst + sizes_offset);
95 dst->arg_vector = (
char**)((
char*)dst + vector_offset);
97 size_t size = arg_offset;
98 for (
int i = 0; i < src->arg_count; i++) {
101 arg_size = src->arg_sizes[i];
102 else if (src->arg_vector[i])
103 arg_size = strlen(src->arg_vector[i]);
107 dst->arg_sizes[i] = arg_size;
108 if (src->arg_vector[i]) {
109 dst->arg_vector[i] = (
char*)dst + size;
110 memcpy(dst->arg_vector[i], src->arg_vector[i], arg_size);
111 dst->arg_vector[i][arg_size] =
'\0';
112 size += ALIGN(arg_size + 1, 16);
114 dst->arg_vector[i] =
nullptr;
118 if (!src->arg_vector)
119 dst->arg_vector =
nullptr;
121 dst->arg_vector[src->arg_count] =
nullptr;
enum clod_process_result clod_process_join(const clod_process process)
enum clod_process_result clod_process_start(struct clod_process_opts *opts, clod_process *process_out)
enum clod_process_type type
Type of process to create.