1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdint.h>
4 #include <string.h>
5
6 #include "vtv_utils.h"
7 #include "vtv_rts.h"
8
9 /* This configuration will test mostly inserting of new elements since
10 the number of repeats is 1. It should also do a lot of rehashing */
11
12 /* This test case may fail depending on the system configuration.
13 Check the value of /proc/sys/vm/max_map_count and fix by doing
14 Ex: sudo sh -c "echo 131060 > /proc/sys/vm/max_map_count" */
15
16 #define NUM_MAPS 40000
17 #define ELEMENTS_PER_MAP 100
18 #define NUM_REPEATS 1
19
20 #define KEY_TYPE_FIXED_SIZE 8
21 void *key_buffer = malloc (17);
22 typedef char * name_string;
23 name_string fake_names[NUM_MAPS];
24
25 /* This variable has to be put in rel.ro */
26 void * maps[NUM_MAPS] VTV_PROTECTED_VAR;
27
28 struct fake_vt {
29 void * fake_vfp [4];
30 };
31 void * fake_vts [NUM_MAPS * ELEMENTS_PER_MAP];
32
33
34 void
generate_names(void)35 generate_names (void)
36 {
37 int i;
38
39 for (i = 0; i < NUM_MAPS; ++i)
40 {
41 fake_names[i] = (char *) malloc (9 * sizeof (char));
42 snprintf (fake_names[i], 9, "name%d", i);
43 }
44 }
45
46 static uint32_t
vtv_string_hash(const char * in)47 vtv_string_hash(const char *in)
48 {
49 const char *s = in;
50 uint32_t h = 0;
51
52 for ( ; *s; ++s)
53 h = 5 * h + *s;
54 return h;
55 }
56
main()57 int main()
58 {
59 __VLTChangePermission(__VLTP_READ_WRITE);
60
61 generate_names();
62
63 for (int k = 0; k < NUM_REPEATS; k++)
64 {
65 int curr_fake_vt = 0;
66 for (int i = 0; i < NUM_MAPS; i++)
67 {
68 uint32_t *value_ptr = (uint32_t *) key_buffer;
69 uint32_t len1 = strlen (fake_names[i]);
70 uint32_t hash_value = vtv_string_hash (fake_names[i]);
71 void *temp_array[ELEMENTS_PER_MAP];
72
73 *value_ptr = len1;
74 value_ptr++;
75 *value_ptr = hash_value;
76
77 memcpy ((char *) key_buffer + KEY_TYPE_FIXED_SIZE, fake_names[i],
78 len1);
79
80
81 #ifdef VTV_DEBUG
82 __VLTRegisterPairDebug (&maps[i], (char *) key_buffer, 128,
83 &fake_vts[curr_fake_vt], "", "");
84 #else
85 __VLTRegisterPair (&maps[i], (char *) key_buffer, 128,
86 &fake_vts[curr_fake_vt]);
87 #endif
88 for (int j = 0; j < ELEMENTS_PER_MAP; j++)
89 {
90 temp_array[j] = &fake_vts[curr_fake_vt];
91 curr_fake_vt++;
92 }
93 #ifdef VTV_DEBUG
94 __VLTRegisterSetDebug (&maps[i], (char *) key_buffer, 128, 100,
95 (void **) &temp_array);
96 #else
97 __VLTRegisterSet (&maps[i], (char *) key_buffer, 128, 100,
98 (void **) &temp_array);
99 #endif
100 }
101 }
102
103 __VLTChangePermission(__VLTP_READ_ONLY);
104
105 return 0;
106 }
107