Add timer ID attribute, for safe cleanup in the scripted environment

This commit is contained in:
Sergey Lyubka 2022-07-17 12:52:18 +01:00
parent 1fbf534f9a
commit 4a3d760c06
6 changed files with 12 additions and 6 deletions

View File

@ -3511,6 +3511,7 @@ struct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,
unsigned flags, void (*fn)(void *), void *arg) { unsigned flags, void (*fn)(void *), void *arg) {
struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t)); struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t));
mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg); mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg);
t->id = mgr->timerid++;
return t; return t;
} }
@ -4847,7 +4848,7 @@ char *mg_remove_double_dots(char *s) {
void mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms, void mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,
unsigned flags, void (*fn)(void *), void *arg) { unsigned flags, void (*fn)(void *), void *arg) {
struct mg_timer tmp = {ms, 0U, 0U, flags, fn, arg, *head}; struct mg_timer tmp = {0U, ms, 0U, 0U, flags, fn, arg, *head};
*t = tmp; *t = tmp;
*head = t; *head = t;
} }

View File

@ -795,6 +795,7 @@ void mg_log_set_fn(void (*logfunc)(unsigned char ch));
struct mg_timer { struct mg_timer {
unsigned long id; // Timer ID
uint64_t period_ms; // Timer period in milliseconds uint64_t period_ms; // Timer period in milliseconds
uint64_t prev_ms; // Timestamp of a previous poll uint64_t prev_ms; // Timestamp of a previous poll
uint64_t expire; // Expiration timestamp in milliseconds uint64_t expire; // Expiration timestamp in milliseconds
@ -1001,12 +1002,13 @@ struct mg_mgr {
int dnstimeout; // DNS resolve timeout in milliseconds int dnstimeout; // DNS resolve timeout in milliseconds
bool use_dns6; // Use DNS6 server by default, see #1532 bool use_dns6; // Use DNS6 server by default, see #1532
unsigned long nextid; // Next connection ID unsigned long nextid; // Next connection ID
unsigned long timerid; // Next timer ID
void *userdata; // Arbitrary user data pointer void *userdata; // Arbitrary user data pointer
uint16_t mqtt_id; // MQTT IDs for pub/sub uint16_t mqtt_id; // MQTT IDs for pub/sub
void *active_dns_requests; // DNS requests in progress void *active_dns_requests; // DNS requests in progress
struct mg_timer *timers; // Active timers struct mg_timer *timers; // Active timers
void *priv; // Used by the experimental stack void *priv; // Used by the MIP stack
size_t extraconnsize; // Used by the experimental stack size_t extraconnsize; // Used by the MIP stack
#if MG_ARCH == MG_ARCH_FREERTOS_TCP #if MG_ARCH == MG_ARCH_FREERTOS_TCP
SocketSet_t ss; // NOTE(lsm): referenced from socket struct SocketSet_t ss; // NOTE(lsm): referenced from socket struct
#endif #endif

View File

@ -224,6 +224,7 @@ struct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,
unsigned flags, void (*fn)(void *), void *arg) { unsigned flags, void (*fn)(void *), void *arg) {
struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t)); struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t));
mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg); mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg);
t->id = mgr->timerid++;
return t; return t;
} }

View File

@ -25,12 +25,13 @@ struct mg_mgr {
int dnstimeout; // DNS resolve timeout in milliseconds int dnstimeout; // DNS resolve timeout in milliseconds
bool use_dns6; // Use DNS6 server by default, see #1532 bool use_dns6; // Use DNS6 server by default, see #1532
unsigned long nextid; // Next connection ID unsigned long nextid; // Next connection ID
unsigned long timerid; // Next timer ID
void *userdata; // Arbitrary user data pointer void *userdata; // Arbitrary user data pointer
uint16_t mqtt_id; // MQTT IDs for pub/sub uint16_t mqtt_id; // MQTT IDs for pub/sub
void *active_dns_requests; // DNS requests in progress void *active_dns_requests; // DNS requests in progress
struct mg_timer *timers; // Active timers struct mg_timer *timers; // Active timers
void *priv; // Used by the experimental stack void *priv; // Used by the MIP stack
size_t extraconnsize; // Used by the experimental stack size_t extraconnsize; // Used by the MIP stack
#if MG_ARCH == MG_ARCH_FREERTOS_TCP #if MG_ARCH == MG_ARCH_FREERTOS_TCP
SocketSet_t ss; // NOTE(lsm): referenced from socket struct SocketSet_t ss; // NOTE(lsm): referenced from socket struct
#endif #endif

View File

@ -8,7 +8,7 @@
void mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms, void mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,
unsigned flags, void (*fn)(void *), void *arg) { unsigned flags, void (*fn)(void *), void *arg) {
struct mg_timer tmp = {ms, 0U, 0U, flags, fn, arg, *head}; struct mg_timer tmp = {0U, ms, 0U, 0U, flags, fn, arg, *head};
*t = tmp; *t = tmp;
*head = t; *head = t;
} }

View File

@ -3,6 +3,7 @@
#include "arch.h" #include "arch.h"
struct mg_timer { struct mg_timer {
unsigned long id; // Timer ID
uint64_t period_ms; // Timer period in milliseconds uint64_t period_ms; // Timer period in milliseconds
uint64_t prev_ms; // Timestamp of a previous poll uint64_t prev_ms; // Timestamp of a previous poll
uint64_t expire; // Expiration timestamp in milliseconds uint64_t expire; // Expiration timestamp in milliseconds