#At file:///home/jonas/src/telco-6.2/ based on revid:jonas@stripped
3101 Jonas Oreland 2010-06-02
ndb - bug#54168 - fix so that sendFragmented doesnt tamper with signal->theData
modified:
storage/ndb/src/kernel/vm/SimulatedBlock.cpp
storage/ndb/src/kernel/vm/VMSignal.hpp
=== modified file 'storage/ndb/src/kernel/vm/SimulatedBlock.cpp'
--- a/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2009-10-09 09:13:43 +0000
+++ b/storage/ndb/src/kernel/vm/SimulatedBlock.cpp 2010-06-02 07:27:05 +0000
@@ -1973,7 +1973,9 @@ SimulatedBlock::sendFragmentedSignal(Blo
}
ptr.p->m_callback = c;
- if(!c_fragSenderRunning){
+ if(!c_fragSenderRunning)
+ {
+ SaveSignal<2> save(signal);
c_fragSenderRunning = true;
ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend();
sig->type = ContinueFragmented::CONTINUE_SENDING;
@@ -2012,7 +2014,9 @@ SimulatedBlock::sendFragmentedSignal(Nod
}
ptr.p->m_callback = c;
- if(!c_fragSenderRunning){
+ if(!c_fragSenderRunning)
+ {
+ SaveSignal<2> save(signal);
c_fragSenderRunning = true;
ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend();
sig->type = ContinueFragmented::CONTINUE_SENDING;
@@ -2062,7 +2066,9 @@ SimulatedBlock::sendFragmentedSignal(Blo
}
tmp.p->m_callback = c;
- if(!c_fragSenderRunning){
+ if(!c_fragSenderRunning)
+ {
+ SaveSignal<2> save(signal);
c_fragSenderRunning = true;
ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend();
sig->type = ContinueFragmented::CONTINUE_SENDING;
@@ -2105,7 +2111,9 @@ SimulatedBlock::sendFragmentedSignal(Nod
}
tmp.p->m_callback = c;
- if(!c_fragSenderRunning){
+ if(!c_fragSenderRunning)
+ {
+ SaveSignal<2> save(signal);
c_fragSenderRunning = true;
ContinueFragmented * sig = (ContinueFragmented*)signal->getDataPtrSend();
sig->type = ContinueFragmented::CONTINUE_SENDING;
=== modified file 'storage/ndb/src/kernel/vm/VMSignal.hpp'
--- a/storage/ndb/src/kernel/vm/VMSignal.hpp 2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/kernel/vm/VMSignal.hpp 2010-06-02 07:27:05 +0000
@@ -104,6 +104,37 @@ public:
void garbage_register();
};
+template<Uint32 len>
+class SaveSignal
+{
+ Uint32 m_copy[len];
+ Signal * m_signal;
+
+public:
+ SaveSignal(Signal* signal) {
+ save(signal);
+ }
+
+ void save(Signal* signal) {
+ m_signal = signal;
+ for (Uint32 i = 0; i<len; i++)
+ m_copy[i] = m_signal->theData[i];
+ }
+
+ void clear() { m_signal = 0;}
+
+ void restore() {
+ for (Uint32 i = 0; i<len; i++)
+ m_signal->theData[i] = m_copy[i];
+ }
+
+ ~SaveSignal() {
+ if (m_signal)
+ restore();
+ clear();
+ }
+};
+
inline
Uint32
Signal::getLength() const {
Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20100602072705-z7yxwatbaog1vfgs.bundle