summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Reichold <adam.reichold@t-online.de>2020-01-03 22:05:53 +0100
committerAlbert Astals Cid <tsdgeos@yahoo.es>2020-01-04 22:13:25 +0000
commit6de0bba0b7d064195b27619667dbbcb7cd810647 (patch)
tree2db0d4e682caaae2f65243de561d4feca396474f
parenta8220105f964ee4102e4ee886df2d0b162b42ae6 (diff)
Make use of the GlobalParamsIniter to make the glib frontend initialization thread safe.
-rw-r--r--glib/poppler-document.cc31
-rw-r--r--glib/poppler-private.h3
-rw-r--r--glib/poppler.cc22
3 files changed, 23 insertions, 33 deletions
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index e1b422a7..26621365 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -100,8 +100,9 @@ struct _PopplerDocumentClass
G_DEFINE_TYPE (PopplerDocument, poppler_document, G_TYPE_OBJECT)
static PopplerDocument *
-_poppler_document_new_from_pdfdoc (PDFDoc *newDoc,
- GError **error)
+_poppler_document_new_from_pdfdoc (GlobalParamsIniter *initer,
+ PDFDoc *newDoc,
+ GError **error)
{
PopplerDocument *document;
@@ -145,6 +146,7 @@ _poppler_document_new_from_pdfdoc (PDFDoc *newDoc,
}
document = (PopplerDocument *) g_object_new (POPPLER_TYPE_DOCUMENT, nullptr);
+ document->initer = initer;
document->doc = newDoc;
document->output_dev = new CairoOutputDev ();
@@ -191,9 +193,7 @@ poppler_document_new_from_file (const char *uri,
GooString *password_g;
char *filename;
- if (!globalParams) {
- globalParams = std::make_unique<GlobalParams>();
- }
+ auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr);
filename = g_filename_from_uri (uri, nullptr, error);
if (!filename)
@@ -224,7 +224,7 @@ poppler_document_new_from_file (const char *uri,
delete password_g;
- return _poppler_document_new_from_pdfdoc (newDoc, error);
+ return _poppler_document_new_from_pdfdoc (initer, newDoc, error);
}
/**
@@ -253,9 +253,7 @@ poppler_document_new_from_data (char *data,
MemStream *str;
GooString *password_g;
- if (!globalParams) {
- globalParams = std::make_unique<GlobalParams>();
- }
+ auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr);
// create stream
str = new MemStream(data, 0, length, Object(objNull));
@@ -264,7 +262,7 @@ poppler_document_new_from_data (char *data,
newDoc = new PDFDoc(str, password_g, password_g);
delete password_g;
- return _poppler_document_new_from_pdfdoc (newDoc, error);
+ return _poppler_document_new_from_pdfdoc (initer, newDoc, error);
}
class BytesStream : public MemStream
@@ -307,9 +305,7 @@ poppler_document_new_from_bytes (GBytes *bytes,
g_return_val_if_fail(bytes != nullptr, nullptr);
g_return_val_if_fail(error == nullptr || *error == nullptr, nullptr);
- if (!globalParams) {
- globalParams = std::make_unique<GlobalParams>();
- }
+ auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr);
// create stream
str = new BytesStream(bytes, Object(objNull));
@@ -318,7 +314,7 @@ poppler_document_new_from_bytes (GBytes *bytes,
newDoc = new PDFDoc(str, password_g, password_g);
delete password_g;
- return _poppler_document_new_from_pdfdoc (newDoc, error);
+ return _poppler_document_new_from_pdfdoc (initer, newDoc, error);
}
static inline gboolean
@@ -360,9 +356,7 @@ poppler_document_new_from_stream (GInputStream *stream,
g_return_val_if_fail(G_IS_INPUT_STREAM(stream), NULL);
g_return_val_if_fail(length == (goffset)-1 || length > 0, NULL);
- if (!globalParams) {
- globalParams = std::make_unique<GlobalParams>();
- }
+ auto initer = new GlobalParamsIniter(_poppler_error_cb, nullptr);
if (!G_IS_SEEKABLE(stream) || !g_seekable_can_seek(G_SEEKABLE(stream))) {
g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
@@ -388,7 +382,7 @@ poppler_document_new_from_stream (GInputStream *stream,
newDoc = new PDFDoc(str, password_g, password_g);
delete password_g;
- return _poppler_document_new_from_pdfdoc (newDoc, error);
+ return _poppler_document_new_from_pdfdoc (initer, newDoc, error);
}
/**
@@ -548,6 +542,7 @@ poppler_document_finalize (GObject *object)
poppler_document_layers_free (document);
delete document->output_dev;
delete document->doc;
+ delete document->initer;
G_OBJECT_CLASS (poppler_document_parent_class)->finalize (object);
}
diff --git a/glib/poppler-private.h b/glib/poppler-private.h
index 3e6b4b17..cba1de76 100644
--- a/glib/poppler-private.h
+++ b/glib/poppler-private.h
@@ -24,6 +24,7 @@ struct _PopplerDocument
{
/*< private >*/
GObject parent_instance;
+ GlobalParamsIniter *initer;
PDFDoc *doc;
GList *layers;
@@ -162,4 +163,6 @@ type_name##_get_type (void)
return g_define_type_id__volatile; \
}
+void _poppler_error_cb (void *data, ErrorCategory category, Goffset pos, const char *message);
+
#endif
diff --git a/glib/poppler.cc b/glib/poppler.cc
index 55347c2d..31183372 100644
--- a/glib/poppler.cc
+++ b/glib/poppler.cc
@@ -23,6 +23,8 @@
#include <Error.h>
#endif
+#include "poppler-private.h"
+
/**
* SECTION: poppler-errors
* @title: Error handling
@@ -76,18 +78,16 @@ poppler_get_version (void)
return poppler_version;
}
-#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-
/* We want to install an error callback so that PDF syntax warnings etc
* can be redirected through the GLib logging API instead of always just
* going to stderr.
*/
-static void
-error_cb (void *data G_GNUC_UNUSED,
- ErrorCategory category,
- Goffset pos,
- const char *message)
+void
+_poppler_error_cb (void *data G_GNUC_UNUSED,
+ ErrorCategory category,
+ Goffset pos,
+ const char *message)
{
static const char * const cat_str[] = {
"Syntax warning",
@@ -110,11 +110,3 @@ error_cb (void *data G_GNUC_UNUSED,
"%s at position %" G_GOFFSET_FORMAT ": %s",
cat_str[category], (goffset) pos, message);
}
-
-static void __attribute__((__constructor__))
-poppler_constructor ()
-{
- setErrorCallback (error_cb, nullptr);
-}
-
-#endif /* GNUC */