@@ -46,6 +46,11 @@ void simple_func(void *p) {
46
46
(* (int * )p )++ ;
47
47
}
48
48
49
+ void sloth_func (void * p ) {
50
+ usleep (10000 );
51
+ (* (int * )p )++ ;
52
+ }
53
+
49
54
struct indirect {
50
55
int * touched ;
51
56
uint8_t buffer [7 ];
@@ -102,6 +107,19 @@ void cancel_func(void *p) {
102
107
equeue_cancel (cancel -> q , cancel -> id );
103
108
}
104
109
110
+ struct nest {
111
+ equeue_t * q ;
112
+ void (* cb )(void * );
113
+ void * data ;
114
+ };
115
+
116
+ void nest_func (void * p ) {
117
+ struct nest * nest = (struct nest * )p ;
118
+ equeue_call (nest -> q , nest -> cb , nest -> data );
119
+
120
+ usleep (10000 );
121
+ }
122
+
105
123
106
124
// Simple call tests
107
125
void simple_call_test (void ) {
@@ -375,6 +393,92 @@ void period_test(void) {
375
393
equeue_destroy (& q );
376
394
}
377
395
396
+ void nested_test (void ) {
397
+ equeue_t q ;
398
+ int err = equeue_create (& q , 2048 );
399
+ test_assert (!err );
400
+
401
+ int touched = 0 ;
402
+ struct nest * nest = equeue_alloc (& q , sizeof (struct nest ));
403
+ test_assert (nest );
404
+ nest -> q = & q ;
405
+ nest -> cb = simple_func ;
406
+ nest -> data = & touched ;
407
+
408
+ int id = equeue_post (& q , nest_func , nest );
409
+ test_assert (id );
410
+
411
+ equeue_dispatch (& q , 5 );
412
+ test_assert (touched == 0 );
413
+
414
+ equeue_dispatch (& q , 5 );
415
+ test_assert (touched == 1 );
416
+
417
+ touched = 0 ;
418
+ nest = equeue_alloc (& q , sizeof (struct nest ));
419
+ test_assert (nest );
420
+ nest -> q = & q ;
421
+ nest -> cb = simple_func ;
422
+ nest -> data = & touched ;
423
+
424
+ id = equeue_post (& q , nest_func , nest );
425
+ test_assert (id );
426
+
427
+ equeue_dispatch (& q , 20 );
428
+ test_assert (touched == 1 );
429
+
430
+ equeue_destroy (& q );
431
+ }
432
+
433
+ void sloth_test (void ) {
434
+ equeue_t q ;
435
+ int err = equeue_create (& q , 2048 );
436
+ test_assert (!err );
437
+
438
+ int touched = 0 ;
439
+ int id = equeue_call (& q , sloth_func , & touched );
440
+ test_assert (id );
441
+
442
+ id = equeue_call_in (& q , 5 , simple_func , & touched );
443
+ test_assert (id );
444
+
445
+ id = equeue_call_in (& q , 15 , simple_func , & touched );
446
+ test_assert (id );
447
+
448
+ equeue_dispatch (& q , 20 );
449
+ test_assert (touched == 3 );
450
+
451
+ equeue_destroy (& q );
452
+ }
453
+
454
+ void * multithread_thread (void * p ) {
455
+ equeue_t * q = (equeue_t * )p ;
456
+ equeue_dispatch (q , -1 );
457
+ return 0 ;
458
+ }
459
+
460
+ void multithread_test (void ) {
461
+ equeue_t q ;
462
+ int err = equeue_create (& q , 2048 );
463
+ test_assert (!err );
464
+
465
+ bool touched = false;
466
+ equeue_call_every (& q , 1 , simple_func , & touched );
467
+
468
+ pthread_t thread ;
469
+ err = pthread_create (& thread , 0 , multithread_thread , & q );
470
+ test_assert (!err );
471
+
472
+ usleep (10000 );
473
+ equeue_break (& q );
474
+ err = pthread_join (thread , 0 );
475
+ test_assert (!err );
476
+
477
+ test_assert (touched );
478
+
479
+ equeue_destroy (& q );
480
+ }
481
+
378
482
// Barrage tests
379
483
void simple_barrage_test (int N ) {
380
484
equeue_t q ;
@@ -483,6 +587,9 @@ int main() {
483
587
test_run (loop_protect_test );
484
588
test_run (break_test );
485
589
test_run (period_test );
590
+ test_run (nested_test );
591
+ test_run (sloth_test );
592
+ test_run (multithread_test );
486
593
test_run (simple_barrage_test , 20 );
487
594
test_run (fragmenting_barrage_test , 20 );
488
595
test_run (multithreaded_barrage_test , 20 );
0 commit comments