#define PK_IMPL_MEM #define PK_IMPL_EV #include "../pkev.h" #include "../pkmacros.h" #include struct ev { struct pk_membucket *bkt; pk_ev_mgr_id_T evmgr; pk_ev_id_T evid; pk_ev_cb_id_T evcbid; int handled_count; }; struct ev ev_one = {0}; struct ev ev_two = {0}; void handle_ev_one(void *, void *, void *) { ev_one.handled_count++; } void handle_ev_two(void *, void *, void *) { ev_two.handled_count++; } int thrd_ev_emit_one(void *) { pk_ev_emit(ev_one.evmgr, ev_one.evid, NULL); return 0; } int thrd_ev_emit_two(void *) { pk_ev_emit(ev_two.evmgr, ev_two.evid, NULL); return 0; } pk_ev_mgr_id_T test_setup() { memset(&ev_one, 0, sizeof(struct ev)); memset(&ev_two, 0, sizeof(struct ev)); ev_one.bkt = pk_mem_bucket_create("test_ev_c", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE); ev_two.bkt = ev_one.bkt; pk_ev_init(ev_one.bkt); const pk_ev_mgr_id_T evmgr = pk_ev_create_mgr(); if (evmgr >= 64) { PK_LOGV_ERR("%s: failed to create pk_ev_mgr\n", __FILE__); exit(1); } ev_one.evmgr = evmgr; ev_two.evmgr = evmgr; return evmgr; } void test_teardown() { pk_ev_teardown(); pk_mem_bucket_destroy(ev_one.bkt); ev_one.bkt = NULL; ev_two.bkt = NULL; } int main(int argc, char *argv[]) { (void)argc; (void)argv; (void)stdout; int i; // register, emit, catch { const pk_ev_mgr_id_T evmgr = test_setup(); ev_one.evid = pk_ev_register_ev(evmgr, NULL); ev_two.evid = pk_ev_register_ev(evmgr, NULL); ev_one.evcbid = pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL); ev_two.evcbid = pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL); pk_ev_emit(evmgr, ev_one.evid, NULL); pk_ev_emit(evmgr, ev_two.evid, NULL); PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count); if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1); test_teardown(); } // register, emit, catch { const pk_ev_mgr_id_T evmgr = test_setup(); ev_one.evid = pk_ev_register_ev(evmgr, NULL); ev_two.evid = pk_ev_register_ev(evmgr, NULL); ev_one.evcbid = pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL); ev_two.evcbid = pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL); pk_ev_emit(evmgr, ev_one.evid, NULL); pk_ev_emit(evmgr, ev_two.evid, NULL); PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count); pk_ev_unregister_cb(evmgr, ev_one.evid, ev_one.evcbid); pk_ev_unregister_cb(evmgr, ev_two.evid, ev_two.evcbid); pk_ev_emit(evmgr, ev_one.evid, NULL); pk_ev_emit(evmgr, ev_two.evid, NULL); uint64_t left, right; left = pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].left_ev_cbs; right = pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].right_ev_cbs; PK_LOGV_INF("%s: left: %lu, right: %lu\n", __FILE__, left, right); left = pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].left_ev_cbs; right = pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].right_ev_cbs; PK_LOGV_INF("%s: left: %lu, right: %lu\n", __FILE__, left, right); if (pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].left_ev_cbs != 0) exit (1); if (pk_ev_mstr.mgrs[ev_one.evmgr]->ev[ev_one.evid].right_ev_cbs != 1) exit (1); if (pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].left_ev_cbs != 0) exit (1); if (pk_ev_mstr.mgrs[ev_two.evmgr]->ev[ev_two.evid].right_ev_cbs != 1) exit (1); if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1); test_teardown(); } // threaded register, emit, catch { thrd_t t1, t2; const pk_ev_mgr_id_T evmgr = test_setup(); ev_one.evid = pk_ev_register_ev(evmgr, NULL); ev_two.evid = pk_ev_register_ev(evmgr, NULL); pk_ev_register_cb(evmgr, ev_one.evid, handle_ev_one, NULL); pk_ev_register_cb(evmgr, ev_two.evid, handle_ev_two, NULL); thrd_create(&t1, thrd_ev_emit_one, NULL); thrd_create(&t2, thrd_ev_emit_two, NULL); thrd_join(t1, &i); thrd_join(t2, &i); PK_LOGV_INF("%s: ev_one: %i, ev_two: %i\n", __FILE__, ev_one.handled_count, ev_two.handled_count); if (ev_one.handled_count != 1 || ev_two.handled_count != 1) exit(1); test_teardown(); } return 0; }