diff --git a/master.c b/master.c index f6f03539..e8fc900c 100644 --- a/master.c +++ b/master.c @@ -19,8 +19,11 @@ void expire_rb_timeouts(struct rb_root *root) { usrbt = (struct uwsgi_signal_rb_timer *) urbt->data; rb_erase(&usrbt->uwsgi_rb_timer->rbt, root); free(usrbt->uwsgi_rb_timer); + usrbt->iterations_done++; uwsgi_route_signal(usrbt->sig); - usrbt->uwsgi_rb_timer = uwsgi_add_rb_timer(root, time(NULL) + usrbt->value, usrbt); + if (!usrbt->iterations || usrbt->iterations_done < usrbt->iterations) { + usrbt->uwsgi_rb_timer = uwsgi_add_rb_timer(root, time(NULL) + usrbt->value, usrbt); + } continue; } diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index b9880cfa..928b80b3 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -201,12 +201,13 @@ PyObject *py_uwsgi_add_rb_timer(PyObject * self, PyObject * args) { uint8_t uwsgi_signal; int secs; + int iterations = 0; - if (!PyArg_ParseTuple(args, "Bi:add_rb_timer", &uwsgi_signal, &secs)) { + if (!PyArg_ParseTuple(args, "Bi|i:add_rb_timer", &uwsgi_signal, &secs, &iterations)) { return NULL; } - if (uwsgi_signal_add_rb_timer(uwsgi_signal, secs)) + if (uwsgi_signal_add_rb_timer(uwsgi_signal, secs, iterations)) return PyErr_Format(PyExc_ValueError, "unable to add rb_timer"); Py_INCREF(Py_None); diff --git a/signal.c b/signal.c index 566e90df..a3aa5432 100644 --- a/signal.c +++ b/signal.c @@ -91,7 +91,7 @@ int uwsgi_add_timer(uint8_t sig, int secs) { } -int uwsgi_signal_add_rb_timer(uint8_t sig, int secs) { +int uwsgi_signal_add_rb_timer(uint8_t sig, int secs, int iterations) { uwsgi_lock(uwsgi.rb_timer_table_lock); @@ -100,6 +100,8 @@ int uwsgi_signal_add_rb_timer(uint8_t sig, int secs) { // fill the timer table, the master will use it to add items to the event queue ushared->rb_timers[ushared->rb_timers_cnt].value = secs; ushared->rb_timers[ushared->rb_timers_cnt].registered = 0; + ushared->rb_timers[ushared->rb_timers_cnt].iterations = iterations; + ushared->rb_timers[ushared->rb_timers_cnt].iterations_done = 0; ushared->rb_timers[ushared->rb_timers_cnt].sig = sig; ushared->rb_timers_cnt++; } diff --git a/uwsgi.h b/uwsgi.h index 427fdac9..b334f07a 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -682,6 +682,8 @@ struct uwsgi_timer { struct uwsgi_signal_rb_timer { int value; int registered; + int iterations; + int iterations_done; uint8_t sig; struct uwsgi_rb_timer *uwsgi_rb_timer; }; @@ -1421,7 +1423,7 @@ void *uwsgi_mmap_shared_rwlock(void); int uwsgi_register_signal(uint8_t, char *, void *, uint8_t); int uwsgi_add_file_monitor(uint8_t, char *); int uwsgi_add_timer(uint8_t, int); -int uwsgi_signal_add_rb_timer(uint8_t, int); +int uwsgi_signal_add_rb_timer(uint8_t, int, int); int uwsgi_signal_handler(uint8_t); void uwsgi_route_signal(uint8_t);