Merge branch 'blender2.7'
[blender.git] / tests / gtests / blenlib / BLI_task_test.cc
1 /* Apache License, Version 2.0 */
2
3 #include "testing/testing.h"
4 #include <string.h>
5
6 #include "atomic_ops.h"
7
8 extern "C" {
9 #include "BLI_mempool.h"
10 #include "BLI_task.h"
11 #include "BLI_utildefines.h"
12 };
13
14 #define NUM_ITEMS 10000
15
16 static void task_mempool_iter_func(void *userdata, MempoolIterData *item) {
17         int *data = (int *)item;
18         int *count = (int *)userdata;
19
20         EXPECT_TRUE(data != NULL);
21
22         *data += 1;
23         atomic_sub_and_fetch_uint32((uint32_t *)count, 1);
24 }
25
26 TEST(task, MempoolIter)
27 {
28         int *data[NUM_ITEMS];
29         BLI_mempool *mempool = BLI_mempool_create(sizeof(*data[0]), NUM_ITEMS, 32, BLI_MEMPOOL_ALLOW_ITER);
30
31         int i;
32
33         /* 'Randomly' add and remove some items from mempool, to create a non-homogenous one. */
34         int num_items = 0;
35         for (i = 0; i < NUM_ITEMS; i++) {
36                 data[i] = (int *)BLI_mempool_alloc(mempool);
37                 *data[i] = i - 1;
38                 num_items++;
39         }
40
41         for (i = 0; i < NUM_ITEMS; i += 3) {
42                 BLI_mempool_free(mempool, data[i]);
43                 data[i] = NULL;
44                 num_items--;
45         }
46
47         for (i = 0; i < NUM_ITEMS; i += 7) {
48                 if (data[i] == NULL) {
49                         data[i] = (int *)BLI_mempool_alloc(mempool);
50                         *data[i] = i - 1;
51                         num_items++;
52                 }
53         }
54
55         for (i = 0; i < NUM_ITEMS - 5; i += 23) {
56                 for (int j = 0; j < 5; j++) {
57                         if (data[i + j] != NULL) {
58                                 BLI_mempool_free(mempool, data[i + j]);
59                                 data[i + j] = NULL;
60                                 num_items--;
61                         }
62                 }
63         }
64
65         BLI_task_parallel_mempool(mempool, &num_items, task_mempool_iter_func, true);
66
67         /* Those checks should ensure us all items of the mempool were processed once, and only once - as expected. */
68         EXPECT_EQ(num_items, 0);
69         for (i = 0; i < NUM_ITEMS; i++) {
70                 if (data[i] != NULL) {
71                         EXPECT_EQ(*data[i], i);
72                 }
73         }
74
75         BLI_mempool_destroy(mempool);
76 }