Fixed wrong handling of shared messages

The shared reference count was not shared but copied. msg_t cannot
store the refcnt itsef but has to store a pointer to an externally
allocated (shared) refcnter. The changes to lmsg are reverted to
use content_t again. Howver, this introduces an allocation in v2_decoder
when creating the message which can be avoided. When allocating the reception
buffer, space is allocated for the maximum number of reference counts
(8192 / max_vsm_size = 8192/64 = 128 zmq:atomic_counter objects). This
increases the buffer by 128*sizeof(atomic_counter) = 128*4 = 512 bytes only.
When creating a message, the refcnt member is set to the address of one of the
pre-allocated atomic_counter_t objects. To do so, a new msg_t type zcmsg
is introduced because msg::copy must discriminate between the message types
when releasing memory.
This commit is contained in:
Jens Auer
2015-06-13 17:30:36 +02:00
parent dfe1908008
commit 51cb57e2c9
5 changed files with 235 additions and 113 deletions

View File

@@ -63,8 +63,6 @@ namespace zmq
// the messages constructed on top of it.
unsigned char* release();
void reset(unsigned char* b);
void inc_ref();
static void call_dec_ref(void*, void* buffer);
@@ -85,6 +83,12 @@ namespace zmq
bufsize = new_size;
}
//
zmq::atomic_counter_t* create_refcnt()
{
return msg_refcnt++;
}
private:
unsigned char* buf;
size_t bufsize;