[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/kdecore/services
From: Pino Toscano <pino () kde ! org>
Date: 2009-08-02 22:42:05
Message-ID: 1249252925.515814.7896.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1006063 by pino:
ktrader parser invocation: instead of using a static variable for current resulting \
tree and data being parsed, put them in a thread local storage this avoids them being \
mutually rewritten by racing threads, and the result should guarantee \
reentrancy
CCBUG: 192536
M +26 -11 ktraderparse.cpp
--- trunk/KDE/kdelibs/kdecore/services/ktraderparse.cpp #1006062:1006063
@@ -32,30 +32,44 @@
#include <stdlib.h>
#include <kdebug.h>
+#include <QtCore/QThreadStorage>
+
+namespace KTraderParse
+{
+
+struct ParsingData
+{
+ ParseTreeBase::Ptr ptr;
+ QByteArray buffer;
+};
+
+}
+
using namespace KTraderParse;
-K_GLOBAL_STATIC(ParseTreeBase::Ptr, pTree)
-static const char* sCode = 0;
+K_GLOBAL_STATIC(QThreadStorage<ParsingData *>, s_parsingData)
ParseTreeBase::Ptr KTraderParse::parseConstraints( const QString& _constr )
{
- const QByteArray buffer = _constr.toUtf8();
- sCode = buffer.constData();
- KTraderParse_mainParse( sCode );
- sCode = 0;
- assert( pTree );
- return *pTree;
+ ParsingData *data = new ParsingData();
+ s_parsingData->setLocalData(data);
+ data->buffer = _constr.toUtf8();
+ KTraderParse_mainParse(data->buffer.constData());
+ ParseTreeBase::Ptr ret = data->ptr;
+ s_parsingData->setLocalData(0);
+ return ret;
}
void KTraderParse_setParseTree( void *_ptr1 )
{
- *pTree = static_cast<ParseTreeBase*>( _ptr1 );
+ ParsingData *data = s_parsingData->localData();
+ data->ptr = static_cast<ParseTreeBase*>(_ptr1);
}
void KTraderParse_error( const char* err )
{
- kWarning(7014) << "Parsing '" << sCode << "' gave" << err;
+ kWarning(7014) << "Parsing" << s_parsingData->localData()->buffer << "gave:" << \
err; }
void* KTraderParse_newOR( void *_ptr1, void *_ptr2 )
@@ -156,8 +170,9 @@
void KTraderParse_destroy(void *node)
{
+ ParsingData *data = s_parsingData->localData();
ParseTreeBase *p = reinterpret_cast<ParseTreeBase *>(node);
- if (p != pTree->data()) {
+ if (p != data->ptr) {
delete p;
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic