mirror of
https://github.com/open62541/open62541.git
synced 2025-06-03 04:00:21 +00:00
Merge branch '0.2'
This commit is contained in:
commit
dcc8248b04
@ -16,7 +16,11 @@ extern "C" {
|
||||
#define ANONYMOUS_POLICY "open62541-anonymous-policy"
|
||||
#define USERNAME_POLICY "open62541-username-policy"
|
||||
|
||||
/* liburcu includes */
|
||||
/* The general idea of RCU is to delay freeing nodes (or any callback invoked
|
||||
* with call_rcu) until all threads have left their critical section. Thus we
|
||||
* can delete nodes safely in concurrent operations. The macros UA_RCU_LOCK and
|
||||
* UA_RCU_UNLOCK are used to test during debugging that we do not nest read-side
|
||||
* critical sections (although this is generally allowed). */
|
||||
#ifdef UA_ENABLE_MULTITHREADING
|
||||
# define _LGPL_SOURCE
|
||||
# include <urcu.h>
|
||||
@ -37,7 +41,7 @@ extern "C" {
|
||||
# define UA_RCU_UNLOCK() do { \
|
||||
UA_ASSERT_RCU_LOCKED(); \
|
||||
rcu_locked = false; \
|
||||
rcu_read_lock(); } while(0)
|
||||
rcu_read_unlock(); } while(0)
|
||||
# endif
|
||||
#else
|
||||
# define UA_RCU_LOCK()
|
||||
@ -47,8 +51,8 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef UA_ENABLE_EXTERNAL_NAMESPACES
|
||||
/** Mapping of namespace-id and url to an external nodestore. For namespaces
|
||||
that have no mapping defined, the internal nodestore is used by default. */
|
||||
/* Mapping of namespace-id and url to an external nodestore. For namespaces that
|
||||
* have no mapping defined, the internal nodestore is used by default. */
|
||||
typedef struct UA_ExternalNamespace {
|
||||
UA_UInt16 index;
|
||||
UA_String url;
|
||||
|
@ -179,7 +179,9 @@ UA_SecureChannel_sendChunk(UA_ChunkInfo *ci, UA_ByteString *dst, size_t offset)
|
||||
connection->getSendBuffer(connection, connection->localConf.sendBufferSize, dst);
|
||||
if(retval != UA_STATUSCODE_GOOD)
|
||||
return retval;
|
||||
/* Hide the header of the buffer, so that the ensuing encoding does not overwrite anything */
|
||||
/* Forward the data pointer so that the payload is encoded after the message header.
|
||||
* TODO: This works but is a bit too clever. Instead, we could return an offset to the
|
||||
* binary encoding exchangeBuffer function. */
|
||||
dst->data = &dst->data[UA_SECURE_MESSAGE_HEADER_LENGTH];
|
||||
dst->length = connection->localConf.sendBufferSize - UA_SECURE_MESSAGE_HEADER_LENGTH;
|
||||
}
|
||||
|
@ -18,9 +18,6 @@
|
||||
* encoding. This enables fast sending of large messages as spurious copying is
|
||||
* avoided. */
|
||||
|
||||
/* There is no robust way to detect float endianness in clang. This warning can
|
||||
* be removed if the target is known to be little endian with floats in the IEEE
|
||||
* 754 format. */
|
||||
#if defined(__clang__)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic warning "-W#warnings"
|
||||
@ -29,6 +26,9 @@
|
||||
#ifndef UA_BINARY_OVERLAYABLE_INTEGER
|
||||
# warning Integer endianness could not be detected to be little endian. Use slow generic encoding.
|
||||
#endif
|
||||
|
||||
/* There is no robust way to detect float endianness in clang. This warning can be removed
|
||||
* if the target is known to be little endian with floats in the IEEE 754 format. */
|
||||
#ifndef UA_BINARY_OVERLAYABLE_FLOAT
|
||||
# warning Float endianness could not be detected to be little endian in the IEEE 754 format. Use slow generic encoding.
|
||||
#endif
|
||||
@ -57,9 +57,11 @@ UA_THREAD_LOCAL const UA_DataType *customTypesArray;
|
||||
UA_THREAD_LOCAL UA_Byte * pos;
|
||||
UA_THREAD_LOCAL UA_Byte * end;
|
||||
|
||||
/* The code UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED is returned only when the
|
||||
* end of the buffer is reached. This error is caught. We then try to send the
|
||||
* current chunk and continue with the next. */
|
||||
/* The code UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED is returned only when the end of the
|
||||
* buffer is reached. When this StatusCode is received, we try to send the current chunk,
|
||||
* replace the buffer and continue encoding. That way, memory-constrained servers need to
|
||||
* allocate only the memory for the current chunk. And we avoid needless copying. Note:
|
||||
* The only place where this is used from is UA_SecureChannel_sendBinaryMessage. */
|
||||
|
||||
/* Thread-local buffers used for exchanging the buffer for chunking */
|
||||
UA_THREAD_LOCAL UA_ByteString *encodeBuf; /* the original buffer */
|
||||
@ -72,7 +74,7 @@ exchangeBuffer(void) {
|
||||
if(!exchangeBufferCallback)
|
||||
return UA_STATUSCODE_BADENCODINGERROR;
|
||||
|
||||
/* store context variables since chunk-sending might call UA_encode itself */
|
||||
/* Store context variables since chunk-sending might call UA_encode itself */
|
||||
UA_ByteString *store_encodeBuf = encodeBuf;
|
||||
UA_exchangeEncodeBuffer store_exchangeBufferCallback = exchangeBufferCallback;
|
||||
void *store_exchangeBufferCallbackHandle = exchangeBufferCallbackHandle;
|
||||
@ -80,12 +82,14 @@ exchangeBuffer(void) {
|
||||
size_t offset = ((uintptr_t)pos - (uintptr_t)encodeBuf->data) / sizeof(UA_Byte);
|
||||
UA_StatusCode retval = exchangeBufferCallback(exchangeBufferCallbackHandle, encodeBuf, offset);
|
||||
|
||||
/* restore context variables */
|
||||
/* Restore context variables. This restores the pointer to the buffer, not the buffer
|
||||
* itself. This is required so that a call to UA_encode can be made from within the
|
||||
* exchangeBufferCallback. For example to encode the chunk header */
|
||||
encodeBuf = store_encodeBuf;
|
||||
exchangeBufferCallback = store_exchangeBufferCallback;
|
||||
exchangeBufferCallbackHandle = store_exchangeBufferCallbackHandle;
|
||||
|
||||
/* set pos and end in order to continue encoding */
|
||||
/* Set pos and end in order to continue encoding */
|
||||
pos = encodeBuf->data;
|
||||
end = &encodeBuf->data[encodeBuf->length];
|
||||
return retval;
|
||||
|
Loading…
Reference in New Issue
Block a user