Browse Source

make the subscriptions list a fixed member instead of a pointer

Julius Pfrommer 9 years ago
parent
commit
f4e425501c

+ 2 - 2
src/server/ua_services_subscription.c

@@ -143,7 +143,7 @@ void Service_Publish(UA_Server *server, UA_Session *session,
     }
     
     // See if any new data is available
-    for (sub=(manager->ServerSubscriptions)->lh_first; sub != NULL; sub = sub->listEntry.le_next) {
+    for (sub=manager->ServerSubscriptions.lh_first; sub != NULL; sub = sub->listEntry.le_next) {
 	
         // FIXME: We are forcing a value update for monitored items. This should be done by the event system.
         if (sub->MonitoredItems.lh_first != NULL) {  
@@ -181,7 +181,7 @@ void Service_Publish(UA_Server *server, UA_Session *session,
     //        return something to the client.
     //        If no subscriptions have notifications, force one to generate a keepalive so we don't return an 
     //        empty message
-    sub = manager->ServerSubscriptions->lh_first;
+    sub = manager->ServerSubscriptions.lh_first;
     if ( sub != NULL) {
       response->subscriptionId = sub->SubscriptionID;
       sub->KeepAliveCount.currentValue=sub->KeepAliveCount.minValue;

+ 13 - 19
src/server/ua_subscription_manager.c

@@ -14,25 +14,23 @@ void SubscriptionManager_init(UA_Session *session) {
     manager->GlobalNotificationsPerPublish = (UA_Int32_BoundedValue)  { .maxValue = 1000, .minValue = 1, .currentValue=0 };
     manager->GlobalSamplingInterval = (UA_UInt32_BoundedValue) { .maxValue = 100, .minValue = 0, .currentValue=0 };
     manager->GlobalQueueSize = (UA_UInt32_BoundedValue) { .maxValue = 100, .minValue = 0, .currentValue=0 };
-    
-    manager->ServerSubscriptions = (UA_ListOfUASubscriptions *) UA_malloc (sizeof(UA_ListOfUASubscriptions));
-    LIST_INIT(manager->ServerSubscriptions);
+    LIST_INIT(&manager->ServerSubscriptions);
     manager->LastSessionID = (UA_UInt32) UA_DateTime_now();
 }
 
 void SubscriptionManager_deleteMembers(UA_Session *session) {
-    UA_SubscriptionManager *manager = &(session->subscriptionManager);
-    UA_free(manager->ServerSubscriptions);
+    // UA_SubscriptionManager *manager = &(session->subscriptionManager);
+    // todo: delete all subscriptions and monitored items
 }
 
 void SubscriptionManager_addSubscription(UA_SubscriptionManager *manager, UA_Subscription *newSubscription) {
-    LIST_INSERT_HEAD(manager->ServerSubscriptions, newSubscription, listEntry);
+    LIST_INSERT_HEAD(&manager->ServerSubscriptions, newSubscription, listEntry);
 }
 
 UA_Subscription *SubscriptionManager_getSubscriptionByID(UA_SubscriptionManager *manager,
                                                          UA_Int32 SubscriptionID) {
     UA_Subscription *sub;
-    LIST_FOREACH(sub, manager->ServerSubscriptions, listEntry) {
+    LIST_FOREACH(sub, &manager->ServerSubscriptions, listEntry) {
         if(sub->SubscriptionID == SubscriptionID)
             break;
     }
@@ -53,25 +51,21 @@ UA_Int32 SubscriptionManager_deleteMonitoredItem(UA_SubscriptionManager *manager
             return UA_STATUSCODE_GOOD;
         }
     }
-    
     return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
 }
 
 UA_Int32 SubscriptionManager_deleteSubscription(UA_SubscriptionManager *manager, UA_Int32 SubscriptionID) {
-    UA_Subscription  *sub;
-    UA_MonitoredItem *mon;
-    UA_unpublishedNotification *notify;
-    
-    sub = SubscriptionManager_getSubscriptionByID(manager, SubscriptionID);    
-    if(sub) {
-        // Delete registered subscriptions
-        while((mon = LIST_FIRST(&sub->MonitoredItems)))
-           MonitoredItem_delete(mon);
-    } else {
+    UA_Subscription *sub = SubscriptionManager_getSubscriptionByID(manager, SubscriptionID);    
+    if(!sub)
         return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
-    }
+
+    // Delete registered subscriptions
+    UA_MonitoredItem *mon;
+    while((mon = LIST_FIRST(&sub->MonitoredItems)))
+        MonitoredItem_delete(mon);
     
     // Delete queued notification messages
+    UA_unpublishedNotification *notify;
     while((notify = LIST_FIRST(&sub->unpublishedNotifications))) {
        LIST_REMOVE(notify, listEntry);
        UA_free(notify);

+ 1 - 2
src/server/ua_subscription_manager.h

@@ -7,7 +7,6 @@
 #include "ua_nodestore.h"
 #include "ua_subscription.h"
 
-typedef LIST_HEAD(UA_ListOfUASubscriptions_s, UA_Subscription_s) UA_ListOfUASubscriptions;
 typedef struct UA_SubscriptionManager_s {
     UA_Int32_BoundedValue    GlobalPublishingInterval;
     UA_UInt32_BoundedValue   GlobalLifeTimeCount;
@@ -16,7 +15,7 @@ typedef struct UA_SubscriptionManager_s {
     UA_UInt32_BoundedValue   GlobalSamplingInterval;
     UA_UInt32_BoundedValue   GlobalQueueSize;
     UA_Int32                 LastSessionID;
-    UA_ListOfUASubscriptions *ServerSubscriptions;
+    LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription_s) ServerSubscriptions;
 } UA_SubscriptionManager;
 
 void SubscriptionManager_init(UA_Session *session);