diff options
author | Adam Reichold <adam.reichold@t-online.de> | 2020-01-03 22:05:53 +0100 |
---|---|---|
committer | Albert Astals Cid <tsdgeos@yahoo.es> | 2020-01-04 22:13:25 +0000 |
commit | 6de0bba0b7d064195b27619667dbbcb7cd810647 (patch) | |
tree | 2db0d4e682caaae2f65243de561d4feca396474f | |
parent | a8220105f964ee4102e4ee886df2d0b162b42ae6 (diff) |
Make use of the GlobalParamsIniter to make the glib frontend initialization thread safe.
-rw-r--r-- | glib/poppler-document.cc | 31 | ||||
-rw-r--r-- | glib/poppler-private.h | 3 | ||||
-rw-r--r-- | glib/poppler.cc | 22 |
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 */ |