[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