Przeglądaj źródła

the single utils.c/h out into a flat structure

Julius Pfrommer 10 lat temu
rodzic
commit
50c11f7699

+ 1 - 2
CMakeLists.txt

@@ -21,8 +21,7 @@ set(lib_sources src/ua_types.c
 				src/ua_connection.c
                 src/ua_securechannel.c
                 src/ua_session.c
-                src/util/ua_util.c
-                src/util/ua_list.c
+                src/ua_util.c
                 #src/util/ua_base64.c
                 src/server/ua_server.c
                 src/server/ua_securechannel_manager.c

src/util/ua_base64.c → src/ongoing/ua_base64.c


src/util/ua_base64.h → src/ongoing/ua_base64.h


+ 1 - 1
src/server/ua_nodestore.c

@@ -1,5 +1,5 @@
 #include "ua_nodestore.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 struct UA_NodeStore {
     const UA_Node **entries;

+ 1 - 1
src/server/ua_nodestore_concurrent.c

@@ -1,5 +1,5 @@
 #include "ua_nodestore.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 #include <urcu.h>
 #include <urcu/compiler.h> // for caa_container_of

+ 1 - 1
src/server/ua_securechannel_manager.c

@@ -1,5 +1,5 @@
 #include "ua_securechannel_manager.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 struct channel_list_entry {
     UA_SecureChannel channel;

+ 1 - 1
src/server/ua_server.c

@@ -3,7 +3,7 @@
 #include "ua_namespace_0.h"
 #include "ua_securechannel_manager.h"
 #include "ua_session_manager.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_Int32 UA_Server_deleteMembers(UA_Server *server) {
     UA_ApplicationDescription_deleteMembers(&server->description);

+ 1 - 1
src/server/ua_server_binary.c

@@ -4,7 +4,7 @@
 #include "ua_namespace_0.h"
 #include "ua_securechannel_manager.h"
 #include "ua_session_manager.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 static UA_Int32 UA_ByteStringArray_init(UA_ByteStringArray *stringarray, UA_UInt32 length) {
     if(!stringarray || length == 0)

+ 1 - 1
src/server/ua_services_attribute.c

@@ -2,7 +2,7 @@
 #include "ua_statuscodes.h"
 #include "ua_nodestore.h"
 #include "ua_namespace_0.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 enum UA_AttributeId {
     UA_ATTRIBUTEID_NODEID = 1,

+ 1 - 1
src/server/ua_services_nodemanagement.c

@@ -3,7 +3,7 @@
 #include "ua_nodestore.h"
 #include "ua_services_internal.h"
 #include "ua_session.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 #define CHECKED_ACTION(ACTION, CLEAN_UP, GOTO) do { \
         status |= ACTION;                           \

+ 2 - 5
src/server/ua_services_subscription.c

@@ -1,11 +1,10 @@
 #include "ua_services.h"
 #include "ua_statuscodes.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_Int32 Service_CreateSubscription(UA_Server *server, UA_Session *session,
                                     const UA_CreateSubscriptionRequest *request,
                                     UA_CreateSubscriptionResponse *response) {
-
     response->subscriptionId            = 42;
     response->revisedPublishingInterval = 100000;
     response->revisedLifetimeCount      = 120000;
@@ -13,10 +12,8 @@ UA_Int32 Service_CreateSubscription(UA_Server *server, UA_Session *session,
     return UA_SUCCESS;
 }
 
-UA_Int32 Service_Publish(UA_Server *server, UA_Session *session,
-                         const UA_PublishRequest *request,
+UA_Int32 Service_Publish(UA_Server *server, UA_Session *session, const UA_PublishRequest *request,
                          UA_PublishResponse *response) {
-
     response->subscriptionId = 42;
     response->notificationMessage.sequenceNumber = 1;
     response->notificationMessage.publishTime    = UA_DateTime_now();

+ 1 - 1
src/server/ua_services_view.c

@@ -2,7 +2,7 @@
 #include "ua_statuscodes.h"
 #include "ua_nodestore.h"
 #include "ua_namespace_0.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_Int32 Service_Browse_getReferenceDescription(UA_NodeStore *ns, UA_ReferenceNode *reference,
                                                 UA_UInt32 nodeClassMask, UA_UInt32 resultMask,

+ 71 - 94
src/server/ua_session_manager.c

@@ -1,9 +1,19 @@
 #include "ua_session_manager.h"
-#include "util/ua_util.h"
-#include "util/ua_list.h"
+#include "ua_util.h"
+
+/**
+ The functions in this file are not thread-safe. For multi-threaded access, a
+ second implementation should be provided. See for example, how a nodestore
+ implementation is choosen based on whether multithreading is enabled or not.
+ */
+
+struct session_list_entry {
+    UA_Session session;
+    LIST_ENTRY(session_list_entry) pointers;
+};
 
 struct UA_SessionManager {
-    UA_list_List sessions;
+    LIST_HEAD(session_list, session_list_entry) sessions;
     UA_UInt32    maxSessionCount;
     UA_Int32     lastSessionId;
     UA_UInt32    currentSessionCount;
@@ -17,7 +27,7 @@ UA_Int32 UA_SessionManager_new(UA_SessionManager **sessionManager, UA_UInt32 max
     retval |= UA_alloc((void **)sessionManager, sizeof(UA_SessionManager));
     if(retval != UA_SUCCESS)
         return UA_ERROR;
-    retval |= UA_list_init(&(*sessionManager)->sessions);
+    LIST_INIT(&(*sessionManager)->sessions);
     (*sessionManager)->maxSessionCount = maxSessionCount;
     (*sessionManager)->lastSessionId   = startSessionId;
     (*sessionManager)->sessionTimeout  = sessionTimeout;
@@ -29,119 +39,86 @@ UA_Int32 UA_SessionManager_delete(UA_SessionManager *sessionManager) {
     return UA_SUCCESS;
 }
 
-UA_Boolean UA_SessionManager_sessionExists(UA_SessionManager *sessionManager,
-                                           UA_Session        *session) {
-    if(sessionManager == UA_NULL)
-        return UA_FALSE;
-
-    if(UA_list_search(&sessionManager->sessions,
-                      (UA_list_PayloadComparer)UA_Session_compare, (void *)session)) {
-        UA_Double pendingLifetime;
-        UA_Session_getPendingLifetime(session, &pendingLifetime);
+UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager, UA_NodeId *sessionId, UA_Session **session) {
+    if(sessionManager == UA_NULL) {
+        *session = UA_NULL;
+        return UA_ERROR;
+    }
 
-        if(pendingLifetime > 0)
-            return UA_TRUE;
+    struct session_list_entry *current = UA_NULL;
+    LIST_FOREACH(current, &sessionManager->sessions, pointers) {
+        if(UA_NodeId_equal(&current->session.sessionId, sessionId) == UA_EQUAL)
+            break;
+    }
 
-        //timeout of session reached so remove it
-        UA_NodeId *sessionId = &session->sessionId;
-        UA_SessionManager_removeSession(sessionManager, sessionId);
+    if(!current) {
+        *session = UA_NULL;
+        return UA_ERROR;
     }
-    return UA_FALSE;
+
+    // Lifetime handling is not done here, but in a regular cleanup by the
+    // server. If the session still exists, then it is valid.
+    *session = &current->session;
+    return UA_SUCCESS;
 }
 
-UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager,
-                                          UA_NodeId *sessionId, UA_Session **session) {
+UA_Int32 UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager, UA_NodeId *token, UA_Session **session) {
     if(sessionManager == UA_NULL) {
         *session = UA_NULL;
         return UA_ERROR;
     }
 
-    UA_list_Element *current = sessionManager->sessions.first;
-    while(current) {
-        if(current->payload) {
-            UA_list_Element *elem = (UA_list_Element *)current;
-            *session = ((UA_Session *)(elem->payload));
-            if(UA_NodeId_equal(&(*session)->sessionId, sessionId) == UA_EQUAL) {
-                UA_Double pendingLifetime;
-                UA_Session_getPendingLifetime(*session, &pendingLifetime);
-
-                if(pendingLifetime > 0)
-                    return UA_SUCCESS;
-
-                //session not valid anymore -> remove it
-                UA_list_removeElement(elem, (UA_list_PayloadVisitor)UA_Session_delete);
-                *session = UA_NULL;
-                return UA_ERROR;
-            }
-        }
-        current = current->next;
+    struct session_list_entry *current = UA_NULL;
+    LIST_FOREACH(current, &sessionManager->sessions, pointers) {
+        if(UA_NodeId_equal(&current->session.authenticationToken, token) == UA_EQUAL)
+            break;
     }
-    *session = UA_NULL;
-    return UA_ERROR;
-}
 
-UA_Int32 UA_SessionManager_getSessionByToken(UA_SessionManager *sessionManager,
-                                             UA_NodeId *token, UA_Session **session) {
-    if(sessionManager == UA_NULL) {
+    if(!current) {
         *session = UA_NULL;
         return UA_ERROR;
     }
 
-    UA_list_Element *current = sessionManager->sessions.first;
-    while(current) {
-        if(current->payload) {
-            UA_list_Element *elem = (UA_list_Element *)current;
-            *session = ((UA_Session *)(elem->payload));
-
-            if(UA_NodeId_equal(&(*session)->authenticationToken, token) == UA_EQUAL) {
-                UA_Double pendingLifetime;
-                UA_Session_getPendingLifetime(*session, &pendingLifetime);
-
-                if(pendingLifetime > 0)
-                    return UA_SUCCESS;
-
-                //session not valid anymore -> remove it
-                UA_list_removeElement(elem, (UA_list_PayloadVisitor)UA_Session_delete);
-                *session = UA_NULL;
-                return UA_ERROR;
-            }
-        }
-        current = current->next;
-    }
-    *session = UA_NULL;
-    return UA_ERROR;
+    // Lifetime handling is not done here, but in a regular cleanup by the
+    // server. If the session still exists, then it is valid.
+    *session = &current->session;
+    return UA_SUCCESS;
 }
 
 /** Creates and adds a session. */
-UA_Int32 UA_SessionManager_createSession(UA_SessionManager *sessionManager,
-                                         UA_SecureChannel *channel, UA_Session **session) {
-    UA_Int32 retval = UA_SUCCESS;
+UA_Int32 UA_SessionManager_createSession(UA_SessionManager *sessionManager, UA_SecureChannel *channel, UA_Session **session) {
     if(sessionManager->currentSessionCount >= sessionManager->maxSessionCount)
         return UA_ERROR;
-    UA_Session_new(session);
-    (*session)->sessionId = (UA_NodeId) {.namespaceIndex     = 1, .identifierType = UA_NODEIDTYPE_NUMERIC,
-                                         .identifier.numeric = sessionManager->lastSessionId++ };
-    (*session)->authenticationToken = (UA_NodeId) {.namespaceIndex = 1,
-                                                   .identifierType = UA_NODEIDTYPE_NUMERIC,
-                                                   .identifier.numeric = sessionManager->lastSessionId };
-    (*session)->channel   = channel;
-    (*session)->timeout = 3600 * 1000; // 1h
-    UA_Session_setExpirationDate((*session));
+
+    struct session_list_entry *newentry;
+    if(UA_alloc((void **)&newentry, sizeof(struct session_list_entry)) != UA_SUCCESS)
+        return UA_ERROR;
+
+    UA_Session_init(&newentry->session);
+    newentry->session.sessionId = (UA_NodeId) {.namespaceIndex = 1, .identifierType = UA_NODEIDTYPE_NUMERIC,
+                                               .identifier.numeric = sessionManager->lastSessionId++ };
+    newentry->session.authenticationToken = (UA_NodeId) {.namespaceIndex = 1, .identifierType = UA_NODEIDTYPE_NUMERIC,
+                                                         .identifier.numeric = sessionManager->lastSessionId };
+    newentry->session.channel = channel;
+    newentry->session.timeout = 3600 * 1000; // 1h
+    UA_Session_setExpirationDate(&newentry->session);
+
     sessionManager->currentSessionCount++;
-    UA_list_addPayloadToFront(&sessionManager->sessions, *session);
-    return retval;
+    LIST_INSERT_HEAD(&sessionManager->sessions, newentry, pointers);
+    *session = &newentry->session;
+    return UA_SUCCESS;
 }
 
-UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager,
-                                         UA_NodeId         *sessionId) {
-    UA_Int32 retval = UA_SUCCESS;
-    UA_list_Element *element =
-        UA_list_search(&sessionManager->sessions, (UA_list_PayloadComparer)UA_Session_compare,
-                       sessionId);
-    if(element) {
-        retval |= UA_list_removeElement(element, (UA_list_PayloadVisitor)UA_Session_delete);
-        printf("UA_SessionManager_removeSession - session removed, current count: %i \n",
-               sessionManager->sessions.size);
+UA_Int32 UA_SessionManager_removeSession(UA_SessionManager *sessionManager, UA_NodeId  *sessionId) {
+    struct session_list_entry *current = UA_NULL;
+    LIST_FOREACH(current, &sessionManager->sessions, pointers) {
+        if(UA_NodeId_equal(&current->session.sessionId, sessionId) == UA_EQUAL)
+            break;
     }
-    return retval;
+
+    if(!current)
+        return UA_ERROR;
+
+    LIST_REMOVE(current, pointers);
+    return UA_SUCCESS;
 }

+ 0 - 1
src/server/ua_session_manager.h

@@ -25,7 +25,6 @@ UA_Int32 UA_SessionManager_getSessionById(UA_SessionManager *sessionManager,
                                           UA_NodeId *sessionId, UA_Session **session);
 
 /**
- * @brief
  * @param token authentication token which is used to get the session object
  * @param session output, session object which is identified by the authentication token
  * @return error code

+ 1 - 1
src/ua_connection.c

@@ -1,5 +1,5 @@
 #include "ua_connection.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_ConnectionConfig UA_ConnectionConfig_standard = { .protocolVersion = 0,    .sendBufferSize = 8192,
                                                      .recvBufferSize  = 8192, .maxMessageSize = 8192,

+ 1 - 1
src/ua_securechannel.c

@@ -1,7 +1,7 @@
 #include <time.h>
 #include <stdlib.h>
 #include "ua_securechannel.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 void UA_SecureChannel_init(UA_SecureChannel *channel) {
     UA_AsymmetricAlgorithmSecurityHeader_init(&channel->clientAsymAlgSettings);

+ 1 - 1
src/ua_session.c

@@ -2,7 +2,7 @@
 #include <stdlib.h>
 
 #include "ua_session.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_Int32 UA_Session_new(UA_Session **session) {
     UA_Int32 retval = UA_SUCCESS;

+ 1 - 1
src/ua_transport.c

@@ -2,7 +2,7 @@
 #include <stdio.h>
 #endif
 #include "ua_transport.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 
 UA_TYPE_DEFAULT(UA_MessageType)
 UA_Int32 UA_MessageType_calcSizeBinary(UA_MessageType const *ptr) {

+ 1 - 1
src/ua_types.c

@@ -11,7 +11,7 @@
 #include <stdio.h>
 #endif
 
-#include "util/ua_util.h"
+#include "ua_util.h"
 #include "ua_types.h"
 #include "ua_types_encoding_binary.h"
 #include "ua_namespace_0.h"

+ 1 - 1
src/ua_types_encoding_binary.c

@@ -1,5 +1,5 @@
 #include "ua_types_encoding_binary.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 #include "ua_namespace_0.h"
 
 static INLINE UA_Boolean is_builtin(UA_NodeId *typeid ) {

src/util/ua_util.c → src/ua_util.c


src/util/ua_util.h → src/ua_util.h


+ 0 - 4
tests/CMakeLists.txt

@@ -21,10 +21,6 @@ add_test(memory ${CMAKE_CURRENT_BINARY_DIR}/check_memory)
 # target_link_libraries(check_stack ${LIBS})
 # add_test(stack ${CMAKE_CURRENT_BINARY_DIR}/check_stack)
 
-add_executable(check_list check_list.c)
-target_link_libraries(check_list ${LIBS})
-add_test(list ${CMAKE_CURRENT_BINARY_DIR}/check_list)
-
 # add_executable(check_base64 check_base64.c)
 # target_link_libraries(check_base64 ${LIBS})
 # add_test(base64 ${CMAKE_CURRENT_BINARY_DIR}/check_base64)

+ 1 - 1
tests/check_builtin.c

@@ -4,7 +4,7 @@
 #include "ua_types_encoding_binary.h"
 #include "ua_namespace_0.h"
 #include "ua_transport.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 #include "check.h"
 
 /* copied here from encoding_binary.c */

+ 1 - 1
tests/check_memory.c

@@ -3,7 +3,7 @@
 #include <stdlib.h>
 
 #include "ua_types.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 #include "ua_namespace_0.h"
 #include "check.h"
 

+ 1 - 1
tests/check_nodestore.c

@@ -4,7 +4,7 @@
 
 #include "ua_types.h"
 #include "server/ua_nodestore.h"
-#include "util/ua_util.h"
+#include "ua_util.h"
 #include "check.h"
 
 #ifdef MULTITHREADING

+ 1 - 1
tools/generate_builtin.py

@@ -320,7 +320,7 @@ printc('''/**
  
 #include "''' + args.outfile.split("/")[-1] + '''.h"
 #include "ua_namespace_0.h"
-#include "util/ua_util.h"\n''')
+#include "ua_util.h"\n''')
 
 # types for which we create a vector type
 arraytypes = set()

+ 1 - 1
tools/generate_namespace.py

@@ -122,7 +122,7 @@ printc('''/**********************************************************
        ''' at '''+ time.strftime("%Y-%m-%d %I:%M:%S")+'''
  **********************************************************/\n
 #include "''' + args.outfile.split("/")[-1] + '''.h"\n
-#include "util/ua_util.h"
+#include "ua_util.h"
 UA_Int32 UA_ns0ToVTableIndex(const UA_NodeId *id) {
 	UA_Int32 retval = 0; // InvalidType
         if(id->namespaceIndex != 0) return retval;