summaryrefslogtreecommitdiff
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c58
1 files changed, 55 insertions, 3 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 4daa60ca0f1..5a0b2641b10 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -3657,6 +3657,38 @@ free_marker (Lisp_Object marker)
free_misc (marker);
}
+#ifdef HAVE_LTDL
+/* Create a new module object. */
+Lisp_Object
+module_make_object (module_id_t id, void (*dtor) (void*), void *userptr)
+{
+ Lisp_Object obj;
+ struct Lisp_Module *m;
+
+ eassert (id < MODULE_ID_MAX);
+
+ obj = allocate_misc (Lisp_Misc_Module);
+ m = XMODULE (obj);
+ m->id = id;
+ m->dtor = dtor;
+ m->p = userptr;
+ return obj;
+}
+
+/* Free a module using its own destructor. */
+void
+module_free_object (Lisp_Object obj)
+{
+ /* every change made here probably needs to be done in
+ sweep_marker() */
+
+ struct Lisp_Module *m = XMODULE (obj);
+ m->dtor (m->p);
+
+ free_misc (obj);
+}
+#endif
+
/* Return a newly created vector or string with specified arguments as
elements. If all the arguments are characters that can fit
@@ -6367,6 +6399,12 @@ mark_object (Lisp_Object arg)
mark_overlay (XOVERLAY (obj));
break;
+#ifdef HAVE_LTDL
+ case Lisp_Misc_Module:
+ XMISCANY (obj)->gcmarkbit = 1;
+ break;
+#endif
+
default:
emacs_abort ();
}
@@ -6744,9 +6782,23 @@ sweep_misc (void)
for (i = 0; i < lim; i++)
{
if (!mblk->markers[i].m.u_any.gcmarkbit)
- {
- if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
- unchain_marker (&mblk->markers[i].m.u_marker);
+ {
+ switch (mblk->markers[i].m.u_any.type)
+ {
+ case Lisp_Misc_Marker:
+ unchain_marker (&mblk->markers[i].m.u_marker);
+ break;
+#ifdef HAVE_LTDL
+ case Lisp_Misc_Module:
+ /* Module dtor need to be called */
+ {
+ /* see module_free_object() */
+ struct Lisp_Module *m = &mblk->markers[i].m.u_module;
+ m->dtor (m->p);
+ }
+ break;
+#endif
+ }
/* Set the type of the freed object to Lisp_Misc_Free.
We could leave the type alone, since nobody checks it,
but this might catch bugs faster. */