static int sq_test_random(squeue_t *sq) { unsigned long size, i; unsigned long long numbers[EVT_ARY], *d, max = 0; struct timeval now; size = squeue_size(sq); now.tv_sec = time(NULL); srand((int)now.tv_sec); for (i = 0; i < EVT_ARY; i++) { now.tv_usec = (time_t)rand(); squeue_add_tv(sq, &now, &numbers[i]); numbers[i] = evt_compute_pri(&now); t(squeue_size(sq) == i + 1 + size); } t(pqueue_is_valid(sq)); /* * make sure we pop events in increasing "priority", * since we calculate priority based on time and later * is lower prio */ for (i = 0; i < EVT_ARY; i++) { d = (unsigned long long *)squeue_pop(sq); t(max <= *d, "popping randoms. i: %lu; delta: %lld; max: %llu; *d: %llu\n", i, max - *d, max, *d); max = *d; t(squeue_size(sq) == size + (EVT_ARY - i - 1)); } t(pqueue_is_valid(sq)); return 0; }
squeue_event *squeue_add_tv(squeue_t *q, struct timeval *tv, void *data) { squeue_event *evt; if (!q) return NULL; evt = calloc(1, sizeof(*evt)); if (!evt) return NULL; /* we can't schedule events in the past */ if (tv->tv_sec < time(NULL)) tv->tv_sec = time(NULL); evt->when.tv_sec = tv->tv_sec; if (sizeof(evt->when.tv_sec) > 4) { /* * Only use bottom sizeof(pqueue_pri_t)-SQ_BITS bits on * 64-bit systems, or we may get entries at the head * of the queue are actually scheduled to run several * hundred thousand years from now. */ evt->when.tv_sec &= (1ULL << ((sizeof(pqueue_pri_t) * 8) - SQ_BITS)) - 1; } evt->when.tv_usec = tv->tv_usec; evt->data = data; evt->pri = evt_compute_pri(&evt->when); if (!pqueue_insert(q, evt)) return evt; free(evt); return NULL; }
squeue_event *squeue_add_tv(squeue_t *q, struct timeval *tv, void *data) { squeue_event *evt; if (!q) return NULL; evt = calloc(1, sizeof(*evt)); if (!evt) return NULL; /* we can't schedule events in the past */ if (tv->tv_sec < time(NULL)) tv->tv_sec = time(NULL); evt->when.tv_sec = tv->tv_sec; evt->when.tv_usec = tv->tv_usec; evt->data = data; evt->pri = evt_compute_pri(&evt->when); if (!pqueue_insert(q, evt)) return evt; return NULL; }