[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: The “finalized” SMOB type
From: |
Ludovic Courtès |
Subject: |
Re: The “finalized” SMOB type |
Date: |
Sun, 09 Oct 2016 15:40:39 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) |
Hi Artyom,
Artyom Poptsov <address@hidden> skribis:
> thanks for pointing that out. IIRC, I saw this kind of errors during
> testing but I thought I fixed them. What Guile-SSH version do you use?
I just realized I was still using 0.9.0, sorry for the confusion!
> Here's 'free_session' procedure from Guile-SSH version 0.10.0:
>
> size_t
> free_session (SCM session_smob)
> {
> if (! SCM_SMOB_PREDICATE (session_tag, session_smob))
> {
> _ssh_log (SSH_LOG_FUNCTIONS, "free_session", "%s", "already freed");
> return 0;
> }
I think this is incorrect. AIUI, with 2.0.12, the SMOB type predicate
is always false, so you end up never freeing anything; see smob.c:
--8<---------------cut here---------------start------------->8---
static void
finalize_smob (void *ptr, void *data)
{
SCM smob;
scm_t_bits smobnum;
size_t (* free_smob) (SCM);
smob = PTR2SCM (ptr);
smobnum = (scm_t_bits) GC_call_with_alloc_lock (clear_smobnum, ptr);
#if 0
printf ("finalizing SMOB %p (smobnum: %u)\n", ptr, smobnum);
#endif
free_smob = scm_smobs[smobnum].free;
if (free_smob)
free_smob (smob);
}
--8<---------------cut here---------------end--------------->8---
Here ‘clear_smobnum’ is the procedure that changes PTR to have the
“finalized smob” type.
So the right thing would be to replace:
struct session_data *data = _scm_to_session_data (session_smob);
… with:
struct session_data *data = SCM_SMOB_DATA (session_smob);
Does it make sense?
Thanks,
Ludo’.