summaryrefslogtreecommitdiff
path: root/sv.h
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-06-30 10:46:09 +0100
committerNicholas Clark <nick@ccl4.org>2010-06-30 10:46:09 +0100
commit6f7e83539961a11c89e33c98b9799323e732d5f9 (patch)
tree086222fb7e0ddedcc7cc6b024713359d16a346a8 /sv.h
parent5da80af416fe1cadcc86dcb161e4297f0ea37c63 (diff)
downloadperl-6f7e83539961a11c89e33c98b9799323e732d5f9.tar.gz
Store xio_ifp in sv_u in the SV head, reducing XPVIO by 1 pointer.
When accessing a file handle for reading, this reduces pointer dereferences by 1, which will reduce CPU cache pressure. As SVt_PVIO is also the default type provided to source filters, the code needs to allow them to continue to use the sv_u for SvPVX(). Re-use the existing IOf_FAKE_DIRP to signal this, as it's only set when a source filter is added.
Diffstat (limited to 'sv.h')
-rw-r--r--sv.h21
1 files changed, 18 insertions, 3 deletions
diff --git a/sv.h b/sv.h
index adadab36cb..bc75d1e199 100644
--- a/sv.h
+++ b/sv.h
@@ -106,6 +106,7 @@ typedef struct hek HEK;
SV** svu_array; \
HE** svu_hash; \
GP* svu_gp; \
+ PerlIO *svu_fp; \
} sv_u
@@ -509,8 +510,8 @@ struct xpvfm {
struct xpvio {
_XPV_HEAD;
union _xivu xiv_u;
- PerlIO * xio_ifp; /* ifp and ofp are normally the same */
- PerlIO * xio_ofp; /* but sockets need separate streams */
+ /* ifp and ofp are normally the same, but sockets need separate streams */
+ PerlIO * xio_ofp;
/* Cray addresses everything by word boundaries (64 bits) and
* code and data pointers cannot be mixed (which is exactly what
* Perl_filter_add() tries to do with the dirp), hence the
@@ -1054,6 +1055,8 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(_svcur) != SVt_PVAV); \
assert(SvTYPE(_svcur) != SVt_PVHV); \
assert(!isGV_with_GP(_svcur)); \
+ assert(!(SvTYPE(_svcur) == SVt_PVIO \
+ && !(IoFLAGS(_svcur) & IOf_FAKE_DIRP))); \
&(((XPV*) MUTABLE_PTR(SvANY(_svcur)))->xpv_cur); \
}))
# define SvIVX(sv) \
@@ -1100,6 +1103,8 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(_svrv) != SVt_PVCV); \
assert(SvTYPE(_svrv) != SVt_PVFM); \
assert(!isGV_with_GP(_svrv)); \
+ assert(!(SvTYPE(_svrv) == SVt_PVIO \
+ && !(IoFLAGS(_svrv) & IOf_FAKE_DIRP))); \
&((_svrv)->sv_u.svu_rv); \
}))
# define SvRV_const(sv) \
@@ -1110,6 +1115,8 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(_svrv) != SVt_PVCV); \
assert(SvTYPE(_svrv) != SVt_PVFM); \
assert(!isGV_with_GP(_svrv)); \
+ assert(!(SvTYPE(_svrv) == SVt_PVIO \
+ && !(IoFLAGS(_svrv) & IOf_FAKE_DIRP))); \
(_svrv)->sv_u.svu_rv; \
})
# define SvMAGIC(sv) \
@@ -1185,6 +1192,8 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(sv) != SVt_PVAV); \
assert(SvTYPE(sv) != SVt_PVHV); \
assert(!isGV_with_GP(sv)); \
+ assert(!(SvTYPE(sv) == SVt_PVIO \
+ && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
((sv)->sv_u.svu_pv = (val)); } STMT_END
#define SvUV_set(sv, val) \
STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
@@ -1200,6 +1209,8 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(sv) != SVt_PVCV); \
assert(SvTYPE(sv) != SVt_PVFM); \
assert(!isGV_with_GP(sv)); \
+ assert(!(SvTYPE(sv) == SVt_PVIO \
+ && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
((sv)->sv_u.svu_rv = (val)); } STMT_END
#define SvMAGIC_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
@@ -1212,12 +1223,16 @@ the scalar's value cannot change unless written to.
assert(SvTYPE(sv) != SVt_PVAV); \
assert(SvTYPE(sv) != SVt_PVHV); \
assert(!isGV_with_GP(sv)); \
+ assert(!(SvTYPE(sv) == SVt_PVIO \
+ && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
(((XPV*) SvANY(sv))->xpv_cur = (val)); } STMT_END
#define SvLEN_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
assert(SvTYPE(sv) != SVt_PVAV); \
assert(SvTYPE(sv) != SVt_PVHV); \
assert(!isGV_with_GP(sv)); \
+ assert(!(SvTYPE(sv) == SVt_PVIO \
+ && !(IoFLAGS(sv) & IOf_FAKE_DIRP))); \
(((XPV*) SvANY(sv))->xpv_len = (val)); } STMT_END
#define SvEND_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
@@ -1311,7 +1326,7 @@ the scalar's value cannot change unless written to.
#define LvTARGOFF(sv) ((XPVLV*) SvANY(sv))->xlv_targoff
#define LvTARGLEN(sv) ((XPVLV*) SvANY(sv))->xlv_targlen
-#define IoIFP(sv) ((XPVIO*) SvANY(sv))->xio_ifp
+#define IoIFP(sv) (sv)->sv_u.svu_fp
#define IoOFP(sv) ((XPVIO*) SvANY(sv))->xio_ofp
#define IoDIRP(sv) ((XPVIO*) SvANY(sv))->xio_dirp
#define IoANY(sv) ((XPVIO*) SvANY(sv))->xio_any