Rtos API example

Committer:
marcozecchini
Date:
Sat Feb 23 12:13:36 2019 +0000
Revision:
0:9fca2b23d0ba
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 0:9fca2b23d0ba 1 /*
marcozecchini 0:9fca2b23d0ba 2 * Testing framework for the events library
marcozecchini 0:9fca2b23d0ba 3 *
marcozecchini 0:9fca2b23d0ba 4 * Copyright (c) 2016 Christopher Haster
marcozecchini 0:9fca2b23d0ba 5 *
marcozecchini 0:9fca2b23d0ba 6 * Licensed under the Apache License, Version 2.0 (the "License");
marcozecchini 0:9fca2b23d0ba 7 * you may not use this file except in compliance with the License.
marcozecchini 0:9fca2b23d0ba 8 * You may obtain a copy of the License at
marcozecchini 0:9fca2b23d0ba 9 *
marcozecchini 0:9fca2b23d0ba 10 * http://www.apache.org/licenses/LICENSE-2.0
marcozecchini 0:9fca2b23d0ba 11 *
marcozecchini 0:9fca2b23d0ba 12 * Unless required by applicable law or agreed to in writing, software
marcozecchini 0:9fca2b23d0ba 13 * distributed under the License is distributed on an "AS IS" BASIS,
marcozecchini 0:9fca2b23d0ba 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
marcozecchini 0:9fca2b23d0ba 15 * See the License for the specific language governing permissions and
marcozecchini 0:9fca2b23d0ba 16 * limitations under the License.
marcozecchini 0:9fca2b23d0ba 17 */
marcozecchini 0:9fca2b23d0ba 18 #include "equeue.h"
marcozecchini 0:9fca2b23d0ba 19 #include <unistd.h>
marcozecchini 0:9fca2b23d0ba 20 #include <stdio.h>
marcozecchini 0:9fca2b23d0ba 21 #include <setjmp.h>
marcozecchini 0:9fca2b23d0ba 22 #include <stdint.h>
marcozecchini 0:9fca2b23d0ba 23 #include <stdlib.h>
marcozecchini 0:9fca2b23d0ba 24 #include <pthread.h>
marcozecchini 0:9fca2b23d0ba 25
marcozecchini 0:9fca2b23d0ba 26
marcozecchini 0:9fca2b23d0ba 27 // Testing setup
marcozecchini 0:9fca2b23d0ba 28 static jmp_buf test_buf;
marcozecchini 0:9fca2b23d0ba 29 static int test_line;
marcozecchini 0:9fca2b23d0ba 30 static int test_failure;
marcozecchini 0:9fca2b23d0ba 31
marcozecchini 0:9fca2b23d0ba 32 #define test_assert(test) ({ \
marcozecchini 0:9fca2b23d0ba 33 if (!(test)) { \
marcozecchini 0:9fca2b23d0ba 34 test_line = __LINE__; \
marcozecchini 0:9fca2b23d0ba 35 longjmp(test_buf, 1); \
marcozecchini 0:9fca2b23d0ba 36 } \
marcozecchini 0:9fca2b23d0ba 37 })
marcozecchini 0:9fca2b23d0ba 38
marcozecchini 0:9fca2b23d0ba 39 #define test_run(func, ...) ({ \
marcozecchini 0:9fca2b23d0ba 40 printf("%s: ...", #func); \
marcozecchini 0:9fca2b23d0ba 41 fflush(stdout); \
marcozecchini 0:9fca2b23d0ba 42 \
marcozecchini 0:9fca2b23d0ba 43 if (!setjmp(test_buf)) { \
marcozecchini 0:9fca2b23d0ba 44 func(__VA_ARGS__); \
marcozecchini 0:9fca2b23d0ba 45 printf("\r%s: \e[32mpassed\e[0m\n", #func); \
marcozecchini 0:9fca2b23d0ba 46 } else { \
marcozecchini 0:9fca2b23d0ba 47 printf("\r%s: \e[31mfailed\e[0m at line %d\n", #func, test_line); \
marcozecchini 0:9fca2b23d0ba 48 test_failure = true; \
marcozecchini 0:9fca2b23d0ba 49 } \
marcozecchini 0:9fca2b23d0ba 50 })
marcozecchini 0:9fca2b23d0ba 51
marcozecchini 0:9fca2b23d0ba 52
marcozecchini 0:9fca2b23d0ba 53 // Test functions
marcozecchini 0:9fca2b23d0ba 54 void pass_func(void *eh) {
marcozecchini 0:9fca2b23d0ba 55 }
marcozecchini 0:9fca2b23d0ba 56
marcozecchini 0:9fca2b23d0ba 57 void simple_func(void *p) {
marcozecchini 0:9fca2b23d0ba 58 (*(int *)p)++;
marcozecchini 0:9fca2b23d0ba 59 }
marcozecchini 0:9fca2b23d0ba 60
marcozecchini 0:9fca2b23d0ba 61 void sloth_func(void *p) {
marcozecchini 0:9fca2b23d0ba 62 usleep(10000);
marcozecchini 0:9fca2b23d0ba 63 (*(int *)p)++;
marcozecchini 0:9fca2b23d0ba 64 }
marcozecchini 0:9fca2b23d0ba 65
marcozecchini 0:9fca2b23d0ba 66 struct indirect {
marcozecchini 0:9fca2b23d0ba 67 int *touched;
marcozecchini 0:9fca2b23d0ba 68 uint8_t buffer[7];
marcozecchini 0:9fca2b23d0ba 69 };
marcozecchini 0:9fca2b23d0ba 70
marcozecchini 0:9fca2b23d0ba 71 void indirect_func(void *p) {
marcozecchini 0:9fca2b23d0ba 72 struct indirect *i = (struct indirect*)p;
marcozecchini 0:9fca2b23d0ba 73 (*i->touched)++;
marcozecchini 0:9fca2b23d0ba 74 }
marcozecchini 0:9fca2b23d0ba 75
marcozecchini 0:9fca2b23d0ba 76 struct timing {
marcozecchini 0:9fca2b23d0ba 77 unsigned tick;
marcozecchini 0:9fca2b23d0ba 78 unsigned delay;
marcozecchini 0:9fca2b23d0ba 79 };
marcozecchini 0:9fca2b23d0ba 80
marcozecchini 0:9fca2b23d0ba 81 void timing_func(void *p) {
marcozecchini 0:9fca2b23d0ba 82 struct timing *timing = (struct timing*)p;
marcozecchini 0:9fca2b23d0ba 83 unsigned tick = equeue_tick();
marcozecchini 0:9fca2b23d0ba 84
marcozecchini 0:9fca2b23d0ba 85 unsigned t1 = timing->delay;
marcozecchini 0:9fca2b23d0ba 86 unsigned t2 = tick - timing->tick;
marcozecchini 0:9fca2b23d0ba 87 test_assert(t1 > t2 - 10 && t1 < t2 + 10);
marcozecchini 0:9fca2b23d0ba 88
marcozecchini 0:9fca2b23d0ba 89 timing->tick = tick;
marcozecchini 0:9fca2b23d0ba 90 }
marcozecchini 0:9fca2b23d0ba 91
marcozecchini 0:9fca2b23d0ba 92 struct fragment {
marcozecchini 0:9fca2b23d0ba 93 equeue_t *q;
marcozecchini 0:9fca2b23d0ba 94 size_t size;
marcozecchini 0:9fca2b23d0ba 95 struct timing timing;
marcozecchini 0:9fca2b23d0ba 96 };
marcozecchini 0:9fca2b23d0ba 97
marcozecchini 0:9fca2b23d0ba 98 void fragment_func(void *p) {
marcozecchini 0:9fca2b23d0ba 99 struct fragment *fragment = (struct fragment*)p;
marcozecchini 0:9fca2b23d0ba 100 timing_func(&fragment->timing);
marcozecchini 0:9fca2b23d0ba 101
marcozecchini 0:9fca2b23d0ba 102 struct fragment *nfragment = equeue_alloc(fragment->q, fragment->size);
marcozecchini 0:9fca2b23d0ba 103 test_assert(nfragment);
marcozecchini 0:9fca2b23d0ba 104
marcozecchini 0:9fca2b23d0ba 105 *nfragment = *fragment;
marcozecchini 0:9fca2b23d0ba 106 equeue_event_delay(nfragment, fragment->timing.delay);
marcozecchini 0:9fca2b23d0ba 107
marcozecchini 0:9fca2b23d0ba 108 int id = equeue_post(nfragment->q, fragment_func, nfragment);
marcozecchini 0:9fca2b23d0ba 109 test_assert(id);
marcozecchini 0:9fca2b23d0ba 110 }
marcozecchini 0:9fca2b23d0ba 111
marcozecchini 0:9fca2b23d0ba 112 struct cancel {
marcozecchini 0:9fca2b23d0ba 113 equeue_t *q;
marcozecchini 0:9fca2b23d0ba 114 int id;
marcozecchini 0:9fca2b23d0ba 115 };
marcozecchini 0:9fca2b23d0ba 116
marcozecchini 0:9fca2b23d0ba 117 void cancel_func(void *p) {
marcozecchini 0:9fca2b23d0ba 118 struct cancel *cancel = (struct cancel *)p;
marcozecchini 0:9fca2b23d0ba 119 equeue_cancel(cancel->q, cancel->id);
marcozecchini 0:9fca2b23d0ba 120 }
marcozecchini 0:9fca2b23d0ba 121
marcozecchini 0:9fca2b23d0ba 122 struct nest {
marcozecchini 0:9fca2b23d0ba 123 equeue_t *q;
marcozecchini 0:9fca2b23d0ba 124 void (*cb)(void *);
marcozecchini 0:9fca2b23d0ba 125 void *data;
marcozecchini 0:9fca2b23d0ba 126 };
marcozecchini 0:9fca2b23d0ba 127
marcozecchini 0:9fca2b23d0ba 128 void nest_func(void *p) {
marcozecchini 0:9fca2b23d0ba 129 struct nest *nest = (struct nest *)p;
marcozecchini 0:9fca2b23d0ba 130 equeue_call(nest->q, nest->cb, nest->data);
marcozecchini 0:9fca2b23d0ba 131
marcozecchini 0:9fca2b23d0ba 132 usleep(10000);
marcozecchini 0:9fca2b23d0ba 133 }
marcozecchini 0:9fca2b23d0ba 134
marcozecchini 0:9fca2b23d0ba 135
marcozecchini 0:9fca2b23d0ba 136 // Simple call tests
marcozecchini 0:9fca2b23d0ba 137 void simple_call_test(void) {
marcozecchini 0:9fca2b23d0ba 138 equeue_t q;
marcozecchini 0:9fca2b23d0ba 139 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 140 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 141
marcozecchini 0:9fca2b23d0ba 142 bool touched = false;
marcozecchini 0:9fca2b23d0ba 143 equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 144 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 145 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 146
marcozecchini 0:9fca2b23d0ba 147 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 148 }
marcozecchini 0:9fca2b23d0ba 149
marcozecchini 0:9fca2b23d0ba 150 void simple_call_in_test(void) {
marcozecchini 0:9fca2b23d0ba 151 equeue_t q;
marcozecchini 0:9fca2b23d0ba 152 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 153 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 154
marcozecchini 0:9fca2b23d0ba 155 bool touched = false;
marcozecchini 0:9fca2b23d0ba 156 int id = equeue_call_in(&q, 10, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 157 test_assert(id);
marcozecchini 0:9fca2b23d0ba 158
marcozecchini 0:9fca2b23d0ba 159 equeue_dispatch(&q, 15);
marcozecchini 0:9fca2b23d0ba 160 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 161
marcozecchini 0:9fca2b23d0ba 162 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 163 }
marcozecchini 0:9fca2b23d0ba 164
marcozecchini 0:9fca2b23d0ba 165 void simple_call_every_test(void) {
marcozecchini 0:9fca2b23d0ba 166 equeue_t q;
marcozecchini 0:9fca2b23d0ba 167 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 168 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 169
marcozecchini 0:9fca2b23d0ba 170 bool touched = false;
marcozecchini 0:9fca2b23d0ba 171 int id = equeue_call_every(&q, 10, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 172 test_assert(id);
marcozecchini 0:9fca2b23d0ba 173
marcozecchini 0:9fca2b23d0ba 174 equeue_dispatch(&q, 15);
marcozecchini 0:9fca2b23d0ba 175 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 176
marcozecchini 0:9fca2b23d0ba 177 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 178 }
marcozecchini 0:9fca2b23d0ba 179
marcozecchini 0:9fca2b23d0ba 180 void simple_post_test(void) {
marcozecchini 0:9fca2b23d0ba 181 equeue_t q;
marcozecchini 0:9fca2b23d0ba 182 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 183 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 184
marcozecchini 0:9fca2b23d0ba 185 int touched = false;
marcozecchini 0:9fca2b23d0ba 186 struct indirect *i = equeue_alloc(&q, sizeof(struct indirect));
marcozecchini 0:9fca2b23d0ba 187 test_assert(i);
marcozecchini 0:9fca2b23d0ba 188
marcozecchini 0:9fca2b23d0ba 189 i->touched = &touched;
marcozecchini 0:9fca2b23d0ba 190 int id = equeue_post(&q, indirect_func, i);
marcozecchini 0:9fca2b23d0ba 191 test_assert(id);
marcozecchini 0:9fca2b23d0ba 192
marcozecchini 0:9fca2b23d0ba 193 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 194 test_assert(*i->touched);
marcozecchini 0:9fca2b23d0ba 195
marcozecchini 0:9fca2b23d0ba 196 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 197 }
marcozecchini 0:9fca2b23d0ba 198
marcozecchini 0:9fca2b23d0ba 199 // Misc tests
marcozecchini 0:9fca2b23d0ba 200 void destructor_test(void) {
marcozecchini 0:9fca2b23d0ba 201 equeue_t q;
marcozecchini 0:9fca2b23d0ba 202 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 203 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 204
marcozecchini 0:9fca2b23d0ba 205 int touched;
marcozecchini 0:9fca2b23d0ba 206 struct indirect *e;
marcozecchini 0:9fca2b23d0ba 207 int ids[3];
marcozecchini 0:9fca2b23d0ba 208
marcozecchini 0:9fca2b23d0ba 209 touched = 0;
marcozecchini 0:9fca2b23d0ba 210 for (int i = 0; i < 3; i++) {
marcozecchini 0:9fca2b23d0ba 211 e = equeue_alloc(&q, sizeof(struct indirect));
marcozecchini 0:9fca2b23d0ba 212 test_assert(e);
marcozecchini 0:9fca2b23d0ba 213
marcozecchini 0:9fca2b23d0ba 214 e->touched = &touched;
marcozecchini 0:9fca2b23d0ba 215 equeue_event_dtor(e, indirect_func);
marcozecchini 0:9fca2b23d0ba 216 int id = equeue_post(&q, pass_func, e);
marcozecchini 0:9fca2b23d0ba 217 test_assert(id);
marcozecchini 0:9fca2b23d0ba 218 }
marcozecchini 0:9fca2b23d0ba 219
marcozecchini 0:9fca2b23d0ba 220 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 221 test_assert(touched == 3);
marcozecchini 0:9fca2b23d0ba 222
marcozecchini 0:9fca2b23d0ba 223 touched = 0;
marcozecchini 0:9fca2b23d0ba 224 for (int i = 0; i < 3; i++) {
marcozecchini 0:9fca2b23d0ba 225 e = equeue_alloc(&q, sizeof(struct indirect));
marcozecchini 0:9fca2b23d0ba 226 test_assert(e);
marcozecchini 0:9fca2b23d0ba 227
marcozecchini 0:9fca2b23d0ba 228 e->touched = &touched;
marcozecchini 0:9fca2b23d0ba 229 equeue_event_dtor(e, indirect_func);
marcozecchini 0:9fca2b23d0ba 230 ids[i] = equeue_post(&q, pass_func, e);
marcozecchini 0:9fca2b23d0ba 231 test_assert(ids[i]);
marcozecchini 0:9fca2b23d0ba 232 }
marcozecchini 0:9fca2b23d0ba 233
marcozecchini 0:9fca2b23d0ba 234 for (int i = 0; i < 3; i++) {
marcozecchini 0:9fca2b23d0ba 235 equeue_cancel(&q, ids[i]);
marcozecchini 0:9fca2b23d0ba 236 }
marcozecchini 0:9fca2b23d0ba 237
marcozecchini 0:9fca2b23d0ba 238 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 239 test_assert(touched == 3);
marcozecchini 0:9fca2b23d0ba 240
marcozecchini 0:9fca2b23d0ba 241 touched = 0;
marcozecchini 0:9fca2b23d0ba 242 for (int i = 0; i < 3; i++) {
marcozecchini 0:9fca2b23d0ba 243 e = equeue_alloc(&q, sizeof(struct indirect));
marcozecchini 0:9fca2b23d0ba 244 test_assert(e);
marcozecchini 0:9fca2b23d0ba 245
marcozecchini 0:9fca2b23d0ba 246 e->touched = &touched;
marcozecchini 0:9fca2b23d0ba 247 equeue_event_dtor(e, indirect_func);
marcozecchini 0:9fca2b23d0ba 248 int id = equeue_post(&q, pass_func, e);
marcozecchini 0:9fca2b23d0ba 249 test_assert(id);
marcozecchini 0:9fca2b23d0ba 250 }
marcozecchini 0:9fca2b23d0ba 251
marcozecchini 0:9fca2b23d0ba 252 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 253 test_assert(touched == 3);
marcozecchini 0:9fca2b23d0ba 254 }
marcozecchini 0:9fca2b23d0ba 255
marcozecchini 0:9fca2b23d0ba 256 void allocation_failure_test(void) {
marcozecchini 0:9fca2b23d0ba 257 equeue_t q;
marcozecchini 0:9fca2b23d0ba 258 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 259 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 260
marcozecchini 0:9fca2b23d0ba 261 void *p = equeue_alloc(&q, 4096);
marcozecchini 0:9fca2b23d0ba 262 test_assert(!p);
marcozecchini 0:9fca2b23d0ba 263
marcozecchini 0:9fca2b23d0ba 264 for (int i = 0; i < 100; i++) {
marcozecchini 0:9fca2b23d0ba 265 p = equeue_alloc(&q, 0);
marcozecchini 0:9fca2b23d0ba 266 }
marcozecchini 0:9fca2b23d0ba 267 test_assert(!p);
marcozecchini 0:9fca2b23d0ba 268
marcozecchini 0:9fca2b23d0ba 269 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 270 }
marcozecchini 0:9fca2b23d0ba 271
marcozecchini 0:9fca2b23d0ba 272 void cancel_test(int N) {
marcozecchini 0:9fca2b23d0ba 273 equeue_t q;
marcozecchini 0:9fca2b23d0ba 274 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 275 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 276
marcozecchini 0:9fca2b23d0ba 277 bool touched = false;
marcozecchini 0:9fca2b23d0ba 278 int *ids = malloc(N*sizeof(int));
marcozecchini 0:9fca2b23d0ba 279
marcozecchini 0:9fca2b23d0ba 280 for (int i = 0; i < N; i++) {
marcozecchini 0:9fca2b23d0ba 281 ids[i] = equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 282 }
marcozecchini 0:9fca2b23d0ba 283
marcozecchini 0:9fca2b23d0ba 284 for (int i = N-1; i >= 0; i--) {
marcozecchini 0:9fca2b23d0ba 285 equeue_cancel(&q, ids[i]);
marcozecchini 0:9fca2b23d0ba 286 }
marcozecchini 0:9fca2b23d0ba 287
marcozecchini 0:9fca2b23d0ba 288 free(ids);
marcozecchini 0:9fca2b23d0ba 289
marcozecchini 0:9fca2b23d0ba 290 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 291 test_assert(!touched);
marcozecchini 0:9fca2b23d0ba 292
marcozecchini 0:9fca2b23d0ba 293 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 294 }
marcozecchini 0:9fca2b23d0ba 295
marcozecchini 0:9fca2b23d0ba 296 void cancel_inflight_test(void) {
marcozecchini 0:9fca2b23d0ba 297 equeue_t q;
marcozecchini 0:9fca2b23d0ba 298 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 299 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 300
marcozecchini 0:9fca2b23d0ba 301 bool touched = false;
marcozecchini 0:9fca2b23d0ba 302
marcozecchini 0:9fca2b23d0ba 303 int id = equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 304 equeue_cancel(&q, id);
marcozecchini 0:9fca2b23d0ba 305
marcozecchini 0:9fca2b23d0ba 306 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 307 test_assert(!touched);
marcozecchini 0:9fca2b23d0ba 308
marcozecchini 0:9fca2b23d0ba 309 id = equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 310 equeue_cancel(&q, id);
marcozecchini 0:9fca2b23d0ba 311
marcozecchini 0:9fca2b23d0ba 312 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 313 test_assert(!touched);
marcozecchini 0:9fca2b23d0ba 314
marcozecchini 0:9fca2b23d0ba 315 struct cancel *cancel = equeue_alloc(&q, sizeof(struct cancel));
marcozecchini 0:9fca2b23d0ba 316 test_assert(cancel);
marcozecchini 0:9fca2b23d0ba 317 cancel->q = &q;
marcozecchini 0:9fca2b23d0ba 318 cancel->id = 0;
marcozecchini 0:9fca2b23d0ba 319
marcozecchini 0:9fca2b23d0ba 320 id = equeue_post(&q, cancel_func, cancel);
marcozecchini 0:9fca2b23d0ba 321 test_assert(id);
marcozecchini 0:9fca2b23d0ba 322
marcozecchini 0:9fca2b23d0ba 323 cancel->id = equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 324
marcozecchini 0:9fca2b23d0ba 325 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 326 test_assert(!touched);
marcozecchini 0:9fca2b23d0ba 327
marcozecchini 0:9fca2b23d0ba 328 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 329 }
marcozecchini 0:9fca2b23d0ba 330
marcozecchini 0:9fca2b23d0ba 331 void cancel_unnecessarily_test(void) {
marcozecchini 0:9fca2b23d0ba 332 equeue_t q;
marcozecchini 0:9fca2b23d0ba 333 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 334 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 335
marcozecchini 0:9fca2b23d0ba 336 int id = equeue_call(&q, pass_func, 0);
marcozecchini 0:9fca2b23d0ba 337 for (int i = 0; i < 5; i++) {
marcozecchini 0:9fca2b23d0ba 338 equeue_cancel(&q, id);
marcozecchini 0:9fca2b23d0ba 339 }
marcozecchini 0:9fca2b23d0ba 340
marcozecchini 0:9fca2b23d0ba 341 id = equeue_call(&q, pass_func, 0);
marcozecchini 0:9fca2b23d0ba 342 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 343 for (int i = 0; i < 5; i++) {
marcozecchini 0:9fca2b23d0ba 344 equeue_cancel(&q, id);
marcozecchini 0:9fca2b23d0ba 345 }
marcozecchini 0:9fca2b23d0ba 346
marcozecchini 0:9fca2b23d0ba 347 bool touched = false;
marcozecchini 0:9fca2b23d0ba 348 equeue_call(&q, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 349 for (int i = 0; i < 5; i++) {
marcozecchini 0:9fca2b23d0ba 350 equeue_cancel(&q, id);
marcozecchini 0:9fca2b23d0ba 351 }
marcozecchini 0:9fca2b23d0ba 352
marcozecchini 0:9fca2b23d0ba 353 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 354 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 355
marcozecchini 0:9fca2b23d0ba 356 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 357 }
marcozecchini 0:9fca2b23d0ba 358
marcozecchini 0:9fca2b23d0ba 359 void loop_protect_test(void) {
marcozecchini 0:9fca2b23d0ba 360 equeue_t q;
marcozecchini 0:9fca2b23d0ba 361 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 362 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 363
marcozecchini 0:9fca2b23d0ba 364 bool touched = false;
marcozecchini 0:9fca2b23d0ba 365 equeue_call_every(&q, 0, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 366
marcozecchini 0:9fca2b23d0ba 367 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 368 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 369
marcozecchini 0:9fca2b23d0ba 370 touched = false;
marcozecchini 0:9fca2b23d0ba 371 equeue_call_every(&q, 1, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 372
marcozecchini 0:9fca2b23d0ba 373 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 374 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 375
marcozecchini 0:9fca2b23d0ba 376 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 377 }
marcozecchini 0:9fca2b23d0ba 378
marcozecchini 0:9fca2b23d0ba 379 void break_test(void) {
marcozecchini 0:9fca2b23d0ba 380 equeue_t q;
marcozecchini 0:9fca2b23d0ba 381 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 382 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 383
marcozecchini 0:9fca2b23d0ba 384 bool touched = false;
marcozecchini 0:9fca2b23d0ba 385 equeue_call_every(&q, 0, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 386
marcozecchini 0:9fca2b23d0ba 387 equeue_break(&q);
marcozecchini 0:9fca2b23d0ba 388 equeue_dispatch(&q, -1);
marcozecchini 0:9fca2b23d0ba 389 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 390
marcozecchini 0:9fca2b23d0ba 391 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 392 }
marcozecchini 0:9fca2b23d0ba 393
marcozecchini 0:9fca2b23d0ba 394 void period_test(void) {
marcozecchini 0:9fca2b23d0ba 395 equeue_t q;
marcozecchini 0:9fca2b23d0ba 396 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 397 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 398
marcozecchini 0:9fca2b23d0ba 399 int count = 0;
marcozecchini 0:9fca2b23d0ba 400 equeue_call_every(&q, 10, simple_func, &count);
marcozecchini 0:9fca2b23d0ba 401
marcozecchini 0:9fca2b23d0ba 402 equeue_dispatch(&q, 55);
marcozecchini 0:9fca2b23d0ba 403 test_assert(count == 5);
marcozecchini 0:9fca2b23d0ba 404
marcozecchini 0:9fca2b23d0ba 405 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 406 }
marcozecchini 0:9fca2b23d0ba 407
marcozecchini 0:9fca2b23d0ba 408 void nested_test(void) {
marcozecchini 0:9fca2b23d0ba 409 equeue_t q;
marcozecchini 0:9fca2b23d0ba 410 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 411 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 412
marcozecchini 0:9fca2b23d0ba 413 int touched = 0;
marcozecchini 0:9fca2b23d0ba 414 struct nest *nest = equeue_alloc(&q, sizeof(struct nest));
marcozecchini 0:9fca2b23d0ba 415 test_assert(nest);
marcozecchini 0:9fca2b23d0ba 416 nest->q = &q;
marcozecchini 0:9fca2b23d0ba 417 nest->cb = simple_func;
marcozecchini 0:9fca2b23d0ba 418 nest->data = &touched;
marcozecchini 0:9fca2b23d0ba 419
marcozecchini 0:9fca2b23d0ba 420 int id = equeue_post(&q, nest_func, nest);
marcozecchini 0:9fca2b23d0ba 421 test_assert(id);
marcozecchini 0:9fca2b23d0ba 422
marcozecchini 0:9fca2b23d0ba 423 equeue_dispatch(&q, 5);
marcozecchini 0:9fca2b23d0ba 424 test_assert(touched == 0);
marcozecchini 0:9fca2b23d0ba 425
marcozecchini 0:9fca2b23d0ba 426 equeue_dispatch(&q, 5);
marcozecchini 0:9fca2b23d0ba 427 test_assert(touched == 1);
marcozecchini 0:9fca2b23d0ba 428
marcozecchini 0:9fca2b23d0ba 429 touched = 0;
marcozecchini 0:9fca2b23d0ba 430 nest = equeue_alloc(&q, sizeof(struct nest));
marcozecchini 0:9fca2b23d0ba 431 test_assert(nest);
marcozecchini 0:9fca2b23d0ba 432 nest->q = &q;
marcozecchini 0:9fca2b23d0ba 433 nest->cb = simple_func;
marcozecchini 0:9fca2b23d0ba 434 nest->data = &touched;
marcozecchini 0:9fca2b23d0ba 435
marcozecchini 0:9fca2b23d0ba 436 id = equeue_post(&q, nest_func, nest);
marcozecchini 0:9fca2b23d0ba 437 test_assert(id);
marcozecchini 0:9fca2b23d0ba 438
marcozecchini 0:9fca2b23d0ba 439 equeue_dispatch(&q, 20);
marcozecchini 0:9fca2b23d0ba 440 test_assert(touched == 1);
marcozecchini 0:9fca2b23d0ba 441
marcozecchini 0:9fca2b23d0ba 442 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 443 }
marcozecchini 0:9fca2b23d0ba 444
marcozecchini 0:9fca2b23d0ba 445 void sloth_test(void) {
marcozecchini 0:9fca2b23d0ba 446 equeue_t q;
marcozecchini 0:9fca2b23d0ba 447 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 448 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 449
marcozecchini 0:9fca2b23d0ba 450 int touched = 0;
marcozecchini 0:9fca2b23d0ba 451 int id = equeue_call(&q, sloth_func, &touched);
marcozecchini 0:9fca2b23d0ba 452 test_assert(id);
marcozecchini 0:9fca2b23d0ba 453
marcozecchini 0:9fca2b23d0ba 454 id = equeue_call_in(&q, 5, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 455 test_assert(id);
marcozecchini 0:9fca2b23d0ba 456
marcozecchini 0:9fca2b23d0ba 457 id = equeue_call_in(&q, 15, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 458 test_assert(id);
marcozecchini 0:9fca2b23d0ba 459
marcozecchini 0:9fca2b23d0ba 460 equeue_dispatch(&q, 20);
marcozecchini 0:9fca2b23d0ba 461 test_assert(touched == 3);
marcozecchini 0:9fca2b23d0ba 462
marcozecchini 0:9fca2b23d0ba 463 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 464 }
marcozecchini 0:9fca2b23d0ba 465
marcozecchini 0:9fca2b23d0ba 466 void *multithread_thread(void *p) {
marcozecchini 0:9fca2b23d0ba 467 equeue_t *q = (equeue_t *)p;
marcozecchini 0:9fca2b23d0ba 468 equeue_dispatch(q, -1);
marcozecchini 0:9fca2b23d0ba 469 return 0;
marcozecchini 0:9fca2b23d0ba 470 }
marcozecchini 0:9fca2b23d0ba 471
marcozecchini 0:9fca2b23d0ba 472 void multithread_test(void) {
marcozecchini 0:9fca2b23d0ba 473 equeue_t q;
marcozecchini 0:9fca2b23d0ba 474 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 475 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 476
marcozecchini 0:9fca2b23d0ba 477 int touched = 0;
marcozecchini 0:9fca2b23d0ba 478 equeue_call_every(&q, 1, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 479
marcozecchini 0:9fca2b23d0ba 480 pthread_t thread;
marcozecchini 0:9fca2b23d0ba 481 err = pthread_create(&thread, 0, multithread_thread, &q);
marcozecchini 0:9fca2b23d0ba 482 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 483
marcozecchini 0:9fca2b23d0ba 484 usleep(10000);
marcozecchini 0:9fca2b23d0ba 485 equeue_break(&q);
marcozecchini 0:9fca2b23d0ba 486 err = pthread_join(thread, 0);
marcozecchini 0:9fca2b23d0ba 487 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 488
marcozecchini 0:9fca2b23d0ba 489 test_assert(touched);
marcozecchini 0:9fca2b23d0ba 490
marcozecchini 0:9fca2b23d0ba 491 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 492 }
marcozecchini 0:9fca2b23d0ba 493
marcozecchini 0:9fca2b23d0ba 494 void background_func(void *p, int ms) {
marcozecchini 0:9fca2b23d0ba 495 *(unsigned *)p = ms;
marcozecchini 0:9fca2b23d0ba 496 }
marcozecchini 0:9fca2b23d0ba 497
marcozecchini 0:9fca2b23d0ba 498 void background_test(void) {
marcozecchini 0:9fca2b23d0ba 499 equeue_t q;
marcozecchini 0:9fca2b23d0ba 500 int err = equeue_create(&q, 2048);
marcozecchini 0:9fca2b23d0ba 501 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 502
marcozecchini 0:9fca2b23d0ba 503 int id = equeue_call_in(&q, 20, pass_func, 0);
marcozecchini 0:9fca2b23d0ba 504 test_assert(id);
marcozecchini 0:9fca2b23d0ba 505
marcozecchini 0:9fca2b23d0ba 506 unsigned ms;
marcozecchini 0:9fca2b23d0ba 507 equeue_background(&q, background_func, &ms);
marcozecchini 0:9fca2b23d0ba 508 test_assert(ms == 20);
marcozecchini 0:9fca2b23d0ba 509
marcozecchini 0:9fca2b23d0ba 510 id = equeue_call_in(&q, 10, pass_func, 0);
marcozecchini 0:9fca2b23d0ba 511 test_assert(id);
marcozecchini 0:9fca2b23d0ba 512 test_assert(ms == 10);
marcozecchini 0:9fca2b23d0ba 513
marcozecchini 0:9fca2b23d0ba 514 id = equeue_call(&q, pass_func, 0);
marcozecchini 0:9fca2b23d0ba 515 test_assert(id);
marcozecchini 0:9fca2b23d0ba 516 test_assert(ms == 0);
marcozecchini 0:9fca2b23d0ba 517
marcozecchini 0:9fca2b23d0ba 518 equeue_dispatch(&q, 0);
marcozecchini 0:9fca2b23d0ba 519 test_assert(ms == 10);
marcozecchini 0:9fca2b23d0ba 520
marcozecchini 0:9fca2b23d0ba 521 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 522 test_assert(ms == -1);
marcozecchini 0:9fca2b23d0ba 523 }
marcozecchini 0:9fca2b23d0ba 524
marcozecchini 0:9fca2b23d0ba 525 void chain_test(void) {
marcozecchini 0:9fca2b23d0ba 526 equeue_t q1;
marcozecchini 0:9fca2b23d0ba 527 int err = equeue_create(&q1, 2048);
marcozecchini 0:9fca2b23d0ba 528 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 529
marcozecchini 0:9fca2b23d0ba 530 equeue_t q2;
marcozecchini 0:9fca2b23d0ba 531 err = equeue_create(&q2, 2048);
marcozecchini 0:9fca2b23d0ba 532 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 533
marcozecchini 0:9fca2b23d0ba 534 equeue_chain(&q2, &q1);
marcozecchini 0:9fca2b23d0ba 535
marcozecchini 0:9fca2b23d0ba 536 int touched = 0;
marcozecchini 0:9fca2b23d0ba 537
marcozecchini 0:9fca2b23d0ba 538 int id1 = equeue_call_in(&q1, 20, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 539 int id2 = equeue_call_in(&q2, 20, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 540 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 541
marcozecchini 0:9fca2b23d0ba 542 id1 = equeue_call(&q1, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 543 id2 = equeue_call(&q2, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 544 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 545
marcozecchini 0:9fca2b23d0ba 546 id1 = equeue_call_in(&q1, 5, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 547 id2 = equeue_call_in(&q2, 5, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 548 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 549
marcozecchini 0:9fca2b23d0ba 550 equeue_cancel(&q1, id1);
marcozecchini 0:9fca2b23d0ba 551 equeue_cancel(&q2, id2);
marcozecchini 0:9fca2b23d0ba 552
marcozecchini 0:9fca2b23d0ba 553 id1 = equeue_call_in(&q1, 10, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 554 id2 = equeue_call_in(&q2, 10, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 555 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 556
marcozecchini 0:9fca2b23d0ba 557 equeue_dispatch(&q1, 30);
marcozecchini 0:9fca2b23d0ba 558
marcozecchini 0:9fca2b23d0ba 559 test_assert(touched == 6);
marcozecchini 0:9fca2b23d0ba 560
marcozecchini 0:9fca2b23d0ba 561 equeue_destroy(&q1);
marcozecchini 0:9fca2b23d0ba 562 equeue_destroy(&q2);
marcozecchini 0:9fca2b23d0ba 563 }
marcozecchini 0:9fca2b23d0ba 564
marcozecchini 0:9fca2b23d0ba 565 void unchain_test(void) {
marcozecchini 0:9fca2b23d0ba 566 equeue_t q1;
marcozecchini 0:9fca2b23d0ba 567 int err = equeue_create(&q1, 2048);
marcozecchini 0:9fca2b23d0ba 568 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 569
marcozecchini 0:9fca2b23d0ba 570 equeue_t q2;
marcozecchini 0:9fca2b23d0ba 571 err = equeue_create(&q2, 2048);
marcozecchini 0:9fca2b23d0ba 572 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 573
marcozecchini 0:9fca2b23d0ba 574 equeue_chain(&q2, &q1);
marcozecchini 0:9fca2b23d0ba 575
marcozecchini 0:9fca2b23d0ba 576 int touched = 0;
marcozecchini 0:9fca2b23d0ba 577 int id1 = equeue_call(&q1, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 578 int id2 = equeue_call(&q2, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 579 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 580
marcozecchini 0:9fca2b23d0ba 581 equeue_dispatch(&q1, 0);
marcozecchini 0:9fca2b23d0ba 582 test_assert(touched == 2);
marcozecchini 0:9fca2b23d0ba 583
marcozecchini 0:9fca2b23d0ba 584 equeue_chain(&q2, 0);
marcozecchini 0:9fca2b23d0ba 585 equeue_chain(&q1, &q2);
marcozecchini 0:9fca2b23d0ba 586
marcozecchini 0:9fca2b23d0ba 587 id1 = equeue_call(&q1, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 588 id2 = equeue_call(&q2, simple_func, &touched);
marcozecchini 0:9fca2b23d0ba 589 test_assert(id1 && id2);
marcozecchini 0:9fca2b23d0ba 590
marcozecchini 0:9fca2b23d0ba 591 equeue_dispatch(&q2, 0);
marcozecchini 0:9fca2b23d0ba 592 test_assert(touched == 4);
marcozecchini 0:9fca2b23d0ba 593
marcozecchini 0:9fca2b23d0ba 594 equeue_destroy(&q1);
marcozecchini 0:9fca2b23d0ba 595 equeue_destroy(&q2);
marcozecchini 0:9fca2b23d0ba 596 }
marcozecchini 0:9fca2b23d0ba 597
marcozecchini 0:9fca2b23d0ba 598 // Barrage tests
marcozecchini 0:9fca2b23d0ba 599 void simple_barrage_test(int N) {
marcozecchini 0:9fca2b23d0ba 600 equeue_t q;
marcozecchini 0:9fca2b23d0ba 601 int err = equeue_create(&q, N*(EQUEUE_EVENT_SIZE+sizeof(struct timing)));
marcozecchini 0:9fca2b23d0ba 602 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 603
marcozecchini 0:9fca2b23d0ba 604 for (int i = 0; i < N; i++) {
marcozecchini 0:9fca2b23d0ba 605 struct timing *timing = equeue_alloc(&q, sizeof(struct timing));
marcozecchini 0:9fca2b23d0ba 606 test_assert(timing);
marcozecchini 0:9fca2b23d0ba 607
marcozecchini 0:9fca2b23d0ba 608 timing->tick = equeue_tick();
marcozecchini 0:9fca2b23d0ba 609 timing->delay = (i+1)*100;
marcozecchini 0:9fca2b23d0ba 610 equeue_event_delay(timing, timing->delay);
marcozecchini 0:9fca2b23d0ba 611 equeue_event_period(timing, timing->delay);
marcozecchini 0:9fca2b23d0ba 612
marcozecchini 0:9fca2b23d0ba 613 int id = equeue_post(&q, timing_func, timing);
marcozecchini 0:9fca2b23d0ba 614 test_assert(id);
marcozecchini 0:9fca2b23d0ba 615 }
marcozecchini 0:9fca2b23d0ba 616
marcozecchini 0:9fca2b23d0ba 617 equeue_dispatch(&q, N*100);
marcozecchini 0:9fca2b23d0ba 618
marcozecchini 0:9fca2b23d0ba 619 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 620 }
marcozecchini 0:9fca2b23d0ba 621
marcozecchini 0:9fca2b23d0ba 622 void fragmenting_barrage_test(int N) {
marcozecchini 0:9fca2b23d0ba 623 equeue_t q;
marcozecchini 0:9fca2b23d0ba 624 int err = equeue_create(&q,
marcozecchini 0:9fca2b23d0ba 625 2*N*(EQUEUE_EVENT_SIZE+sizeof(struct fragment)+N*sizeof(int)));
marcozecchini 0:9fca2b23d0ba 626 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 627
marcozecchini 0:9fca2b23d0ba 628 for (int i = 0; i < N; i++) {
marcozecchini 0:9fca2b23d0ba 629 size_t size = sizeof(struct fragment) + i*sizeof(int);
marcozecchini 0:9fca2b23d0ba 630 struct fragment *fragment = equeue_alloc(&q, size);
marcozecchini 0:9fca2b23d0ba 631 test_assert(fragment);
marcozecchini 0:9fca2b23d0ba 632
marcozecchini 0:9fca2b23d0ba 633 fragment->q = &q;
marcozecchini 0:9fca2b23d0ba 634 fragment->size = size;
marcozecchini 0:9fca2b23d0ba 635 fragment->timing.tick = equeue_tick();
marcozecchini 0:9fca2b23d0ba 636 fragment->timing.delay = (i+1)*100;
marcozecchini 0:9fca2b23d0ba 637 equeue_event_delay(fragment, fragment->timing.delay);
marcozecchini 0:9fca2b23d0ba 638
marcozecchini 0:9fca2b23d0ba 639 int id = equeue_post(&q, fragment_func, fragment);
marcozecchini 0:9fca2b23d0ba 640 test_assert(id);
marcozecchini 0:9fca2b23d0ba 641 }
marcozecchini 0:9fca2b23d0ba 642
marcozecchini 0:9fca2b23d0ba 643 equeue_dispatch(&q, N*100);
marcozecchini 0:9fca2b23d0ba 644
marcozecchini 0:9fca2b23d0ba 645 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 646 }
marcozecchini 0:9fca2b23d0ba 647
marcozecchini 0:9fca2b23d0ba 648 struct ethread {
marcozecchini 0:9fca2b23d0ba 649 pthread_t thread;
marcozecchini 0:9fca2b23d0ba 650 equeue_t *q;
marcozecchini 0:9fca2b23d0ba 651 int ms;
marcozecchini 0:9fca2b23d0ba 652 };
marcozecchini 0:9fca2b23d0ba 653
marcozecchini 0:9fca2b23d0ba 654 static void *ethread_dispatch(void *p) {
marcozecchini 0:9fca2b23d0ba 655 struct ethread *t = (struct ethread*)p;
marcozecchini 0:9fca2b23d0ba 656 equeue_dispatch(t->q, t->ms);
marcozecchini 0:9fca2b23d0ba 657 return 0;
marcozecchini 0:9fca2b23d0ba 658 }
marcozecchini 0:9fca2b23d0ba 659
marcozecchini 0:9fca2b23d0ba 660 void multithreaded_barrage_test(int N) {
marcozecchini 0:9fca2b23d0ba 661 equeue_t q;
marcozecchini 0:9fca2b23d0ba 662 int err = equeue_create(&q, N*(EQUEUE_EVENT_SIZE+sizeof(struct timing)));
marcozecchini 0:9fca2b23d0ba 663 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 664
marcozecchini 0:9fca2b23d0ba 665 struct ethread t;
marcozecchini 0:9fca2b23d0ba 666 t.q = &q;
marcozecchini 0:9fca2b23d0ba 667 t.ms = N*100;
marcozecchini 0:9fca2b23d0ba 668 err = pthread_create(&t.thread, 0, ethread_dispatch, &t);
marcozecchini 0:9fca2b23d0ba 669 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 670
marcozecchini 0:9fca2b23d0ba 671 for (int i = 0; i < N; i++) {
marcozecchini 0:9fca2b23d0ba 672 struct timing *timing = equeue_alloc(&q, sizeof(struct timing));
marcozecchini 0:9fca2b23d0ba 673 test_assert(timing);
marcozecchini 0:9fca2b23d0ba 674
marcozecchini 0:9fca2b23d0ba 675 timing->tick = equeue_tick();
marcozecchini 0:9fca2b23d0ba 676 timing->delay = (i+1)*100;
marcozecchini 0:9fca2b23d0ba 677 equeue_event_delay(timing, timing->delay);
marcozecchini 0:9fca2b23d0ba 678 equeue_event_period(timing, timing->delay);
marcozecchini 0:9fca2b23d0ba 679
marcozecchini 0:9fca2b23d0ba 680 int id = equeue_post(&q, timing_func, timing);
marcozecchini 0:9fca2b23d0ba 681 test_assert(id);
marcozecchini 0:9fca2b23d0ba 682 }
marcozecchini 0:9fca2b23d0ba 683
marcozecchini 0:9fca2b23d0ba 684 err = pthread_join(t.thread, 0);
marcozecchini 0:9fca2b23d0ba 685 test_assert(!err);
marcozecchini 0:9fca2b23d0ba 686
marcozecchini 0:9fca2b23d0ba 687 equeue_destroy(&q);
marcozecchini 0:9fca2b23d0ba 688 }
marcozecchini 0:9fca2b23d0ba 689
marcozecchini 0:9fca2b23d0ba 690
marcozecchini 0:9fca2b23d0ba 691 int main() {
marcozecchini 0:9fca2b23d0ba 692 printf("beginning tests...\n");
marcozecchini 0:9fca2b23d0ba 693
marcozecchini 0:9fca2b23d0ba 694 test_run(simple_call_test);
marcozecchini 0:9fca2b23d0ba 695 test_run(simple_call_in_test);
marcozecchini 0:9fca2b23d0ba 696 test_run(simple_call_every_test);
marcozecchini 0:9fca2b23d0ba 697 test_run(simple_post_test);
marcozecchini 0:9fca2b23d0ba 698 test_run(destructor_test);
marcozecchini 0:9fca2b23d0ba 699 test_run(allocation_failure_test);
marcozecchini 0:9fca2b23d0ba 700 test_run(cancel_test, 20);
marcozecchini 0:9fca2b23d0ba 701 test_run(cancel_inflight_test);
marcozecchini 0:9fca2b23d0ba 702 test_run(cancel_unnecessarily_test);
marcozecchini 0:9fca2b23d0ba 703 test_run(loop_protect_test);
marcozecchini 0:9fca2b23d0ba 704 test_run(break_test);
marcozecchini 0:9fca2b23d0ba 705 test_run(period_test);
marcozecchini 0:9fca2b23d0ba 706 test_run(nested_test);
marcozecchini 0:9fca2b23d0ba 707 test_run(sloth_test);
marcozecchini 0:9fca2b23d0ba 708 test_run(background_test);
marcozecchini 0:9fca2b23d0ba 709 test_run(chain_test);
marcozecchini 0:9fca2b23d0ba 710 test_run(unchain_test);
marcozecchini 0:9fca2b23d0ba 711 test_run(multithread_test);
marcozecchini 0:9fca2b23d0ba 712 test_run(simple_barrage_test, 20);
marcozecchini 0:9fca2b23d0ba 713 test_run(fragmenting_barrage_test, 20);
marcozecchini 0:9fca2b23d0ba 714 test_run(multithreaded_barrage_test, 20);
marcozecchini 0:9fca2b23d0ba 715
marcozecchini 0:9fca2b23d0ba 716 printf("done!\n");
marcozecchini 0:9fca2b23d0ba 717 return test_failure;
marcozecchini 0:9fca2b23d0ba 718 }