From aa2150c25c9b0dd518b058f0c50420417441fd23 Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Fri, 8 Jul 2011 18:12:59 +0200 Subject: VSM data are aligned to 32/64 bit boundary Till now the VSM buffer was aligned to 16 bit boundary which could possibly cause problems on RISC architectures when accessing the message data in unsafe manner. Signed-off-by: Martin Sustrik --- src/config.hpp | 4 ---- src/msg.cpp | 6 ++++++ src/msg.hpp | 13 ++++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/config.hpp b/src/config.hpp index 3984fcf..96e39de 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -39,10 +39,6 @@ namespace zmq // Commands in pipe per allocation event. command_pipe_granularity = 16, - // Size in bytes of the largest message that is still copied around - // rather than being reference-counted. - max_vsm_size = 29, - // Determines how often does socket poll for new commands when it // still has unprocessed messages to handle. Thus, if it is set to 100, // socket will process 100 inbound messages before doing the poll. diff --git a/src/msg.cpp b/src/msg.cpp index 84ca3e2..fcc04ab 100644 --- a/src/msg.cpp +++ b/src/msg.cpp @@ -19,6 +19,7 @@ */ #include "msg.hpp" +#include "../include/zmq.h" #include #include @@ -29,6 +30,11 @@ #include "likely.hpp" #include "err.hpp" +// Check whether the sizes of public representation of the message (zmq_msg_t) +// and private represenation of the message (zmq::msg_t) match. +typedef char zmq_msg_size_check + [2 * ((sizeof (zmq::msg_t) == sizeof (zmq_msg_t)) != 0) - 1]; + bool zmq::msg_t::check () { return u.base.type >= type_min && u.base.type <= type_max; diff --git a/src/msg.hpp b/src/msg.hpp index 602ae55..2111bf1 100644 --- a/src/msg.hpp +++ b/src/msg.hpp @@ -77,6 +77,10 @@ namespace zmq private: + // Size in bytes of the largest message that is still copied around + // rather than being reference-counted. + enum {max_vsm_size = 29}; + // Shared message buffer. Message data are either allocated in one // continuous block along with this structure - thus avoiding one // malloc/free pair or they are stored in used-supplied memory. @@ -109,21 +113,24 @@ namespace zmq // the union. union { struct { + unsigned char unused [max_vsm_size + 1]; unsigned char type; unsigned char flags; } base; struct { + unsigned char data [max_vsm_size]; + unsigned char size; unsigned char type; unsigned char flags; - unsigned char size; - unsigned char data [max_vsm_size]; } vsm; struct { + content_t *content; + unsigned char unused [max_vsm_size + 1 - sizeof (content_t*)]; unsigned char type; unsigned char flags; - content_t *content; } lmsg; struct { + unsigned char unused [max_vsm_size + 1]; unsigned char type; unsigned char flags; } delimiter; -- cgit v1.2.3