static int test_cvector(void) { test_start("cvector"); // Src: https://gist.github.com/EmilHernvall/953968 cvector_t v; cvector_init(&v); cvector_add(&v, (cvector_item_t)1); cvector_add(&v, (cvector_item_t)2); cvector_add(&v, (cvector_item_t)3); cvector_add(&v, (cvector_item_t)4); cvector_add(&v, (cvector_item_t)5); test_assert(cvector_count(&v) == (int)5); test_assert(cvector_get(&v, 0) == (cvector_item_t)1); test_assert(cvector_get(&v, 1) == (cvector_item_t)2); test_assert(cvector_get(&v, 2) == (cvector_item_t)3); test_assert(cvector_get(&v, 3) == (cvector_item_t)4); test_assert(cvector_get(&v, 4) == (cvector_item_t)5); cvector_delete(&v, 1); cvector_delete(&v, 3); test_assert(cvector_count(&v) == (int)3); test_assert(cvector_get(&v, 0) == (cvector_item_t)1); test_assert(cvector_get(&v, 1) == (cvector_item_t)3); test_assert(cvector_get(&v, 2) == (cvector_item_t)4); cvector_free(&v); int vcStress = 10000; for (int i = 0; i < vcStress; i++) { int data = ((i << 2) * 0xcafebabe) ^ 0xdeadbeef; cvector_add(&v, (cvector_item_t)data); test_assert(cvector_count(&v) == (int)(i + 1)); test_assert(cvector_get(&v, i) == (cvector_item_t)data); data = (data << 7) ^ 0xbaabaabb; cvector_set(&v, i, (cvector_item_t)data); test_assert(cvector_count(&v) == (int)(i + 1)); test_assert(cvector_get(&v, i) == (cvector_item_t)data); } cvector_free(&v); return test_success(); }
ssize_t rumble_gatekeeper_auth(sessionHandle *session, const char *OK) { /*~~~~~~~~~~~~~~~~~~~~~~~*/ gatekeeper_login_attempt* entry; c_iterator iter; /*~~~~~~~~~~~~~~~~~~~~~~~*/ if (!Gatekeeper_enabled) return (RUMBLE_RETURN_OKAY); // Was the login OK? If so, let's delete any counters we have if (OK) { cforeach((gatekeeper_login_attempt*), entry, gatekeeper_login_list, iter) { if (!strcmp(entry->ip, session->client->addr)) { cvector_delete(&iter); free(entry); break; } } } // Login went bad, let's write that down! else {
uint32_t cpool_alloc(cpool_t *p) { assert(p); // First try to allocate from the free list. size_t fSz = cvector_count(&p->freelist); if (fSz > 0) { // Allocate the last item available on the free list. cvector_item_t obj = cvector_get(&p->freelist, fSz - 1); cvector_delete(&p->freelist, fSz - 1); return (uint32_t) obj; } // Free list exhausted, allocate by increasing max obj ID.. if (p->mx <= p->end) { return (uint32_t) p->mx++; } // Out of object to allocate. return 0; }
ssize_t rumble_gatekeeper_close(sessionHandle *session, const char *junk) { /*~~~~~~~~~~~~~~~~~~~~~~~*/ gatekeeper_connection* centry; c_iterator iter; /*~~~~~~~~~~~~~~~~~~~~~~~*/ if (!Gatekeeper_enabled) return (RUMBLE_RETURN_OKAY); rumble_rw_start_write(Gatekeeper_lock); cforeach((gatekeeper_connection*), centry, gatekeeper_connection_list, iter) { if (!memcmp(centry->ip, session->client->addr, 46)) { centry->connections--; if (centry->connections == 0) { cvector_delete(&iter); free(centry); } } } rumble_rw_stop_write(Gatekeeper_lock); return RUMBLE_RETURN_OKAY; }