diff options
author | Dwight <dmerriman@gmail.com> | 2008-06-12 11:56:40 -0400 |
---|---|---|
committer | Dwight <dmerriman@gmail.com> | 2008-06-12 11:56:40 -0400 |
commit | c79a5e1753d25f261a059b33a172ea3534fd67f3 (patch) | |
tree | 698e457d475049866f07ad68231084705ffed9c7 | |
parent | 1d8c3e37b32a11d2e2b64fee019782f5efdd19c6 (diff) | |
download | mongo-c79a5e1753d25f261a059b33a172ea3534fd67f3.tar.gz |
fix a jni issue with the last bug fix.
-rw-r--r-- | db/db.cpp | 8 | ||||
-rw-r--r-- | grid/message.h | 5 |
2 files changed, 9 insertions, 4 deletions
diff --git a/db/db.cpp b/db/db.cpp index 67cf5d15dd6..aed40b39fd3 100644 --- a/db/db.cpp +++ b/db/db.cpp @@ -336,7 +336,13 @@ void jniCallback(Message& m, Message& out) bool log = false; curOp = m.data->operation; if( m.data->operation == dbQuery ) { - receivedQuery(jmp, m, ss); + // on a query, the Message must have m.freeIt true so that the buffer data can be + // retained by cursors. As freeIt is false, we make a copy here. + assert( m.data->len > 0 && m.data->len < 32000000 ); + Message copy(malloc(m.data->len), true); + memcpy(copy.data, m.data, m.data->len); + + receivedQuery(jmp, copy, ss); } else if( m.data->operation == dbInsert ) { ss << "insert "; diff --git a/grid/message.h b/grid/message.h index 3a26909dec9..1f4df0d83bd 100644 --- a/grid/message.h +++ b/grid/message.h @@ -75,7 +75,7 @@ struct MsgData { int operation; char _data[4]; - int dataLen(); + int dataLen(); // len without header }; const int MsgDataHeaderSize = sizeof(MsgData) - 4; inline int MsgData::dataLen() { return len - MsgDataHeaderSize; } @@ -85,7 +85,7 @@ inline int MsgData::dataLen() { return len - MsgDataHeaderSize; } class Message { public: Message() { data = 0; freeIt = false; } - Message( void * _data , bool _freeIt ){ data = (MsgData*)_data; freeIt = _freeIt; }; + Message( void * _data , bool _freeIt ){ data = (MsgData*)_data; freeIt = _freeIt; }; ~Message() { reset(); } SockAddr from; @@ -129,4 +129,3 @@ public: private: bool freeIt; }; - |