libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 496d7752a25d8082fb02deaf1a765a9946fa0543
parent 20aa24312c592d0925b2ae1c55e9248cb769cee7
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 27 Aug 2005 05:18:25 +0000

workaround bug 907

Diffstat:
Msrc/plugins/exiv2/Makefile.am | 4++--
Msrc/plugins/exiv2/exiv2extractor.cc | 52+++++++++++++++++++++++++++++++++++++++++++++++-----
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 + }