aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/alloc.c b/src/alloc.c
index bee7cd1758d..48ce3f120f5 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -3711,6 +3711,23 @@ make_event_array (ptrdiff_t nargs, Lisp_Object *args)
3711 } 3711 }
3712} 3712}
3713 3713
3714#ifdef HAVE_MODULES
3715/* Create a new module user ptr object. */
3716Lisp_Object
3717make_user_ptr (void (*finalizer) (void*), void *p)
3718{
3719 Lisp_Object obj;
3720 struct Lisp_User_Ptr *uptr;
3721
3722 obj = allocate_misc (Lisp_Misc_User_Ptr);
3723 uptr = XUSER_PTR (obj);
3724 uptr->finalizer = finalizer;
3725 uptr->p = p;
3726 return obj;
3727}
3728
3729#endif
3730
3714static void 3731static void
3715init_finalizer_list (struct Lisp_Finalizer *head) 3732init_finalizer_list (struct Lisp_Finalizer *head)
3716{ 3733{
@@ -6301,6 +6318,12 @@ mark_object (Lisp_Object arg)
6301 mark_object (XFINALIZER (obj)->function); 6318 mark_object (XFINALIZER (obj)->function);
6302 break; 6319 break;
6303 6320
6321#ifdef HAVE_MODULES
6322 case Lisp_Misc_User_Ptr:
6323 XMISCANY (obj)->gcmarkbit = true;
6324 break;
6325#endif
6326
6304 default: 6327 default:
6305 emacs_abort (); 6328 emacs_abort ();
6306 } 6329 }
@@ -6677,8 +6700,15 @@ sweep_misc (void)
6677 { 6700 {
6678 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker) 6701 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Marker)
6679 unchain_marker (&mblk->markers[i].m.u_marker); 6702 unchain_marker (&mblk->markers[i].m.u_marker);
6680 if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer) 6703 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_Finalizer)
6681 unchain_finalizer (&mblk->markers[i].m.u_finalizer); 6704 unchain_finalizer (&mblk->markers[i].m.u_finalizer);
6705#ifdef HAVE_MODULES
6706 else if (mblk->markers[i].m.u_any.type == Lisp_Misc_User_Ptr)
6707 {
6708 struct Lisp_User_Ptr *uptr = &mblk->markers[i].m.u_user_ptr;
6709 uptr->finalizer (uptr->p);
6710 }
6711#endif
6682 /* Set the type of the freed object to Lisp_Misc_Free. 6712 /* Set the type of the freed object to Lisp_Misc_Free.
6683 We could leave the type alone, since nobody checks it, 6713 We could leave the type alone, since nobody checks it,
6684 but this might catch bugs faster. */ 6714 but this might catch bugs faster. */