65 const size_t userdata_chunk_size = settings->userdata_chunk_size;
66 void *userdata_chunk_array =
NULL;
67 const bool use_userdata_chunk = (userdata_chunk_size != 0) && (userdata_chunk !=
NULL);
69 if (!settings->use_threading) {
71 if (use_userdata_chunk) {
72 if (settings->func_init !=
NULL) {
73 settings->func_init(userdata, userdata_chunk);
83 func(userdata, item, &tls);
86 if (use_userdata_chunk) {
87 if (settings->func_free !=
NULL) {
89 settings->func_free(userdata, userdata_chunk);
104 const int tasks_num = threads_num + 2;
106 state.userdata = userdata;
109 if (use_userdata_chunk) {
110 userdata_chunk_array =
MALLOCA(userdata_chunk_size * tasks_num);
114 mempool, (
size_t)tasks_num);
116 for (
int i = 0; i < tasks_num; i++) {
117 void *userdata_chunk_local =
NULL;
118 if (use_userdata_chunk) {
119 userdata_chunk_local = (
char *)userdata_chunk_array + (userdata_chunk_size * i);
120 memcpy(userdata_chunk_local, userdata_chunk, userdata_chunk_size);
121 if (settings->func_init !=
NULL) {
122 settings->func_init(userdata, userdata_chunk_local);
134 if (use_userdata_chunk) {
135 if ((settings->func_free !=
NULL) || (settings->func_reduce !=
NULL)) {
136 for (
int i = 0; i < tasks_num; i++) {
137 if (settings->func_reduce) {
138 settings->func_reduce(
139 userdata, userdata_chunk, mempool_iterator_data[i].tls.userdata_chunk);
141 if (settings->func_free) {
142 settings->func_free(userdata, mempool_iterator_data[i].tls.userdata_chunk);
146 MALLOCA_FREE(userdata_chunk_array, userdata_chunk_size * tasks_num);