static int single_waiter_test() { VCOS_EVENT_FLAGS_T event; WAITER_T waiter; int passed = 1; vcos_log("%s", __FUNCTION__); if(vcos_event_flags_create(&event,"test") != VCOS_SUCCESS) passed = 0; if(passed && waiter_init(&waiter, &event, 1) < 0) { vcos_event_flags_delete(&event); passed = 0; } if(passed) { run_waiter(&waiter, 0, 1, VCOS_OR_CONSUME, VCOS_EVENT_FLAGS_SUSPEND, 10, 1, VCOS_SUCCESS, 0, &passed); run_waiter(&waiter, 10, 1, VCOS_OR_CONSUME, VCOS_EVENT_FLAGS_SUSPEND, 0, 1, VCOS_SUCCESS, 0, &passed); run_waiter(&waiter, 0, 1, VCOS_OR_CONSUME, VCOS_EVENT_FLAGS_SUSPEND, 10, 3, VCOS_SUCCESS, 2, &passed); run_waiter(&waiter, 0, 1, VCOS_OR_CONSUME, 20, 10, 2, VCOS_EAGAIN, 2, &passed); run_waiter(&waiter, 10, 1, VCOS_OR_CONSUME, 10, 0, 2, VCOS_EAGAIN, 2, &passed); waiter_deinit(&waiter, &passed); vcos_event_flags_delete(&event); } return passed; }
static int basic_timeout(void) { int delay = 10; #ifdef VCOS_TIMER_MARGIN_EARLY int margin_early = VCOS_TIMER_MARGIN_EARLY; int margin_late = VCOS_TIMER_MARGIN_LATE; #else int margin_early = SLACK; int margin_late = SLACK; #endif VCOS_EVENT_FLAGS_T flags; VCOS_STATUS_T st = vcos_event_flags_create(&flags, "test"); VCOS_UNSIGNED elapsed_time = vcos_get_ms(), actual; st = vcos_event_flags_get(&flags, 1, VCOS_OR, delay, &actual); if (st == VCOS_EAGAIN) { elapsed_time = vcos_get_ms()-elapsed_time; if (((int) elapsed_time >= (delay - margin_early)) && ((int) elapsed_time <= (delay + margin_late))) { vcos_log("Good delay: %d ms", elapsed_time); vcos_event_flags_delete(&flags); return 1; } vcos_log("Wrong delay: %d ms, expected %d ms", elapsed_time, delay); } vcos_event_flags_delete(&flags); return 0; }
static int32_t guard_init(GUARD_T *guard) { memset(guard, 0, sizeof(GUARD_T)); if(vcos_semaphore_create(&guard->go, "go", 0) != VCOS_SUCCESS) return -1; if(vcos_semaphore_create(&guard->done, "done", 0) != VCOS_SUCCESS) { vcos_semaphore_delete(&guard->go); return -1; } if(vcos_event_flags_create(&guard->event, "event") != VCOS_SUCCESS) { vcos_semaphore_delete(&guard->go); vcos_semaphore_delete(&guard->done); return -1; } if (vcos_thread_create(&guard->thread, "guard", NULL, guard_func, guard) != VCOS_SUCCESS) { vcos_event_flags_delete(&guard->event); vcos_semaphore_delete(&guard->go); vcos_semaphore_delete(&guard->done); return -1; } return 0; }
static int set_operations_test() { VCOS_EVENT_FLAGS_T event; int passed = 1; if(vcos_event_flags_create(&event,"test") != VCOS_SUCCESS) passed = 0; else { check_value(&event, 0, 1, &passed); vcos_event_flags_set(&event, 1, VCOS_AND); check_value(&event, 0, 1, &passed); vcos_event_flags_set(&event, 1, VCOS_OR); check_value(&event, 1, 0, &passed); vcos_event_flags_set(&event, 8, VCOS_OR); check_value(&event, 9, 0, &passed); vcos_event_flags_set(&event, 96, VCOS_OR); check_value(&event, 9|96, 0, &passed); vcos_event_flags_set(&event, 65|1024, VCOS_AND); check_value(&event, 65, 0, &passed); vcos_event_flags_set(&event, -1, VCOS_OR); check_value(&event, -1, 1, &passed); vcos_event_flags_delete(&event); } return passed; }
~CThreadT() { vcos_event_flags_set(&m_EventFlags, s_nTerminationFlag, VCOS_OR); void* pData; vcos_thread_join(&m_Thread, &pData); vcos_event_flags_delete(&m_EventFlags); vcos_event_delete(&m_InitializedEvent); }
static void guard_deinit(GUARD_T *guard, int *passed) { guard->quit = 1; vcos_semaphore_post(&guard->go); vcos_thread_join(&guard->thread,0); vcos_semaphore_delete(&guard->go); vcos_semaphore_delete(&guard->done); vcos_event_flags_delete(&guard->event); }
static int create_test() { int passed = 1; VCOS_EVENT_FLAGS_T events[MAX_TESTED]; int i; for(i=0; i<MAX_TESTED; i++) if(vcos_event_flags_create(events+i,"test") != VCOS_SUCCESS) passed = 0; for(i=0; i<MAX_TESTED; i+=2) vcos_event_flags_delete(events+i); for(i=0; i<MAX_TESTED; i+=2) if(vcos_event_flags_create(events+i,"test") != VCOS_SUCCESS) passed = 0; if(passed) { /* see if the bits appear to be independent */ for(i=0; i<MAX_TESTED; i++) vcos_event_flags_set(events+i, i | (1<<i), VCOS_OR); for(i=0; i<MAX_TESTED; i++) { uint32_t set; if(vcos_event_flags_get(events+i, -1, VCOS_OR, VCOS_NO_SUSPEND, &set) != VCOS_SUCCESS) passed = 0; if(set != (i | (1<<i))) passed = 0; } for(i=0; i<MAX_TESTED; i++) vcos_event_flags_delete(events+i); } return passed; }
static int multiple_waiters_test() { WAITER_T waiter[3]; VCOS_EVENT_FLAGS_T event; int i; int passed = 1; vcos_log("%s", __FUNCTION__); if(vcos_event_flags_create(&event,"test") != VCOS_SUCCESS) passed = 0; i=0; while(passed && (i < 3) && waiter_init(waiter+(i), &event, i) == 0) { i++; } if(i < 3) // tidy up if we failed to create all the waiter threads { while(--i >= 0) { waiter_deinit(waiter+i, &passed); } passed = 0; } if(passed) { for(i=0; i<sizeof(specs) / sizeof(specs[0]); i++) { vcos_log("running multiple test spec %d", i); run_waiters(waiter, 3, NULL, specs[i].bitmask, specs[i].operation, specs[i].suspend, specs[i].set_sleep, specs[i].set_bitmask, specs[i].expected, specs[i].after, &passed); } for(i=0; i<3; i++) { waiter_deinit(waiter+i, &passed); } vcos_event_flags_delete(&event); } return passed; }
static int get_operations_test() { VCOS_EVENT_FLAGS_T event; int passed = 1; if(vcos_event_flags_create(&event,"test") != VCOS_SUCCESS) passed = 0; else { int testnum = 0; try_get_value(&testnum, &event, 0, 0, VCOS_OR, VCOS_EAGAIN, 0, &passed); try_get_value(&testnum, &event, 0, 0, VCOS_AND, VCOS_SUCCESS, 0, &passed); try_get_value(&testnum, &event, 0, 0, VCOS_OR_CONSUME, VCOS_EAGAIN, 0, &passed); try_get_value(&testnum, &event, 0, 0, VCOS_AND_CONSUME, VCOS_SUCCESS, 0, &passed); try_get_value(&testnum, &event, 1, 0, VCOS_OR, VCOS_EAGAIN, 1, &passed); try_get_value(&testnum, &event, 1, 0, VCOS_AND, VCOS_SUCCESS, 1, &passed); try_get_value(&testnum, &event, 1, 0, VCOS_OR_CONSUME, VCOS_EAGAIN, 1, &passed); try_get_value(&testnum, &event, 1, 0, VCOS_AND_CONSUME, VCOS_SUCCESS, 1, &passed); try_get_value(&testnum, &event, 7, 7, VCOS_OR, VCOS_SUCCESS, 7, &passed); try_get_value(&testnum, &event, 7, 7, VCOS_OR_CONSUME, VCOS_SUCCESS, 0, &passed); try_get_value(&testnum, &event, 7, 3, VCOS_OR, VCOS_SUCCESS, 7, &passed); try_get_value(&testnum, &event, 7, 3, VCOS_OR_CONSUME, VCOS_SUCCESS, 4, &passed); try_get_value(&testnum, &event, 7, 15, VCOS_OR, VCOS_SUCCESS, 7, &passed); try_get_value(&testnum, &event, 7, 15, VCOS_OR_CONSUME, VCOS_SUCCESS, 0, &passed); try_get_value(&testnum, &event, 7, 8, VCOS_OR, VCOS_EAGAIN, 7, &passed); try_get_value(&testnum, &event, 7, 8, VCOS_OR_CONSUME, VCOS_EAGAIN, 7, &passed); try_get_value(&testnum, &event, 7, 7, VCOS_AND, VCOS_SUCCESS, 7, &passed); try_get_value(&testnum, &event, 7, 7, VCOS_AND_CONSUME, VCOS_SUCCESS, 0, &passed); try_get_value(&testnum, &event, 7, 3, VCOS_AND, VCOS_SUCCESS, 7, &passed); try_get_value(&testnum, &event, 7, 3, VCOS_AND_CONSUME, VCOS_SUCCESS, 4, &passed); try_get_value(&testnum, &event, 7, 15, VCOS_AND, VCOS_EAGAIN, 7, &passed); try_get_value(&testnum, &event, 7, 15, VCOS_AND_CONSUME, VCOS_EAGAIN, 7, &passed); try_get_value(&testnum, &event, 7, 8, VCOS_AND, VCOS_EAGAIN, 7, &passed); try_get_value(&testnum, &event, 7, 8, VCOS_AND_CONSUME, VCOS_EAGAIN, 7, &passed); vcos_event_flags_delete(&event); } return passed; }
static void destroy_event( VC_POOL_T *pool ) { vcos_event_flags_delete( &pool->event ); }