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 <sustrik@250bpm.com>
This commit is contained in:
Martin Sustrik 2011-07-08 18:12:59 +02:00
parent 1526ff638c
commit aa2150c25c
3 changed files with 16 additions and 7 deletions

View File

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

View File

@ -19,6 +19,7 @@
*/
#include "msg.hpp"
#include "../include/zmq.h"
#include <string.h>
#include <errno.h>
@ -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;

View File

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