Merge branch '0.2'

This commit is contained in:
Julius Pfrommer 2017-01-26 11:48:53 +01:00
commit dcc8248b04
3 changed files with 24 additions and 14 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;