Procházet zdrojové kódy

View: Move ContinuationPoint definition from session to view service

Julius Pfrommer před 5 roky
rodič
revize
afef5d4b22

+ 29 - 14
src/server/ua_services_view.c

@@ -19,6 +19,24 @@
 #include "ua_server_internal.h"
 #include "ua_services.h"
 
+struct ContinuationPointEntry {
+    ContinuationPointEntry *next;
+    UA_ByteString identifier;
+    UA_BrowseDescription browseDescription;
+    UA_UInt32 maxReferences;
+
+    /* The last point in the node references? */
+    size_t referenceKindIndex;
+    size_t targetIndex;
+};
+
+ContinuationPointEntry *
+ContinuationPointEntry_clear(ContinuationPointEntry *cp) {
+    UA_ByteString_deleteMembers(&cp->identifier);
+    UA_BrowseDescription_deleteMembers(&cp->browseDescription);
+    return cp->next;
+}
+
 /**********/
 /* Browse */
 /**********/
@@ -53,15 +71,6 @@ fillReferenceDescription(UA_Server *server, const UA_Node *curr,
     return retval;
 }
 
-static void
-removeCp(ContinuationPointEntry *cp, UA_Session* session) {
-    LIST_REMOVE(cp, pointers);
-    UA_ByteString_deleteMembers(&cp->identifier);
-    UA_BrowseDescription_deleteMembers(&cp->browseDescription);
-    UA_free(cp);
-    ++session->availableContinuationPoints;
-}
-
 static UA_Boolean
 relevantReference(UA_Server *server, UA_Boolean includeSubtypes,
                   const UA_NodeId *rootRef, const UA_NodeId *testRef) {
@@ -317,7 +326,8 @@ Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxref
         goto cleanup;
 
     /* Attach the cp to the session */
-    LIST_INSERT_HEAD(&session->continuationPoints, cp2, pointers);
+    cp2->next = session->continuationPoints;
+    session->continuationPoints = cp2;
     --session->availableContinuationPoints;
     return;
 
@@ -370,10 +380,11 @@ Operation_BrowseNext(UA_Server *server, UA_Session *session,
                      const UA_Boolean *releaseContinuationPoints,
                      const UA_ByteString *continuationPoint, UA_BrowseResult *result) {
     /* Find the continuation point */
-    ContinuationPointEntry *cp;
-    LIST_FOREACH(cp, &session->continuationPoints, pointers) {
+    ContinuationPointEntry **prev = &session->continuationPoints, *cp;
+    while((cp = *prev)) {
         if(UA_ByteString_equal(&cp->identifier, continuationPoint))
             break;
+        prev = &cp->next;
     }
     if(!cp) {
         result->statusCode = UA_STATUSCODE_BADCONTINUATIONPOINTINVALID;
@@ -382,7 +393,9 @@ Operation_BrowseNext(UA_Server *server, UA_Session *session,
 
     /* Remove the cp */
     if(*releaseContinuationPoints) {
-        removeCp(cp, session);
+        *prev = ContinuationPointEntry_clear(cp);
+        UA_free(cp);
+        ++session->availableContinuationPoints;
         return;
     }
 
@@ -391,7 +404,9 @@ Operation_BrowseNext(UA_Server *server, UA_Session *session,
 
     if(done) {
         /* Remove the cp if there are no references left */
-        removeCp(cp, session);
+        *prev = ContinuationPointEntry_clear(cp);
+        UA_free(cp);
+        ++session->availableContinuationPoints;
     } else {
         /* Return the cp identifier */
         UA_StatusCode retval = UA_ByteString_copy(&cp->identifier, &result->continuationPoint);

+ 5 - 5
src/server/ua_session.c

@@ -29,13 +29,13 @@ void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) {
     UA_NodeId_deleteMembers(&session->sessionId);
     UA_String_deleteMembers(&session->sessionName);
     UA_ByteString_deleteMembers(&session->serverNonce);
-    struct ContinuationPointEntry *cp, *temp;
-    LIST_FOREACH_SAFE(cp, &session->continuationPoints, pointers, temp) {
-        LIST_REMOVE(cp, pointers);
-        UA_ByteString_deleteMembers(&cp->identifier);
-        UA_BrowseDescription_deleteMembers(&cp->browseDescription);
+    struct ContinuationPointEntry *cp, *next = session->continuationPoints;
+    while((cp = next)) {
+        next = ContinuationPointEntry_clear(cp);
         UA_free(cp);
     }
+    session->continuationPoints = NULL;
+    session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS;
 }
 
 void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel) {

+ 6 - 10
src/server/ua_session.h

@@ -16,16 +16,12 @@ _UA_BEGIN_DECLS
 
 #define UA_MAXCONTINUATIONPOINTS 5
 
-typedef struct ContinuationPointEntry {
-    LIST_ENTRY(ContinuationPointEntry) pointers;
-    UA_ByteString        identifier;
-    UA_BrowseDescription browseDescription;
-    UA_UInt32            maxReferences;
+struct ContinuationPointEntry;
+typedef struct ContinuationPointEntry ContinuationPointEntry;
 
-    /* The last point in the node references? */
-    size_t referenceKindIndex;
-    size_t targetIndex;
-} ContinuationPointEntry;
+/* Returns the next entry in the linked list */
+ContinuationPointEntry *
+ContinuationPointEntry_clear(ContinuationPointEntry *cp);
 
 struct UA_Subscription;
 typedef struct UA_Subscription UA_Subscription;
@@ -51,7 +47,7 @@ typedef struct {
     UA_DateTime       validTill;
     UA_ByteString     serverNonce;
     UA_UInt16 availableContinuationPoints;
-    LIST_HEAD(ContinuationPointList, ContinuationPointEntry) continuationPoints;
+    ContinuationPointEntry *continuationPoints;
 #ifdef UA_ENABLE_SUBSCRIPTIONS
     UA_UInt32 lastSubscriptionId;
     UA_UInt32 lastSeenSubscriptionId;

+ 2 - 5
tests/server/check_session.c

@@ -6,10 +6,7 @@
 
 #include "server/ua_services.h"
 
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "check.h"
+#include <check.h>
 
 START_TEST(Session_init_ShallWork) {
     UA_Session session;
@@ -25,7 +22,7 @@ START_TEST(Session_init_ShallWork) {
     ck_assert_int_eq(session.availableContinuationPoints, UA_MAXCONTINUATIONPOINTS);
     ck_assert_ptr_eq(session.header.channel, NULL);
     ck_assert_ptr_eq(session.clientDescription.applicationName.locale.data, NULL);
-    ck_assert_ptr_eq(session.continuationPoints.lh_first, NULL);
+    ck_assert_ptr_eq(session.continuationPoints, NULL);
     ck_assert_int_eq(session.maxRequestMessageSize, 0);
     ck_assert_int_eq(session.maxResponseMessageSize, 0);
     ck_assert_int_eq(session.sessionId.identifier.numeric, tmpNodeId.identifier.numeric);