Sfoglia il codice sorgente

job guids are assigned randomly by the server, not in the subscription manager

Julius Pfrommer 9 anni fa
parent
commit
4810a84c11

+ 0 - 2
src/server/ua_services_subscription.c

@@ -46,8 +46,6 @@ void Service_CreateSubscription(UA_Server *server, UA_Session *session,
     newSubscription->priority                = request->priority;
     
     /* add the update job */
-    UA_Guid jobId = SubscriptionManager_getUniqueGUID(&session->subscriptionManager);
-    Subscription_createdUpdateJob(server, jobId, newSubscription);
     Subscription_registerUpdateJob(server, newSubscription);
     SubscriptionManager_addSubscription(&session->subscriptionManager, newSubscription);    
 }

+ 7 - 22
src/server/ua_subscription.c

@@ -14,7 +14,6 @@ UA_Subscription *UA_Subscription_new(UA_UInt32 subscriptionID) {
     new->lastPublished  = 0;
     new->sequenceNumber = 1;
     memset(&new->timedUpdateJobGuid, 0, sizeof(UA_Guid));
-    new->timedUpdateJob          = NULL;
     new->timedUpdateIsRegistered = false;
     LIST_INIT(&new->MonitoredItems);
     LIST_INIT(&new->unpublishedNotifications);
@@ -38,9 +37,9 @@ void UA_Subscription_deleteMembers(UA_Subscription *subscription, UA_Server *ser
     Subscription_deleteUnpublishedNotification(0, true, subscription);
     
     // Unhook/Unregister any timed work assiociated with this subscription
-    if(subscription->timedUpdateJob) {
+    if(subscription->timedUpdateIsRegistered) {
         Subscription_unregisterUpdateJob(server, subscription);
-        UA_free(subscription->timedUpdateJob);
+        subscription->timedUpdateIsRegistered = false;
     }
 }
 
@@ -215,31 +214,17 @@ static void Subscription_timedUpdateNotificationsJob(UA_Server *server, void *da
     Subscription_updateNotifications(sub);
 }
 
-UA_StatusCode Subscription_createdUpdateJob(UA_Server *server, UA_Guid jobId, UA_Subscription *sub) {
-    if(server == NULL || sub == NULL)
-        return UA_STATUSCODE_BADSERVERINDEXINVALID;
-        
-    UA_Job *theWork;
-    theWork = (UA_Job *) UA_malloc(sizeof(UA_Job));
-    if(!theWork)
-        return UA_STATUSCODE_BADOUTOFMEMORY;
-    
-   *theWork = (UA_Job) {.type = UA_JOBTYPE_METHODCALL,
-                        .job.methodCall = {.method = Subscription_timedUpdateNotificationsJob, .data = sub} };
-   
-   sub->timedUpdateJobGuid = jobId;
-   sub->timedUpdateJob     = theWork;
-   
-   return UA_STATUSCODE_GOOD;
-}
-
 UA_StatusCode Subscription_registerUpdateJob(UA_Server *server, UA_Subscription *sub) {
     if(sub->publishingInterval <= 5 ) 
         return UA_STATUSCODE_BADNOTSUPPORTED;
+
+    UA_Job job = (UA_Job) {.type = UA_JOBTYPE_METHODCALL,
+                           .job.methodCall = {.method = Subscription_timedUpdateNotificationsJob,
+                                              .data = sub} };
     
     /* Practically enough, the client sends a uint32 in ms, which we store as
        datetime, which here is required in as uint32 in ms as the interval */
-    UA_StatusCode retval = UA_Server_addRepeatedJob(server, *sub->timedUpdateJob,
+    UA_StatusCode retval = UA_Server_addRepeatedJob(server, job,
                                                     (UA_UInt32)sub->publishingInterval,
                                                     &sub->timedUpdateJobGuid);
     if(retval == UA_STATUSCODE_GOOD)

+ 0 - 1
src/server/ua_subscription.h

@@ -71,7 +71,6 @@ typedef struct UA_Subscription {
     UA_UInt32 priority;
     UA_UInt32 sequenceNumber;
     UA_Guid timedUpdateJobGuid;
-    UA_Job *timedUpdateJob;
     UA_Boolean timedUpdateIsRegistered;
     LIST_HEAD(UA_ListOfUnpublishedNotifications, UA_unpublishedNotification) unpublishedNotifications;
     size_t unpublishedNotificationsSize;

+ 1 - 10
src/server/ua_subscription_manager.c

@@ -6,8 +6,7 @@
 void SubscriptionManager_init(UA_Session *session) {
     UA_SubscriptionManager *manager = &(session->subscriptionManager);
     LIST_INIT(&manager->serverSubscriptions);
-    manager->lastSessionID = (UA_UInt32) UA_DateTime_now();
-    manager->lastJobGuid = UA_Guid_random();
+    manager->lastSessionID = UA_UInt32_random();
 }
 
 void SubscriptionManager_deleteMembers(UA_Session *session, UA_Server *server) {
@@ -68,11 +67,3 @@ UA_UInt32 SubscriptionManager_getUniqueUIntID(UA_SubscriptionManager *manager) {
     UA_UInt32 id = ++(manager->lastSessionID);
     return id;
 }
-
-UA_Guid SubscriptionManager_getUniqueGUID(UA_SubscriptionManager *manager) {
-    UA_Guid id;
-    unsigned long *incremental = (unsigned long *) &manager->lastJobGuid.data4[0];
-    incremental++;
-    UA_Guid_copy(&(manager->lastJobGuid), &id);
-    return id;
-}

+ 0 - 2
src/server/ua_subscription_manager.h

@@ -9,7 +9,6 @@
 
 typedef struct UA_SubscriptionManager {
     UA_UInt32 lastSessionID;
-    UA_Guid lastJobGuid;
     LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription) serverSubscriptions;
 } UA_SubscriptionManager;
 
@@ -26,5 +25,4 @@ SubscriptionManager_deleteMonitoredItem(UA_SubscriptionManager *manager, UA_UInt
                                         UA_UInt32 monitoredItemID);
 
 UA_UInt32 SubscriptionManager_getUniqueUIntID(UA_SubscriptionManager *manager);
-UA_Guid SubscriptionManager_getUniqueGUID(UA_SubscriptionManager *manager);
 #endif /* UA_SUBSCRIPTION_MANAGER_H_ */