BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

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