Add pointer to properties into message structure

This commit is contained in:
Martin Hurton 2014-04-29 22:30:51 +02:00
parent 26bf74972a
commit 724b2bb844
3 changed files with 24 additions and 11 deletions

View File

@ -200,7 +200,7 @@ ZMQ_EXPORT int zmq_ctx_destroy (void *context);
/* 0MQ message definition. */ /* 0MQ message definition. */
/******************************************************************************/ /******************************************************************************/
typedef struct zmq_msg_t {unsigned char _ [40];} zmq_msg_t; typedef struct zmq_msg_t {unsigned char _ [48];} zmq_msg_t;
typedef void (zmq_free_fn) (void *data, void *hint); typedef void (zmq_free_fn) (void *data, void *hint);

View File

@ -41,6 +41,7 @@ bool zmq::msg_t::check ()
int zmq::msg_t::init () int zmq::msg_t::init ()
{ {
u.vsm.properties = NULL;
u.vsm.type = type_vsm; u.vsm.type = type_vsm;
u.vsm.flags = 0; u.vsm.flags = 0;
u.vsm.size = 0; u.vsm.size = 0;
@ -52,11 +53,13 @@ int zmq::msg_t::init_size (size_t size_)
{ {
file_desc = -1; file_desc = -1;
if (size_ <= max_vsm_size) { if (size_ <= max_vsm_size) {
u.vsm.properties = NULL;
u.vsm.type = type_vsm; u.vsm.type = type_vsm;
u.vsm.flags = 0; u.vsm.flags = 0;
u.vsm.size = (unsigned char) size_; u.vsm.size = (unsigned char) size_;
} }
else { else {
u.lmsg.properties = NULL;
u.lmsg.type = type_lmsg; u.lmsg.type = type_lmsg;
u.lmsg.flags = 0; u.lmsg.flags = 0;
u.lmsg.content = u.lmsg.content =
@ -81,17 +84,19 @@ int zmq::msg_t::init_data (void *data_, size_t size_, msg_free_fn *ffn_,
// If data is NULL and size is not 0, a segfault // If data is NULL and size is not 0, a segfault
// would occur once the data is accessed // would occur once the data is accessed
zmq_assert (data_ != NULL || size_ == 0); zmq_assert (data_ != NULL || size_ == 0);
file_desc = -1; file_desc = -1;
// Initialize constant message if there's no need to deallocate // Initialize constant message if there's no need to deallocate
if(ffn_ == NULL) { if (ffn_ == NULL) {
u.cmsg.properties = NULL;
u.cmsg.type = type_cmsg; u.cmsg.type = type_cmsg;
u.cmsg.flags = 0; u.cmsg.flags = 0;
u.cmsg.data = data_; u.cmsg.data = data_;
u.cmsg.size = size_; u.cmsg.size = size_;
} }
else { else {
u.lmsg.properties = NULL;
u.lmsg.type = type_lmsg; u.lmsg.type = type_lmsg;
u.lmsg.flags = 0; u.lmsg.flags = 0;
u.lmsg.content = (content_t*) malloc (sizeof (content_t)); u.lmsg.content = (content_t*) malloc (sizeof (content_t));
@ -112,6 +117,7 @@ int zmq::msg_t::init_data (void *data_, size_t size_, msg_free_fn *ffn_,
int zmq::msg_t::init_delimiter () int zmq::msg_t::init_delimiter ()
{ {
u.delimiter.properties = NULL;
u.delimiter.type = type_delimiter; u.delimiter.type = type_delimiter;
u.delimiter.flags = 0; u.delimiter.flags = 0;
return 0; return 0;
@ -336,4 +342,3 @@ bool zmq::msg_t::rm_refs (int refs_)
return true; return true;
} }

View File

@ -86,9 +86,12 @@ namespace zmq
private: private:
class i_properties;
// Size in bytes of the largest message that is still copied around // Size in bytes of the largest message that is still copied around
// rather than being reference-counted. // rather than being reference-counted.
enum {max_vsm_size = 29}; enum { msg_t_size = 48 };
enum { max_vsm_size = msg_t_size - (8 + sizeof (i_properties *) + 3) };
// Shared message buffer. Message data are either allocated in one // Shared message buffer. Message data are either allocated in one
// continuous block along with this structure - thus avoiding one // continuous block along with this structure - thus avoiding one
@ -120,42 +123,47 @@ namespace zmq
type_cmsg = 104, type_cmsg = 104,
type_max = 104 type_max = 104
}; };
// the file descriptor where this message originated, needs to be 64bit due to alignment // the file descriptor where this message originated, needs to be 64bit due to alignment
int64_t file_desc; int64_t file_desc;
// Note that fields shared between different message types are not // Note that fields shared between different message types are not
// moved to tha parent class (msg_t). This way we ger tighter packing // moved to tha parent class (msg_t). This way we get tighter packing
// of the data. Shared fields can be accessed via 'base' member of // of the data. Shared fields can be accessed via 'base' member of
// the union. // the union.
union { union {
struct { struct {
unsigned char unused [max_vsm_size + 1]; i_properties *properties;
unsigned char unused [msg_t_size - (8 + sizeof (i_properties *) + 2)];
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
} base; } base;
struct { struct {
i_properties *properties;
unsigned char data [max_vsm_size]; unsigned char data [max_vsm_size];
unsigned char size; unsigned char size;
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
} vsm; } vsm;
struct { struct {
i_properties *properties;
content_t *content; content_t *content;
unsigned char unused [max_vsm_size + 1 - sizeof (content_t*)]; unsigned char unused [msg_t_size - (8 + sizeof (i_properties *) + sizeof (content_t*) + 2)];
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
} lmsg; } lmsg;
struct { struct {
i_properties *properties;
void* data; void* data;
size_t size; size_t size;
unsigned char unused unsigned char unused
[max_vsm_size + 1 - sizeof (void*) - sizeof (size_t)]; [msg_t_size - (8 + sizeof (i_properties *) + sizeof (void*) + sizeof (size_t) + 2)];
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
} cmsg; } cmsg;
struct { struct {
unsigned char unused [max_vsm_size + 1]; i_properties *properties;
unsigned char unused [msg_t_size - (8 + sizeof (i_properties *) + 2)];
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
} delimiter; } delimiter;