[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdesupport/strigi/src/streamanalyzer
From:       Jos van den Oever <jos () vandenoever ! info>
Date:       2007-04-25 19:57:58
Message-ID: 1177531078.150983.20494.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 658052 by vandenoever:

better locking of global helper class

 M  +18 -3     analysisresult.cpp  


--- trunk/kdesupport/strigi/src/streamanalyzer/analysisresult.cpp #658051:658052
@@ -32,10 +32,10 @@
 using namespace std;
 
 class Latin1Converter {
-    STRIGI_MUTEX_DEFINE(mutex);
     iconv_t const conv;
     char* out;
     size_t outlen;
+    STRIGI_MUTEX_DEFINE(mutex);
 
     int32_t _fromLatin1(char*& out, const char* data, size_t len);
     Latin1Converter() :conv(iconv_open("UTF-8", "ISO-8859-1")), outlen(0) {
@@ -46,11 +46,20 @@
         free(out);
         STRIGI_MUTEX_DESTROY(&mutex);
     }
+    static Latin1Converter& converter() {
+        static Latin1Converter l;
+        return l;
+    }
 public:
     static int32_t fromLatin1(char*& out, const char* data, int32_t len) {
-        static Latin1Converter l;
-        return l._fromLatin1(out, data, len);
+        return converter()._fromLatin1(out, data, len);
     }
+    static void lock() {
+        STRIGI_MUTEX_LOCK(&converter().mutex);
+    }
+    static void unlock() {
+        STRIGI_MUTEX_UNLOCK(&converter().mutex);
+    }
 };
 int32_t
 Latin1Converter::_fromLatin1(char*& o, const char* data, size_t len) {
@@ -163,6 +172,7 @@
     if (checkUtf8(text, length)) {
         p->m_writer.addText(this, text, length);
     } else {
+        Latin1Converter::lock();
         char* d;
         size_t len = Latin1Converter::fromLatin1(d, text, length);
         if (len && checkUtf8(d, len)) {
@@ -171,6 +181,7 @@
             fprintf(stderr, "'%.*s' is not a UTF8 or latin1 string\n",
                 length, text);
         }
+        Latin1Converter::unlock();
     }
 }
 AnalyzerConfiguration&
@@ -203,6 +214,7 @@
     if (checkUtf8(val)) {
         p->m_writer.addValue(this, field, val);
     } else {
+        Latin1Converter::lock();
         char* d;
         size_t len = Latin1Converter::fromLatin1(d, val.c_str(), val.length());
         if (len && checkUtf8(d, len)) {
@@ -211,6 +223,7 @@
             fprintf(stderr, "'%s' is not a UTF8 or latin1 string\n",
                 val.c_str());
         }
+        Latin1Converter::unlock();
     }
 }
 void
@@ -219,6 +232,7 @@
     if (checkUtf8(data, length)) {
         p->m_writer.addValue(this, field, (const unsigned char*)data, length);
     } else {
+        Latin1Converter::lock();
         char* d;
         size_t len = Latin1Converter::fromLatin1(d, data, length);
         if (len && checkUtf8(d, len)) {
@@ -227,6 +241,7 @@
             fprintf(stderr, "'%.*s' is not a UTF8 or latin1 string\n",
                 length, data);
         }
+        Latin1Converter::unlock();
     }
 }
 void
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic