On Fri, Feb 24, 2012 at 05:18:14PM +0000, Dave Mitchell wrote:
> (I confess I haven't looked closely at this yet, but...)

[And I confess I forgot about this message - sorry for the delay.]

> I seems that the imp_xxh_t structure is stored in the PVX of an SV
> pointed to by mg_obj.

The DBI is very old. I suspect it's was done that way because mg_obj had
to point to an SV in very old versions of perl. git blame says Larry
added MGf_REFCOUNTED to mg.h on 1994-05-04. The DBI in a very
rudamentary form back then. So it might have been that.

I also recall problems with global destruction order, in the early days,
that led to other oddities like the DBD::_mem::{dr,db,st} classes that
the imp_xxh_t struct gets blessed into:

    strcpy(imp_mem_name, imp_class);
    strcat(imp_mem_name, "_mem");
    imp_mem_stash = gv_stashpv(imp_mem_name, FALSE);
    ...
    dbih_imp_rv = newRV_inc(dbih_imp_sv);       /* just needed for sv_bless */
    sv_bless(dbih_imp_rv, imp_mem_stash);
    sv_free(dbih_imp_rv);

I hope that's ancient history now, but it might also be a dark corner
hiding a dragon.

> Is there any reason why it can't be just directly malloced and pointed
> to from mg_ptr instead?

Other than the issue above I can't think of any, except that it would
require drivers to be re-compiled.

Normally I'd say that requiring users to undergo the pain of a driver
recompile probably wouldn't be worth the (currently only presumed) gains.
But since we're already looking at a binary-incompatible change for the
DBIS macro, which I've also been trying to avoid, it looks more tempting.

If you can show a useful speed gain from the change (and no global
destruction issues on 5.8.3+) then I'll say we should require a
driver-compile and roll the new DBIS changes into that.

Sound good?

Tim.

Reply via email to