int sampgdk_timer_set(long interval, bool repeat, sampgdk_timer_callback callback, void *param) { struct sampgdk_timer timer; int slot; int error; assert(callback != NULL); timer.is_set = true; timer.interval = interval; timer.repeat = repeat; timer.callback = callback; timer.param = param; timer.started = sampgdk_timer_clock(); timer.plugin = sampgdk_plugin_address_to_handle(callback); slot = find_slot(); if (slot >= 0) { sampgdk_array_set(&timers, slot, &timer); } else { error = sampgdk_array_append(&timers, &timer); if (error < 0) { return -error; } slot = timers.count - 1; } /* Timer IDs returned by the SA:MP's SetTimer() API begin * with 1, and so do they here. */ return slot + 1; }
int sampgdk_array_append(struct sampgdk_array *a, void *elem) { assert(a != NULL); assert(elem != NULL); if (a->count == a->size) { int error; if ((error = sampgdk_array_grow(a)) < 0) { return error; } } a->count++; sampgdk_array_set(a, a->count - 1, elem); return 0; }
int sampgdk_timer_set(int interval, bool repeat, sampgdk_timer_callback callback, void *param) { struct _sampgdk_timer_info timer; int slot; int error; int timerid; assert(callback != NULL); timer.is_set = true; timer.interval = interval; timer.repeat = repeat; timer.callback = (void *)callback; timer.param = param; timer.started = _sampgdk_timer_now(); timer.plugin = sampgdk_plugin_get_handle((void *)callback); if (timer.started == 0) { return 0; /* error already logged */ } slot = _sampgdk_timer_find_slot(); if (slot >= 0) { sampgdk_array_set(&_sampgdk_timers, slot, &timer); } else { error = sampgdk_array_append(&_sampgdk_timers, &timer); if (error < 0) { sampgdk_log_error("Error setting timer: %s", strerror(-error)); return 0; } slot = _sampgdk_timers.count - 1; } /* Timer IDs returned by the SA:MP's SetTimer() API begin * with 1, and so do they here. */ timerid = slot + 1; sampgdk_log_debug("Created timer: ID = %d, interval = %d, repeat = %s", timerid, interval, repeat ? "true" : "false"); return timerid; }