1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-12-22 04:02:04 +03:00

HCP24: bugfix: timer_add

This commit is contained in:
Peter Foerster
2016-08-15 12:34:19 +02:00
parent 872448c9d3
commit f4b67064d2

View File

@@ -30,15 +30,32 @@ timer_add(struct mg_context *ctx,
unsigned u, v; unsigned u, v;
int error = 0; int error = 0;
struct timespec now; struct timespec now;
double dt; /* double time */
if (ctx->stop_flag) { if (ctx->stop_flag) {
return 0; return 0;
} }
if (is_relative) {
clock_gettime(CLOCK_MONOTONIC, &now); clock_gettime(CLOCK_MONOTONIC, &now);
next_time += now.tv_sec; dt = (double)now.tv_sec;
next_time += now.tv_nsec * 1.0E-9; dt += now.tv_nsec * 1.0E-9;
/* HCP24: if is_relative = 0 and next_time < now
* action will be called so fast as possible
* if additional period > 0
* action will be called so fast as possible
* n times until (next_time + (n * period)) > now
* then the period is working
* Solution:
* if next_time < now then we set next_time = now.
* The first callback will be so fast as possible (now)
* but the next callback on period
*/
if (is_relative) {
next_time += dt;
}
else if (next_time < dt) {
next_time = dt;
} }
pthread_mutex_lock(&ctx->timers->mutex); pthread_mutex_lock(&ctx->timers->mutex);
@@ -46,7 +63,8 @@ timer_add(struct mg_context *ctx,
error = 1; error = 1;
} else { } else {
for (u = 0; u < ctx->timers->timer_count; u++) { for (u = 0; u < ctx->timers->timer_count; u++) {
if (ctx->timers->timers[u].time < next_time) { if (ctx->timers->timers[u].time > next_time) {
/* HCP24: moving all timers > next_time */
for (v = ctx->timers->timer_count; v > u; v--) { for (v = ctx->timers->timer_count; v > u; v--) {
ctx->timers->timers[v] = ctx->timers->timers[v - 1]; ctx->timers->timers[v] = ctx->timers->timers[v - 1];
} }