Changeset View
Changeset View
Standalone View
Standalone View
tests/gtests/blenlib/BLI_task_test.cc
| Show First 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | TEST(task, MempoolIter) | ||||
| } | } | ||||
| BLI_mempool_destroy(mempool); | BLI_mempool_destroy(mempool); | ||||
| BLI_threadapi_exit(); | BLI_threadapi_exit(); | ||||
| } | } | ||||
| /* *** Parallel iterations over double-linked list items. *** */ | /* *** Parallel iterations over double-linked list items. *** */ | ||||
| static void task_listbase_iter_func(void *userdata, Link *item, int index) | static void task_listbase_iter_func(void *userdata, | ||||
| void *item, | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| int *count = (int *)userdata; | int *count = (int *)userdata; | ||||
| data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | ||||
| atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | ||||
| } | } | ||||
| TEST(task, ListBaseIter) | TEST(task, ListBaseIter) | ||||
| { | { | ||||
| ListBase list = {NULL, NULL}; | ListBase list = {NULL, NULL}; | ||||
| LinkData *items_buffer = (LinkData *)MEM_calloc_arrayN( | LinkData *items_buffer = (LinkData *)MEM_calloc_arrayN( | ||||
| NUM_ITEMS, sizeof(*items_buffer), __func__); | NUM_ITEMS, sizeof(*items_buffer), __func__); | ||||
| BLI_threadapi_init(); | BLI_threadapi_init(); | ||||
| int i; | int i; | ||||
| int num_items = 0; | int num_items = 0; | ||||
| for (i = 0; i < NUM_ITEMS; i++) { | for (i = 0; i < NUM_ITEMS; i++) { | ||||
| BLI_addtail(&list, &items_buffer[i]); | BLI_addtail(&list, &items_buffer[i]); | ||||
| num_items++; | num_items++; | ||||
| } | } | ||||
| BLI_task_parallel_listbase(&list, &num_items, task_listbase_iter_func, true); | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | |||||
| BLI_task_parallel_listbase(&list, &num_items, task_listbase_iter_func, &settings); | |||||
| /* Those checks should ensure us all items of the listbase were processed once, and only once - | /* Those checks should ensure us all items of the listbase were processed once, and only once - | ||||
| * as expected. */ | * as expected. */ | ||||
| EXPECT_EQ(num_items, 0); | EXPECT_EQ(num_items, 0); | ||||
| LinkData *item; | LinkData *item; | ||||
| for (i = 0, item = (LinkData *)list.first; i < NUM_ITEMS && item != NULL; | for (i = 0, item = (LinkData *)list.first; i < NUM_ITEMS && item != NULL; | ||||
| i++, item = item->next) { | i++, item = item->next) { | ||||
| EXPECT_EQ(POINTER_AS_INT(item->data), i); | EXPECT_EQ(POINTER_AS_INT(item->data), i); | ||||
| } | } | ||||
| EXPECT_EQ(NUM_ITEMS, i); | EXPECT_EQ(NUM_ITEMS, i); | ||||
| MEM_freeN(items_buffer); | MEM_freeN(items_buffer); | ||||
| BLI_threadapi_exit(); | BLI_threadapi_exit(); | ||||
| } | } | ||||