test_malo.c revision a74702c6
1/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */ 2#include <assert.h> 3#include <stdint.h> 4#include <stdio.h> 5#include <stdlib.h> 6#ifndef WIN32 7#include <unistd.h> 8#else 9#include "getopt.h" 10#endif 11 12#include "lsquic_malo.h" 13 14struct elem { 15 unsigned id; 16}; 17 18 19#define N_ELEMS 10000 /* More and it hits swap on smaller VMs */ 20 21static void 22run_tests (size_t el_size) 23{ 24 unsigned i; 25 struct malo *malo; 26 struct elem *el; 27 28 malo = lsquic_malo_create(el_size); 29 assert(malo); 30 31 for (i = 1; i <= N_ELEMS; ++i) 32 { 33 el = lsquic_malo_get(malo); 34 el->id = i; 35 } 36 37 uint64_t sum = 0, deleted_sum = 0; 38 for (el = lsquic_malo_first(malo); el; el = lsquic_malo_next(malo)) 39 { 40 sum += el->id; 41 if (el->id % 3 == 0) /* Delete every third element */ 42 { 43 deleted_sum += el->id; 44 lsquic_malo_put(el); 45 } 46 } 47 48 assert(sum == ((uint64_t) N_ELEMS + 1) * ((uint64_t) N_ELEMS / 2)); 49 50 sum = 0; 51 for (el = lsquic_malo_first(malo); el; el = lsquic_malo_next(malo)) 52 { 53 sum += el->id; 54 lsquic_malo_put(el); 55 } 56 57 assert(sum == ((uint64_t) N_ELEMS + 1) * ((uint64_t) N_ELEMS / 2) - 58 deleted_sum); 59 60 el = lsquic_malo_first(malo); 61 assert(!el); 62 63 lsquic_malo_destroy(malo); 64} 65 66 67static struct elem *elems[10000]; 68 69static void 70alloc_using_malloc (int n) 71{ 72 int i; 73 for (i = 0; i < n; ++i) 74 { 75 unsigned j; 76 for (j = 0; j < sizeof(elems) / sizeof(elems[0]); ++j) 77 { 78 elems[j] = malloc(sizeof(*elems[j])); 79 elems[j]->id = j; 80 } 81 for (j = 0; j < sizeof(elems) / sizeof(elems[0]); ++j) 82 { 83 free(elems[j]); 84 } 85 } 86} 87 88 89static void 90alloc_using_malo (int n) 91{ 92 struct malo *malo = lsquic_malo_create(sizeof(struct elem)); 93 int i; 94 for (i = 0; i < n; ++i) 95 { 96 unsigned j; 97 for (j = 0; j < sizeof(elems) / sizeof(elems[0]); ++j) 98 { 99 elems[j] = lsquic_malo_get(malo); 100 elems[j]->id = j; 101 } 102 for (j = 0; j < sizeof(elems) / sizeof(elems[0]); ++j) 103 { 104 lsquic_malo_put(elems[j]); 105 } 106 } 107 lsquic_malo_destroy(malo); 108} 109 110 111int 112main (int argc, char **argv) 113{ 114 int opt, mode = -1, n = 1; 115 while (-1 != (opt = getopt(argc, argv, "s:n:"))) 116 { 117 switch (opt) 118 { 119 case 's': 120 mode = atoi(optarg); 121 break; 122 case 'n': 123 n = atoi(optarg); 124 break; 125 default: 126 exit(1); 127 } 128 } 129 130 switch (mode) 131 { 132 case -1: 133 { 134 size_t sz; 135 for (sz = sizeof(struct elem); sz < 0x800; sz <<= 1) 136 { 137 run_tests(sz - 3); 138 run_tests(sz - 1); 139 run_tests(sz); 140 run_tests(sz + 1); 141 run_tests(sz + 3); 142 } 143 break; 144 } 145 case 0: 146 alloc_using_malloc(n); 147 break; 148 case 1: 149 alloc_using_malo(n); 150 break; 151 default: 152 fprintf(stderr, "error: invalid mode %d\n", mode); 153 exit(2); 154 } 155 156 return 0; 157} 158