22 # define TEST_SRCDIR "/test-data"
25 # define TEST_SRCDIR "."
28 #define TEST_NAME_RES TEST_NAME ".res"
29 #define TEST_NAME_OUT TEST_SRCDIR "/" TEST_NAME ".exp"
31 #ifdef HAVE_ARC4RANDOM
33 # define rand(X) arc4random(X)
40 # include <sys/time.h>
43 # define ITERATIONS 128
51 static size_t mempool_idx;
53 static __attribute__((malloc)) void *mempool_alloc(size_t size)
56 if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {
59 size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;
60 for (i = 0U; i < mempool_idx; i++) {
61 if (mempool[i].size >= (size | (size_t) 0x80000000)) {
62 mempool[i].size &= ~ (size_t) 0x80000000;
63 return mempool[i].pnt;
66 if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {
69 mempool[mempool_idx].size = size;
70 return (mempool[mempool_idx++].pnt = (void *) malloc(size));
73 static void mempool_free(void *pnt)
76 for (i = 0U; i < mempool_idx; i++) {
77 if (mempool[i].pnt == pnt) {
78 if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {
81 mempool[i].size |= (size_t) 0x80000000;
88 static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)
90 if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {
93 return mempool_alloc(count * size);
96 static int mempool_free_all(void)
101 for (i = 0U; i < mempool_idx; i++) {
102 if ((mempool[i].size & (size_t) 0x80000000) == (size_t) 0x0) {
105 free(mempool[i].pnt);
106 mempool[i].pnt = NULL;
108 mempool_idx = (size_t) 0U;
113 #define sodium_malloc(X) mempool_alloc(X)
114 #define sodium_free(X) mempool_free(X)
115 #define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))
117 static unsigned long long now(void)
120 unsigned long long now;
122 if (gettimeofday(&tp, NULL) != 0) {
125 now = ((unsigned long long) tp.tv_sec * 1000000ULL) +
126 (unsigned long long) tp.tv_usec;
133 unsigned long long ts_start;
134 unsigned long long ts_end;
137 if (sodium_init() != 0) {
141 #ifndef __EMSCRIPTEN__
142 randombytes_set_implementation(&randombytes_salsa20_implementation);
145 for (i = 0; i < ITERATIONS; i++) {
151 printf("%llu\n", 1000000ULL * (ts_end - ts_start) / ITERATIONS);
152 if (mempool_free_all() != 0) {
153 fprintf(stderr, "** memory leaks detected **\n");
160 #define printf(...) do { } while(0)
162 #elif !defined(BROWSER_TESTS)
171 if ((fp_res = fopen(TEST_NAME_RES, "w+")) == NULL) {
172 perror("fopen(" TEST_NAME_RES ")");
175 if (sodium_init() != 0) {
182 if ((fp_out = fopen(TEST_NAME_OUT, "r")) == NULL) {
183 perror("fopen(" TEST_NAME_OUT ")");
187 if ((c = fgetc(fp_res)) != fgetc(fp_out)) {
196 #define printf(...) fprintf(fp_res, __VA_ARGS__)
202 if (sodium_init() != 0) {
208 printf("--- SUCCESS ---\n");