Browse Source

refactor: use knowledge about the last monitoreditem in this period to
speed up reinsertion

Julius Pfrommer 8 years ago
parent
commit
d3ce5c8a2e
1 changed files with 13 additions and 3 deletions
  1. 13 3
      src/server/ua_server_worker.c

+ 13 - 3
src/server/ua_server_worker.c

@@ -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;
         }