Hi Emmanuel,
Here's a patch that aligns the VSM buffer with the beginning of the msg
structure. (I am padding the data by hand as compilers are not able to
control the alignment to this level without using non-standard extensions.)
It's a patch to 3.0. Feel free to backport it to 2.1.
Martin
>From aa2150c25c9b0dd518b058f0c50420417441fd23 Mon Sep 17 00:00:00 2001
From: Martin Sustrik <[email protected]>
Date: Fri, 8 Jul 2011 18:12:59 +0200
Subject: [PATCH] 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 <[email protected]>
---
src/config.hpp | 4 ----
src/msg.cpp | 6 ++++++
src/msg.hpp | 13 ++++++++++---
3 files changed, 16 insertions(+), 7 deletions(-)
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 <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;
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;
--
1.7.0.4
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev