guile-devel
[Top][All Lists]
Advanced

[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’.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]