summaryrefslogtreecommitdiff
path: root/embed.h
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2012-07-10 00:26:12 -0700
committerFather Chrysostomos <sprout@cpan.org>2012-07-12 13:20:10 -0700
commit3107b51fb9c191a2ee82450f00c4568640538e12 (patch)
tree8dd54b1256f71ecfd6cd46f74ba82085dc6cc988 /embed.h
parent8f55039992b2378df3dcb99bb2ec67d80b7c8854 (diff)
downloadperl-3107b51fb9c191a2ee82450f00c4568640538e12.tar.gz
PERL_DEBUG_READONLY_OPS with the new allocator
I want to eliminate the old slab allocator (PL_OP_SLAB_ALLOC), but this useful debugging tool needs to be rewritten for the new one first. This is slightly better than under PL_OP_SLAB_ALLOC, in that CVs cre- ated after the main CV starts running will get read-only ops, too. It is when a CV finishes compiling and relinquishes ownership of the slab that the slab is made read-only, because at that point it should not be used again for allocation. BEGIN blocks are exempt, as they are processed before the Slab_to_ro call in newATTRSUB. The Slab_to_ro call must come at the very end, after LEAVE_SCOPE, because otherwise the ops freed via the stack (the SAVEFREEOP calls near the top of newATTRSUB) will make the slab writa- ble again. At that point, the BEGIN block has already been run and its slab freed. Maybe slabs belonging to BEGIN blocks can be made read-only later. Under PERL_DEBUG_READONLY_OPS, op slabs have two extra fields to record the size and readonliness of each slab. (Only the first slab in a CV’s slab chain uses the readonly flag, since it is conceptually simpler to treat them all as one unit.) Without recording this infor- mation manually, things become unbearably slow, the tests taking hours and hours instead of minutes.
Diffstat (limited to 'embed.h')
-rw-r--r--embed.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/embed.h b/embed.h
index 0a4d76ab9e..49bb248657 100644
--- a/embed.h
+++ b/embed.h
@@ -1234,6 +1234,13 @@
#define package(a) Perl_package(aTHX_ a)
#define utilize(a,b,c,d,e) Perl_utilize(aTHX_ a,b,c,d,e)
# endif
+# if !(defined(PL_OP_SLAB_ALLOC))
+# if defined(PERL_CORE)
+# if defined(PERL_DEBUG_READONLY_OPS)
+#define Slab_to_ro(a) Perl_Slab_to_ro(aTHX_ a)
+# endif
+# endif
+# endif
# if !defined(HAS_GETENV_LEN)
#define getenv_len(a,b) Perl_getenv_len(aTHX_ a,b)
# endif