This is an automated email from the git hooks/post-receive script.
git pushed a commit to branch master
in repository legacy-imlib2.
View the commit online.
commit 9468f7132c904186352bc70c4991f646dcf2fc3c
Author: Kim Woelders <k...@woelders.dk>
AuthorDate: Mon Apr 3 06:50:21 2023 +0200
loaders: Change method used to not unload loaders
It appears that in certain environments (homebrew on MacOS) the linker
does not like the -z nodelete option, so handle this differently.
https://git.enlightenment.org/old/legacy-imlib2/issues/8
---
src/lib/Imlib2_Loader.h | 13 +++++++++++--
src/lib/loaders.c | 28 ++++++++++++++++++++++++++--
src/lib/loaders.h | 4 +++-
src/modules/loaders/Makefile.am | 4 ++--
src/modules/loaders/loader_heif.c | 2 +-
src/modules/loaders/loader_svg.c | 2 +-
6 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/src/lib/Imlib2_Loader.h b/src/lib/Imlib2_Loader.h
index 8349fad..8279e2b 100644
--- a/src/lib/Imlib2_Loader.h
+++ b/src/lib/Imlib2_Loader.h
@@ -197,24 +197,33 @@ int __imlib_LoadProgressRows(ImlibImage * im,
#define IMLIB2_LOADER_VERSION 2
+#define LDR_FLAG_KEEP 0x01 /* Don't unload loader */
+
typedef struct {
unsigned char ldr_version; /* Module ABI version */
- unsigned char rsvd;
+ unsigned char ldr_flags; /* LDR_FLAG_... */
unsigned short num_formats; /* Length og known extension list */
const char *const *formats; /* Known extension list */
int (*load)(ImlibImage * im, int load_data);
int (*save)(ImlibImage * im);
} ImlibLoaderModule;
-#define IMLIB_LOADER(_fmts, _ldr, _svr) \
+#define IMLIB_LOADER_(_fmts, _ldr, _svr, _flags) \
__EXPORT__ ImlibLoaderModule loader = { \
.ldr_version = IMLIB2_LOADER_VERSION, \
+ .ldr_flags = _flags, \
.num_formats = ARRAY_SIZE(_fmts), \
.formats = _fmts, \
.load = _ldr, \
.save = _svr, \
}
+#define IMLIB_LOADER(_fmts, _ldr, _svr) \
+ IMLIB_LOADER_(_fmts, _ldr, _svr, 0)
+
+#define IMLIB_LOADER_KEEP(_fmts, _ldr, _svr) \
+ IMLIB_LOADER_(_fmts, _ldr, _svr, LDR_FLAG_KEEP)
+
#define QUIT_WITH_RC(_err) { rc = _err; goto quit; }
#define PCAST(T, p) ((T)(const void *)(p))
diff --git a/src/lib/loaders.c b/src/lib/loaders.c
index b17b428..6995cdf 100644
--- a/src/lib/loaders.c
+++ b/src/lib/loaders.c
@@ -15,6 +15,7 @@
#define DP(fmt...) DC(DBG_LOAD, fmt)
static ImlibLoader *loaders = NULL;
+static ImlibLoader *loaders_unloaded = NULL;
static char loaders_loaded = 0;
typedef struct {
@@ -161,11 +162,24 @@ __imlib_LookupLoaderByModulePath(const char *file)
static ImlibLoader *
__imlib_ProduceLoader(const char *file)
{
- ImlibLoader *l;
+ ImlibLoader *l, *l_prev;
ImlibLoaderModule *m;
DP("%s: %s\n", __func__, file);
+ /* Check unloaded loaders */
+ for (l = loaders_unloaded, l_prev = NULL; l; l_prev = l, l = l->next)
+ {
+ if (strcmp(file, l->file) != 0)
+ continue;
+
+ if (l == loaders_unloaded)
+ loaders_unloaded = l->next;
+ else
+ l_prev->next = l->next;
+ goto found;
+ }
+
l = malloc(sizeof(ImlibLoader));
l->handle = dlopen(file, RTLD_NOW | RTLD_LOCAL);
@@ -187,6 +201,7 @@ __imlib_ProduceLoader(const char *file)
l->file = strdup(file);
l->name = m->formats[0];
+ found:
l->next = loaders;
loaders = l;
@@ -201,9 +216,18 @@ __imlib_ProduceLoader(const char *file)
static void
__imlib_ConsumeLoader(ImlibLoader * l)
{
- free(l->file);
+ if (l->module->ldr_flags & LDR_FLAG_KEEP)
+ {
+ /* Not un/re-loadable - Move to unloaded loaders list */
+ l->next = loaders_unloaded;
+ loaders_unloaded = l;
+ return;
+ }
+
if (l->handle)
dlclose(l->handle);
+
+ free(l->file);
free(l);
}
diff --git a/src/lib/loaders.h b/src/lib/loaders.h
index e10691a..8975172 100644
--- a/src/lib/loaders.h
+++ b/src/lib/loaders.h
@@ -5,9 +5,11 @@
#define IMLIB2_LOADER_VERSION 2
+#define LDR_FLAG_KEEP 0x01 /* Don't unload loader */
+
typedef struct {
unsigned char ldr_version; /* Module ABI version */
- unsigned char rsvd;
+ unsigned char ldr_flags; /* LDR_FLAG_... */
unsigned short num_formats; /* Length og known extension list */
const char *const *formats; /* Known extension list */
int (*load)(ImlibImage * im, int load_data);
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
index d66bfb4..5e92de4 100644
--- a/src/modules/loaders/Makefile.am
+++ b/src/modules/loaders/Makefile.am
@@ -91,7 +91,7 @@ gif_la_LIBTOOLFLAGS = --tag=disable-static
heif_la_SOURCES = loader_heif.c
heif_la_CPPFLAGS = $(HEIF_CFLAGS) $(AM_CPPFLAGS)
-heif_la_LDFLAGS = -module -avoid-version -Wl,-z,nodelete
+heif_la_LDFLAGS = -module -avoid-version
heif_la_LIBADD = $(HEIF_LIBS) $(top_builddir)/src/lib/libImlib2.la
heif_la_LIBTOOLFLAGS = --tag=disable-static
@@ -142,7 +142,7 @@ ps_la_LIBTOOLFLAGS = --tag=disable-static
svg_la_SOURCES = loader_svg.c
svg_la_CPPFLAGS = $(SVG_CFLAGS) $(AM_CPPFLAGS)
-svg_la_LDFLAGS = -module -avoid-version -Wl,-z,nodelete
+svg_la_LDFLAGS = -module -avoid-version
svg_la_LIBADD = $(SVG_LIBS) $(top_builddir)/src/lib/libImlib2.la
svg_la_LIBTOOLFLAGS = --tag=disable-static
diff --git a/src/modules/loaders/loader_heif.c b/src/modules/loaders/loader_heif.c
index 264b215..a9ddec4 100644
--- a/src/modules/loaders/loader_heif.c
+++ b/src/modules/loaders/loader_heif.c
@@ -172,4 +172,4 @@ _load(ImlibImage * im, int load_data)
return rc;
}
-IMLIB_LOADER(_formats, _load, NULL);
+IMLIB_LOADER_KEEP(_formats, _load, NULL);
diff --git a/src/modules/loaders/loader_svg.c b/src/modules/loaders/loader_svg.c
index 31246ce..c9f2dd0 100644
--- a/src/modules/loaders/loader_svg.c
+++ b/src/modules/loaders/loader_svg.c
@@ -238,4 +238,4 @@ _load(ImlibImage * im, int load_data)
return rc;
}
-IMLIB_LOADER(_formats, _load, NULL);
+IMLIB_LOADER_KEEP(_formats, _load, NULL);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.