0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <stdlib.h>
0029 #include <string.h>
0030 #include <time.h>
0031
0032 #include "sync.h"
0033 #include "sw_sync.h"
0034 #include "synctest.h"
0035
0036 int test_merge_stress_random_merge(void)
0037 {
0038 int i, size, ret;
0039 int timeline_count = 32;
0040 int merge_count = 1024 * 32;
0041 int timelines[timeline_count];
0042 int fence_map[timeline_count];
0043 int fence, tmpfence, merged, valid;
0044 int timeline, timeline_offset, sync_point;
0045
0046 srand(time(NULL));
0047
0048 for (i = 0; i < timeline_count; i++)
0049 timelines[i] = sw_sync_timeline_create();
0050
0051 fence = sw_sync_fence_create(timelines[0], "fence", 0);
0052 valid = sw_sync_fence_is_valid(fence);
0053 ASSERT(valid, "Failure creating fence\n");
0054
0055 memset(fence_map, -1, sizeof(fence_map));
0056 fence_map[0] = 0;
0057
0058
0059
0060
0061
0062 for (i = 0; i < merge_count; i++) {
0063
0064 timeline_offset = rand() % timeline_count;
0065 timeline = timelines[timeline_offset];
0066 sync_point = rand();
0067
0068
0069 if (fence_map[timeline_offset] == -1)
0070 fence_map[timeline_offset] = sync_point;
0071 else if (fence_map[timeline_offset] < sync_point)
0072 fence_map[timeline_offset] = sync_point;
0073
0074
0075 tmpfence = sw_sync_fence_create(timeline, "fence", sync_point);
0076 merged = sync_merge("merge", tmpfence, fence);
0077 sw_sync_fence_destroy(tmpfence);
0078 sw_sync_fence_destroy(fence);
0079 fence = merged;
0080
0081 valid = sw_sync_fence_is_valid(merged);
0082 ASSERT(valid, "Failure creating fence i\n");
0083 }
0084
0085 size = 0;
0086 for (i = 0; i < timeline_count; i++)
0087 if (fence_map[i] != -1)
0088 size++;
0089
0090
0091 ASSERT(sync_fence_size(fence) == size,
0092 "Quantity of elements not matching\n");
0093
0094
0095 for (i = 0; i < timeline_count; i++) {
0096 if (fence_map[i] != -1) {
0097 ret = sync_wait(fence, 0);
0098 ASSERT(ret == 0,
0099 "Failure waiting on fence until timeout\n");
0100
0101 sw_sync_timeline_inc(timelines[i], fence_map[i]);
0102 }
0103 }
0104
0105
0106 ret = sync_wait(fence, 0);
0107 ASSERT(ret > 0, "Failure triggering fence\n");
0108
0109 sw_sync_fence_destroy(fence);
0110
0111 for (i = 0; i < timeline_count; i++)
0112 sw_sync_timeline_destroy(timelines[i]);
0113
0114 return 0;
0115 }