commit 496d7752a25d8082fb02deaf1a765a9946fa0543
parent 20aa24312c592d0925b2ae1c55e9248cb769cee7
Author: Christian Grothoff <christian@grothoff.org>
Date: Sat, 27 Aug 2005 05:18:25 +0000
workaround bug 907
Diffstat:
2 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/src/plugins/exiv2/Makefile.am b/src/plugins/exiv2/Makefile.am
@@ -16,9 +16,9 @@ PLUGINFLAGS = -export-dynamic -avoid-version -module -no-undefined
libextractor_exiv2_la_LINK = \
/bin/sh ../../../libtool --mode=link $(CXXLD) -o libextractor_exiv2.la
libextractor_exiv2_la_LDFLAGS = \
- $(PLUGINFLAGS) $(XTRA_CPPLIBS)
+ $(PLUGINFLAGS) $(XTRA_CPPLIBS) -lpthread
libextractor_exiv2_la_LIBADD = \
- $(top_builddir)/src/main/libextractor.la
+ $(top_builddir)/src/main/libextractor.la -lpthread
libextractor_exiv2_la_SOURCES = \
exiv2extractor.cc exv_conf.h exv_msvc.h \
diff --git a/src/plugins/exiv2/exiv2extractor.cc b/src/plugins/exiv2/exiv2extractor.cc
@@ -34,13 +34,14 @@
#include <iomanip>
#include <cassert>
#include <cstring>
-#include <sys/types.h> // for stat()
-#include <sys/stat.h> // for stat()
-#ifdef HAVE_UNISTD_H
-# include <unistd.h> // for stat()
-#endif
#include <math.h>
+
+#define WORKAROUND_905 1
+#if WORKAROUND_905
+#include <pthread.h>
+#endif
+
extern "C" {
static struct EXTRACTOR_Keywords * addKeyword(EXTRACTOR_KeywordType type,
@@ -83,10 +84,17 @@ struct EXTRACTOR_Keywords * addExiv2Tag(const Exiv2::ExifData& exifData,
extern "C" {
+#if WORKAROUND_905
+ static struct EXTRACTOR_Keywords * extract(const char * filename,
+ unsigned char * data,
+ size_t size,
+ struct EXTRACTOR_Keywords * prev)
+#else
struct EXTRACTOR_Keywords * libextractor_exiv2_extract(const char * filename,
unsigned char * data,
size_t size,
struct EXTRACTOR_Keywords * prev)
+#endif
{
struct EXTRACTOR_Keywords * result = prev;
@@ -426,4 +434,38 @@ extern "C" {
return result;
}
+
+
+#if WORKAROUND_905
+
+ struct X {
+ unsigned char * data;
+ size_t size;
+ struct EXTRACTOR_Keywords * prev;
+ };
+
+
+ static void * run(void * arg) {
+ struct X * x = (struct X*) arg;
+ return extract(NULL, x->data, x->size, x->prev);
+ }
+
+ struct EXTRACTOR_Keywords * libextractor_exiv2_extract(const char * filename,
+ unsigned char * data,
+ size_t size,
+ struct EXTRACTOR_Keywords * prev) {
+ pthread_t pt;
+ struct X cls;
+ void * ret;
+ cls.data = data;
+ cls.size = size;
+ cls.prev = prev;
+ if (0 == pthread_create(&pt, NULL, &run, &cls))
+ if (0 == pthread_join(pt, &ret))
+ return (struct EXTRACTOR_Keywords*) ret;
+ return prev;
+ }
+
+#endif
+
}