diff options
author | Abhijit Menon-Sen <ams@wiw.org> | 2004-01-24 11:03:36 +0000 |
---|---|---|
committer | Abhijit Menon-Sen <ams@wiw.org> | 2004-01-24 11:03:36 +0000 |
commit | a8b7ef86e7eea87c1e7ba6a6f9d5d81b5954df00 (patch) | |
tree | 2542d7f1cf683840fd0bff4cd7393dfb18ee4cea /ext/Storable/Storable.xs | |
parent | cb0af21342720ff0ea17f82801a612db684404a9 (diff) | |
download | perl-a8b7ef86e7eea87c1e7ba6a6f9d5d81b5954df00.tar.gz |
[patch] make Storable thread-safe
From: Stas Bekman <stas@stason.org>
Date: Mon, 19 Jan 2004 00:20:02 -0800
Message-Id: <400B9332.4070106@stason.org>
Subject: Re: Subroutine reference bug in Storable
From: Slaven Rezic <slaven@rezic.de>
Date: 14 Nov 2003 23:22:55 +0100
Message-Id: <874qx6zj28.fsf@vran.herceg.de>
Subject: Re: [perl #25145] [PATCH] Storable segfaults with B::Deparse +
overload + cyclic structures
From: Sam Vilain <sam@vilain.net>
Date: Tue, 20 Jan 2004 22:30:15 +1300
Message-Id: <200401202230.15865.sam@vilain.net>
p4raw-id: //depot/perl@22205
Diffstat (limited to 'ext/Storable/Storable.xs')
-rw-r--r-- | ext/Storable/Storable.xs | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/ext/Storable/Storable.xs b/ext/Storable/Storable.xs index 77003aaf76..5b3868b8f7 100644 --- a/ext/Storable/Storable.xs +++ b/ext/Storable/Storable.xs @@ -791,6 +791,13 @@ static const char byteorderstr_56[] = {BYTEORDER_BYTES_56, 0}; * Useful store shortcuts... */ +/* + * Note that if you put more than one mark for storing a particular + * type of thing, *and* in the retrieve_foo() function you mark both + * the thingy's you get off with SEEN(), you *must* increase the + * tagnum with cxt->tagnum++ along with this macro! + * - samv 20Jan04 + */ #define PUTMARK(x) \ STMT_START { \ if (!cxt->fio) \ @@ -2463,6 +2470,7 @@ static int store_code(stcxt_t *cxt, CV *cv) */ PUTMARK(SX_CODE); + cxt->tagnum++; /* necessary, as SX_CODE is a SEEN() candidate */ TRACEME(("size = %d", len)); TRACEME(("code = %s", SvPV_nolen(text))); @@ -4202,10 +4210,11 @@ static SV *retrieve_overloaded(stcxt_t *cxt, char *cname) /* * Restore overloading magic. */ - - stash = (HV *) SvSTASH (sv); - if (!stash || !Gv_AMG(stash)) - CROAK(("Cannot restore overloading on %s(0x%"UVxf") (package %s)", + if (!SvTYPE(sv) + || !(stash = (HV *) SvSTASH (sv)) + || !Gv_AMG(stash)) + CROAK(("Cannot restore overloading on %s(0x%"UVxf + ") (package %s)", sv_reftype(sv, FALSE), PTR2UV(sv), stash ? HvNAME(stash) : "<unknown>")); @@ -4695,6 +4704,7 @@ static SV *retrieve_sv_no(stcxt_t *cxt, char *cname) TRACEME(("retrieve_sv_no")); + cxt->tagnum--; /* undo the tagnum increment in retrieve_l?scalar */ SEEN(sv, cname); return sv; } @@ -4975,13 +4985,24 @@ static SV *retrieve_code(stcxt_t *cxt, char *cname) CROAK(("retrieve_code does not work with perl 5.005 or less\n")); #else dSP; - int type, count; + int type, count, tagnum; SV *cv; SV *sv, *text, *sub; TRACEME(("retrieve_code (#%d)", cxt->tagnum)); /* + * Insert dummy SV in the aseen array so that we don't screw + * up the tag numbers. We would just make the internal + * scalar an untagged item in the stream, but + * retrieve_scalar() calls SEEN(). So we just increase the + * tag number. + */ + tagnum = cxt->tagnum; + sv = newSViv(0); + SEEN(sv, cname); + + /* * Retrieve the source of the code reference * as a small or large scalar */ @@ -5023,6 +5044,8 @@ static SV *retrieve_code(stcxt_t *cxt, char *cname) CROAK(("Can't eval, please set $Storable::Eval to a true value")); } else { sv = newSVsv(sub); + /* fix up the dummy entry... */ + av_store(cxt->aseen, tagnum, SvREFCNT_inc(sv)); return sv; } } @@ -5060,8 +5083,9 @@ static SV *retrieve_code(stcxt_t *cxt, char *cname) FREETMPS; LEAVE; + /* fix up the dummy entry... */ + av_store(cxt->aseen, tagnum, SvREFCNT_inc(sv)); - SEEN(sv, cname); return sv; #endif } @@ -5901,6 +5925,9 @@ BOOT: gv_fetchpv("Storable::interwork_56_64bit", GV_ADDMULTI, SVt_PV); #endif +void +init_perinterp() + int pstore(f,obj) OutputStream f |