|
@@ -212,12 +212,22 @@ UA_Server_addRepeatedJob(UA_Server *server, UA_Job job,
|
|
|
/* Returns the next datetime when a repeated job is scheduled */
|
|
|
static UA_DateTime
|
|
|
processRepeatedJobs(UA_Server *server, UA_DateTime current) {
|
|
|
- struct RepeatedJob *rj, *tmp_rj;
|
|
|
+ /* Find the last job that is executed after this iteration */
|
|
|
+ struct RepeatedJob *lastNow = NULL, *tmp;
|
|
|
+ LIST_FOREACH(tmp, &server->repeatedJobs, next) {
|
|
|
+ if(tmp->nextTime > current)
|
|
|
+ break;
|
|
|
+ lastNow = tmp;
|
|
|
+ }
|
|
|
+
|
|
|
/* Iterate over the list of elements (sorted according to the next execution timestamp) */
|
|
|
+ struct RepeatedJob *rj, *tmp_rj;
|
|
|
LIST_FOREACH_SAFE(rj, &server->repeatedJobs, next, tmp_rj) {
|
|
|
if(rj->nextTime > current)
|
|
|
break;
|
|
|
|
|
|
+ UA_assert(lastNow); /* at least one element at the current time */
|
|
|
+
|
|
|
/* Dispatch/process job */
|
|
|
#ifdef UA_ENABLE_MULTITHREADING
|
|
|
dispatchJob(server, &rj->job);
|
|
@@ -240,10 +250,10 @@ processRepeatedJobs(UA_Server *server, UA_DateTime current) {
|
|
|
rj->nextTime = current;
|
|
|
|
|
|
/* Keep the list sorted */
|
|
|
- struct RepeatedJob *prev_rj = LIST_FIRST(&server->repeatedJobs);
|
|
|
+ struct RepeatedJob *prev_rj = lastNow;
|
|
|
while(true) {
|
|
|
struct RepeatedJob *n = LIST_NEXT(prev_rj, next);
|
|
|
- if(!n || n->nextTime > rj->nextTime)
|
|
|
+ if(!n || n->nextTime >= rj->nextTime)
|
|
|
break;
|
|
|
prev_rj = n;
|
|
|
}
|