diff --git a/src/Cron.c b/src/Cron.c index 0830640..826c87d 100644 --- a/src/Cron.c +++ b/src/Cron.c @@ -42,12 +42,12 @@ typedef struct Job { unsigned long interval; unsigned long lastExec; - void (*func) (void *); + JobFunc *func; void *args; } Job; static Job * - JobCreate(long interval, void (*func) (void *), void *args) + JobCreate(long interval, JobFunc *func, void *args) { Job *job; @@ -84,6 +84,7 @@ CronThread(void *args) pthread_mutex_lock(&cron->lock); ts = UtilServerTs(); + for (i = 0; i < ArraySize(cron->jobs); i++) { Job *job = ArrayGet(cron->jobs, i); @@ -107,7 +108,22 @@ CronThread(void *args) /* Only sleep if the jobs didn't overrun the tick */ if (cron->tick > (te - ts)) { - UtilSleepMillis(cron->tick - (te - ts)); + const unsigned long microTick = 100; + unsigned long remainingTick = cron->tick - (te - ts); + + /* Only sleep for microTick ms at a time because if the + * job scheduler is supposed to stop before the tick is up, + * we don't want to be stuck in a long sleep */ + while (remainingTick >= microTick && !cron->stop) + { + UtilSleepMillis(microTick); + remainingTick -= microTick; + } + + if (remainingTick && !cron->stop) + { + UtilSleepMillis(remainingTick); + } } } @@ -132,6 +148,7 @@ CronCreate(unsigned long tick) } cron->tick = tick; + cron->stop = 1; pthread_mutex_init(&cron->lock, NULL); @@ -139,7 +156,7 @@ CronCreate(unsigned long tick) } void - CronOnce(Cron * cron, void (*func) (void *), void *args) + CronOnce(Cron * cron, JobFunc *func, void *args) { Job *job; @@ -160,7 +177,7 @@ void } void - CronEvery(Cron * cron, unsigned long interval, void (*func) (void *), void *args) + CronEvery(Cron * cron, unsigned long interval, JobFunc *func, void *args) { Job *job; diff --git a/src/Telodendria.c b/src/Telodendria.c index c5ba9df..8a0c30d 100644 --- a/src/Telodendria.c +++ b/src/Telodendria.c @@ -41,6 +41,7 @@ #include #include #include +#include static void TelodendriaMemoryHook(MemoryAction a, MemoryInfo * i, void *args) @@ -607,7 +608,7 @@ main(int argc, char **argv) Log(lc, LOG_DEBUG, "Registering jobs..."); - /* TODO: Register jobs here */ + CronEvery(cron, 30 * 60 * 1000, (JobFunc *) UserInteractiveAuthCleanup, &matrixArgs); Log(lc, LOG_NOTICE, "Starting job scheduler..."); CronStart(cron); diff --git a/src/UserInteractiveAuth.c b/src/UserInteractiveAuth.c index 8ac9c8a..d159cc1 100644 --- a/src/UserInteractiveAuth.c +++ b/src/UserInteractiveAuth.c @@ -135,7 +135,7 @@ UserInteractiveAuth(HttpServerContext * context, Db * db, } void -UserInteractiveAuthCleanup(Db * db) +UserInteractiveAuthCleanup(MatrixHttpHandlerArgs *args) { - + Log(args->lc, LOG_DEBUG, "Purging old user interactive auth sessions..."); } diff --git a/src/include/Cron.h b/src/include/Cron.h index da6b984..bb175d2 100644 --- a/src/include/Cron.h +++ b/src/include/Cron.h @@ -26,14 +26,16 @@ typedef struct Cron Cron; +typedef void (JobFunc) (void *); + extern Cron * CronCreate(unsigned long); extern void - CronOnce(Cron *, void (*) (void *), void *); + CronOnce(Cron *, JobFunc *, void *); extern void - CronEvery(Cron *, unsigned long, void (*) (void *), void *); + CronEvery(Cron *, unsigned long, JobFunc *, void *); extern void CronStart(Cron *); diff --git a/src/include/UserInteractiveAuth.h b/src/include/UserInteractiveAuth.h index 24ecbb5..aadc748 100644 --- a/src/include/UserInteractiveAuth.h +++ b/src/include/UserInteractiveAuth.h @@ -26,10 +26,10 @@ #include #include -#include +#include extern void - UserInteractiveAuthCleanup(Db *); + UserInteractiveAuthCleanup(MatrixHttpHandlerArgs *); extern HashMap * UserInteractiveAuth(HttpServerContext *, Db *, HashMap *);