From: Brian G. <ge...@us...> - 2007-02-27 10:09:24
|
Update of /cvsroot/playerstage/code/player/libplayercore In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24167/libplayercore Modified Files: message.cc message.h Log Message: applied patch 1654805 Index: message.cc =================================================================== RCS file: /cvsroot/playerstage/code/player/libplayercore/message.cc,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** message.cc 8 Nov 2006 18:35:12 -0000 1.18 --- message.cc 27 Feb 2007 18:09:20 -0000 1.19 *************** *** 34,42 **** #include <libplayercore/player.h> #include <libplayercore/error.h> Message::Message(const struct player_msghdr & Header, const void * data, unsigned int data_size, ! MessageQueue* _queue) { this->Queue = _queue; --- 34,44 ---- #include <libplayercore/player.h> #include <libplayercore/error.h> + #include <libplayerxdr/playerxdr.h> Message::Message(const struct player_msghdr & Header, const void * data, unsigned int data_size, ! MessageQueue* _queue, ! bool do_deepcopy) { this->Queue = _queue; *************** *** 46,49 **** --- 48,52 ---- this->Size = sizeof(struct player_msghdr)+data_size; assert(this->Size); + this->DynDataSize = 0; this->Data = new unsigned char[this->Size]; assert(this->Data); *************** *** 55,58 **** --- 58,75 ---- memcpy(&this->Data[sizeof(struct player_msghdr)],data,data_size); + // Perform deep copy if necessary + if (do_deepcopy && data != NULL) + { + player_dpcpy_fn_t dpcpyfunc = NULL; + if((dpcpyfunc = playerxdr_get_dpcpyfunc(Header.addr.interf, Header.type, Header.subtype)) != NULL) + { + if((this->DynDataSize = (*dpcpyfunc)(data, this->GetPayload())) == 0) + { + // Possible error + PLAYER_WARN3 ("copied zero bytes in deep copy of message %d: %d, %d", Header.addr.interf, Header.type, Header.subtype); + } + } + } + this->RefCount = new unsigned int; assert(this->RefCount); *************** *** 71,74 **** --- 88,92 ---- Data = rhs.Data; Size = rhs.Size; + DynDataSize = rhs.DynDataSize; Queue = rhs.Queue; RefCount = rhs.RefCount; *************** *** 103,106 **** --- 121,126 ---- if((*RefCount)==0) { + if (this->GetPayloadSize() > 0 && DynDataSize > 0) + playerxdr_delete_message (this->GetPayload(), this->GetHeader()->addr.interf, this->GetHeader()->type, this->GetHeader()->subtype); delete [] Data; delete RefCount; *************** *** 297,301 **** } ! size_t MessageQueue::GetLength(void) { --- 317,321 ---- } ! size_t MessageQueue::GetLength(void) { Index: message.h =================================================================== RCS file: /cvsroot/playerstage/code/player/libplayercore/message.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** message.h 26 Jul 2006 17:14:16 -0000 1.17 --- message.h 27 Feb 2007 18:09:20 -0000 1.18 *************** *** 60,64 **** const void* data, unsigned int data_size, ! MessageQueue* _queue = NULL); /// Copy pointers from existing message and increment refcount. Message(const Message & rhs); --- 60,65 ---- const void* data, unsigned int data_size, ! MessageQueue* _queue = NULL, ! bool do_deepcopy = true); /// Copy pointers from existing message and increment refcount. Message(const Message & rhs); *************** *** 93,96 **** --- 94,99 ---- /// Get Payload size. size_t GetPayloadSize() {return Size - sizeof(player_msghdr_t);}; + /// Get dynamic data size. + size_t GetDynDataSize() {return DynDataSize;}; /// Size of message data. unsigned int GetSize() {return Size;}; *************** *** 102,106 **** void SetReady () { ready = true; } /// Check if ready to send ! bool Ready (void) const { return ready; } /// queue to which any response to this message should be directed --- 105,109 ---- void SetReady () { ready = true; } /// Check if ready to send ! bool Ready (void) const { return ready; } /// queue to which any response to this message should be directed *************** *** 115,118 **** --- 118,123 ---- /// Length (in bytes) of Data. unsigned int Size; + /// Length (in bytes) of any dynamic data the message uses + unsigned int DynDataSize; /// Used to lock access to Data. pthread_mutex_t * Lock; *************** *** 252,256 **** /// Check whether a queue is empty bool Empty() { return(this->head == NULL); } ! /** Push a message onto the queue. Returns the success state of the Push operation (true if successful, false otherwise). UseReserved should only be set true when pushing sync --- 257,261 ---- /// Check whether a queue is empty bool Empty() { return(this->head == NULL); } ! /** Push a message onto the queue. Returns the success state of the Push operation (true if successful, false otherwise). UseReserved should only be set true when pushing sync *************** *** 258,262 **** is reserved on the queue for a sync message */ bool Push(Message& msg, bool UseReserved = false); ! /** Pop a message off the queue. Pop the head (i.e., the first-inserted) message from the queue. --- 263,267 ---- is reserved on the queue for a sync message */ bool Push(Message& msg, bool UseReserved = false); ! /** Pop a message off the queue. Pop the head (i.e., the first-inserted) message from the queue. *************** *** 308,312 **** /// Mark all messages in the queue as ready to be sent void MarkAllReady (void); ! /// @brief Get current length of queue, in elements. size_t GetLength(void); --- 313,317 ---- /// Mark all messages in the queue as ready to be sent void MarkAllReady (void); ! /// @brief Get current length of queue, in elements. size_t GetLength(void); |