perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <>
Subject Re: Build of mod_perl 2.0.0 fails on bleadperl - no more HvPMROOT()
Date Thu, 07 Jul 2005 15:21:49 GMT
Stas Bekman wrote:
>> If you really really feel the need to cheat then you have the choice 
>> of these:
>> #define xhv_keys xiv_u.xivu_iv
>> typedef struct {
>>     STRLEN    xhv_fill;    /* how full xhv_array currently is */
>>     STRLEN    xhv_max;    /* subscript of last element of xhv_array */
>>     union {
>>     IV    xivu_iv;    /* integer value or pv offset */
>>     UV    xivu_uv;
>>     void *    xivu_p1;
>>     }        xiv_u;
>>     MAGIC*    xmg_magic;    /* magic for scalar array */
>>     HV*        xmg_stash;    /* class package */
>> } xpvhv_allocated;
>> Only xmg_magic and xmg_stash aren't needed for the operation of a 
>> regular hash.
>> I've no idea what modglobal_ptr gets used for throughout the perl 
>> codebase,
>> but hanging something that isn't MAGIC* from xmg_magic feels like a 
>> bad plan.

While using xmg_magic or xmg_stash works most of the time, it fails 
perl_clone at run time, where it tries to clone the member which is not of 
a proper type (just a pointer cast into MAGIC*), resulting in a segfault:

#7  0xb7aaac57 in Perl_sv_dup (my_perl=0xba9bc88, sstr=0x5, param=0xb685ada0)
     at sv.c:10287
#8  0xb7aaa36a in Perl_mg_dup (my_perl=0xba9bc88, mg=0xadb9608, 
     at sv.c:10056
#9  0xb7aab3bc in Perl_sv_dup (my_perl=0xba9bc88, sstr=0xb2b20c0, 
     at sv.c:10477
#10 0xb7aaf785 in perl_clone (proto_perl=0xaa16dd8, flags=2) at sv.c:11531
#11 0xb7895a8a in Perl_ithread_create (my_perl=0xaa16dd8, obj=0x0,
     classname=0xba98910 "threads", init_function=0xbd412d8, params=0xbc551b8)
     at threads.xs:426

Besides the speed that I have mentioned before, there is another 
requirement: the get/set should work w/o needing aTHX, therefore using a 
real magic won't work.

More ideas?

Really, what we are after is the set/get mechanism used by ithreads.xs 
itself, but it needs to be faster and require no aTHX. If we find one we 
will be able to speed up ithreads as well. At the moment ithreads.xs does:

void Perl_ithread_set (pTHX_ ithread* thread)
   SV* thread_sv = newSViv(PTR2IV(thread));
   if(!hv_store(PL_modglobal, "threads::self", 12, thread_sv,0)) {
     croak("%s\n","Internal error, couldn't set TLS");

ithread* Perl_ithread_get (pTHX) {
   SV** thread_sv = hv_fetch(PL_modglobal, "threads::self",12,0);
   if(!thread_sv) {
     croak("%s\n","Internal error, couldn't get TLS");
   return INT2PTR(ithread*,SvIV(*thread_sv));

Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker     mod_perl Guide --->

To unsubscribe, e-mail:
For additional commands, e-mail:

View raw message