cvs commit: ponie/src/pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc
[email protected] (Nicholas Clark) 30 Apr 2005 22:00:13 -0000
| Newsgroups | perl.ponie.changes |
|---|---|
| Message-ID | <[email protected]> |
cvsuser 05/04/30 15:00:13
Modified: src/pmc perl5pv.pmc perl5pvav.pmc perl5pvbm.pmc
perl5pvcv.pmc perl5pvfm.pmc perl5pvgv.pmc
perl5pvhv.pmc perl5pvio.pmc perl5pviv.pmc
perl5pvlv.pmc perl5pvmg.pmc perl5pvnv.pmc
Log:
The rest of
Move all the memory allocation code into the PMCs.
All memory management is now completely hidden from the perl core
which wasn't committed due to human error (just for a change from CVS error)
Revision Changes Path
1.5 +50 -3 ponie/src/pmc/perl5pv.pmc
Index: perl5pv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pv.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- perl5pv.pmc 30 Apr 2005 17:35:36 -0000 1.4
+++ perl5pv.pmc 30 Apr 2005 22:00:13 -0000 1.5
@@ -12,8 +12,55 @@
#include "ponie.h"
-#define new_XPV() (void*)new_xpv()
-#define del_XPV(p) del_xpv((XPV *)p)
+#define new_XPV() (void*)S_new_xpv()
+#define del_XPV(p) S_del_xpv((XPV *)p)
+
+/* allocate another arena's worth of struct xpv */
+
+STATIC void
+S_more_xpv(pTHX)
+{
+ register XPV* xpv;
+ register XPV* xpvend;
+ New(713, xpv, 1008/sizeof(XPV), XPV);
+ xpv->xpv_pv = (char*)PL_xpv_arenaroot;
+ PL_xpv_arenaroot = xpv;
+
+ xpvend = &xpv[1008 / sizeof(XPV) - 1];
+ PL_xpv_root = ++xpv;
+ while (xpv < xpvend) {
+ xpv->xpv_pv = (char*)(xpv + 1);
+ xpv++;
+ }
+ xpv->xpv_pv = 0;
+}
+
+
+/* grab a new struct xpv from the free list, allocating more if necessary */
+
+STATIC XPV*
+S_new_xpv(pTHX)
+{
+ XPV* xpv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpv_root)
+ S_more_xpv();
+ xpv = PL_xpv_root;
+ PL_xpv_root = (XPV*)xpv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpv;
+}
+
+/* return a struct xpv to the free list */
+
+STATIC void
+S_del_xpv(pTHX_ XPV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpv_root;
+ PL_xpv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PV extends Perl5base dynpmc group Perl5_group {
1.5 +48 -3 ponie/src/pmc/perl5pvav.pmc
Index: perl5pvav.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvav.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- perl5pvav.pmc 30 Apr 2005 17:35:36 -0000 1.4
+++ perl5pvav.pmc 30 Apr 2005 22:00:13 -0000 1.5
@@ -12,8 +12,53 @@
#include "ponie.h"
-#define new_XPVAV() (void*)new_xpvav()
-#define del_XPVAV(p) del_xpvav((XPVAV *)p)
+#define new_XPVAV() (void*)S_new_xpvav()
+#define del_XPVAV(p) S_del_xpvav((XPVAV *)p)
+
+/* allocate another arena's worth of struct xpvav */
+
+STATIC void
+S_more_xpvav(pTHX)
+{
+ register XPVAV* xpvav;
+ register XPVAV* xpvavend;
+ New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
+ xpvav->xav_array = (char*)PL_xpvav_arenaroot;
+ PL_xpvav_arenaroot = xpvav;
+
+ xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
+ PL_xpvav_root = ++xpvav;
+ while (xpvav < xpvavend) {
+ xpvav->xav_array = (char*)(xpvav + 1);
+ xpvav++;
+ }
+ xpvav->xav_array = 0;
+}
+/* grab a new struct xpvav from the free list, allocating more if necessary */
+
+STATIC XPVAV*
+S_new_xpvav(pTHX)
+{
+ XPVAV* xpvav;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvav_root)
+ S_more_xpvav();
+ xpvav = PL_xpvav_root;
+ PL_xpvav_root = (XPVAV*)xpvav->xav_array;
+ UNLOCK_SV_MUTEX;
+ return xpvav;
+}
+
+/* return a struct xpvav to the free list */
+
+STATIC void
+S_del_xpvav(pTHX_ XPVAV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xav_array = (char*)PL_xpvav_root;
+ PL_xpvav_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVAV extends Perl5PVMG dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {
1.5 +49 -3 ponie/src/pmc/perl5pvbm.pmc
Index: perl5pvbm.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvbm.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- perl5pvbm.pmc 30 Apr 2005 17:35:36 -0000 1.4
+++ perl5pvbm.pmc 30 Apr 2005 22:00:13 -0000 1.5
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVBM() (void*)new_xpvbm()
-#define del_XPVBM(p) del_xpvbm((XPVBM *)p)
+#define new_XPVBM() (void*)S_new_xpvbm()
+#define del_XPVBM(p) S_del_xpvbm((XPVBM *)p)
+
+/* allocate another arena's worth of struct xpvbm */
+
+STATIC void
+S_more_xpvbm(pTHX)
+{
+ register XPVBM* xpvbm;
+ register XPVBM* xpvbmend;
+ New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
+ xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
+ PL_xpvbm_arenaroot = xpvbm;
+
+ xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
+ PL_xpvbm_root = ++xpvbm;
+ while (xpvbm < xpvbmend) {
+ xpvbm->xpv_pv = (char*)(xpvbm + 1);
+ xpvbm++;
+ }
+ xpvbm->xpv_pv = 0;
+}
+
+/* grab a new struct xpvbm from the free list, allocating more if necessary */
+
+STATIC XPVBM*
+S_new_xpvbm(pTHX)
+{
+ XPVBM* xpvbm;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvbm_root)
+ S_more_xpvbm();
+ xpvbm = PL_xpvbm_root;
+ PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvbm;
+}
+
+/* return a struct xpvbm to the free list */
+
+STATIC void
+S_del_xpvbm(pTHX_ XPVBM *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvbm_root;
+ PL_xpvbm_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVBM extends Perl5PVMG dynpmc group Perl5_group {
1.6 +49 -3 ponie/src/pmc/perl5pvcv.pmc
Index: perl5pvcv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvcv.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvcv.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvcv.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVCV() (void*)new_xpvcv()
-#define del_XPVCV(p) del_xpvcv((XPVCV *)p)
+#define new_XPVCV() (void*)S_new_xpvcv()
+#define del_XPVCV(p) S_del_xpvcv((XPVCV *)p)
+
+/* allocate another arena's worth of struct xpvcv */
+
+STATIC void
+S_more_xpvcv(pTHX)
+{
+ register XPVCV* xpvcv;
+ register XPVCV* xpvcvend;
+ New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
+ xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
+ PL_xpvcv_arenaroot = xpvcv;
+
+ xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
+ PL_xpvcv_root = ++xpvcv;
+ while (xpvcv < xpvcvend) {
+ xpvcv->xpv_pv = (char*)(xpvcv + 1);
+ xpvcv++;
+ }
+ xpvcv->xpv_pv = 0;
+}
+
+/* grab a new struct xpvcv from the free list, allocating more if necessary */
+
+STATIC XPVCV*
+S_new_xpvcv(pTHX)
+{
+ XPVCV* xpvcv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvcv_root)
+ S_more_xpvcv();
+ xpvcv = PL_xpvcv_root;
+ PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvcv;
+}
+
+/* return a struct xpvcv to the free list */
+
+STATIC void
+S_del_xpvcv(pTHX_ XPVCV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvcv_root;
+ PL_xpvcv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVCV extends Perl5PVMG dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {
1.6 +14 -3 ponie/src/pmc/perl5pvfm.pmc
Index: perl5pvfm.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvfm.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvfm.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvfm.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,19 @@
#include "ponie.h"
-#define new_XPVFM() (void*)new_xpvfm()
-#define del_XPVFM(p) del_xpvfm((XPVFM *)p)
+#define new_XPVFM() (void*)S_new_xpvfm()
+#define del_XPVFM(p) S_del_xpvfm((XPVFM *)p)
+
+STATIC XPVFM *
+S_new_xpvfm(pTHX)
+{
+ return safemalloc(sizeof(XPVFM));
+}
+STATIC void
+S_del_xpvfm(pTHX_ XPVFM *fm)
+{
+ safefree(fm);
+}
pmclass Perl5PVFM extends Perl5PVCV dynpmc group Perl5_group {
1.6 +15 -3 ponie/src/pmc/perl5pvgv.pmc
Index: perl5pvgv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvgv.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvgv.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvgv.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,20 @@
#include "ponie.h"
-#define new_XPVGV() (void*)new_xpvgv()
-#define del_XPVGV(p) del_xpvgv((XPVGV *)p)
+#define new_XPVGV() (void*)S_new_xpvgv()
+#define del_XPVGV(p) S_del_xpvgv((XPVGV *)p)
+
+
+STATIC XPVGV *
+S_new_xpvgv(pTHX)
+{
+ return safemalloc(sizeof(XPVGV));
+}
+STATIC void
+S_del_xpvgv(pTHX_ XPVGV *fm)
+{
+ safefree(fm);
+}
pmclass Perl5PVGV extends Perl5PVMG dynpmc group Perl5_group {
1.5 +49 -3 ponie/src/pmc/perl5pvhv.pmc
Index: perl5pvhv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvhv.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- perl5pvhv.pmc 30 Apr 2005 17:35:36 -0000 1.4
+++ perl5pvhv.pmc 30 Apr 2005 22:00:13 -0000 1.5
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVHV() (void*)new_xpvhv()
-#define del_XPVHV(p) del_xpvhv((XPVHV *)p)
+#define new_XPVHV() (void*)S_new_xpvhv()
+#define del_XPVHV(p) S_del_xpvhv((XPVHV *)p)
+
+/* allocate another arena's worth of struct xpvhv */
+
+STATIC void
+S_more_xpvhv(pTHX)
+{
+ register XPVHV* xpvhv;
+ register XPVHV* xpvhvend;
+ New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
+ xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
+ PL_xpvhv_arenaroot = xpvhv;
+
+ xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
+ PL_xpvhv_root = ++xpvhv;
+ while (xpvhv < xpvhvend) {
+ xpvhv->xhv_array = (char*)(xpvhv + 1);
+ xpvhv++;
+ }
+ xpvhv->xhv_array = 0;
+}
+
+/* grab a new struct xpvhv from the free list, allocating more if necessary */
+
+STATIC XPVHV*
+S_new_xpvhv(pTHX)
+{
+ XPVHV* xpvhv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvhv_root)
+ S_more_xpvhv();
+ xpvhv = PL_xpvhv_root;
+ PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
+ UNLOCK_SV_MUTEX;
+ return xpvhv;
+}
+
+/* return a struct xpvhv to the free list */
+
+STATIC void
+S_del_xpvhv(pTHX_ XPVHV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xhv_array = (char*)PL_xpvhv_root;
+ PL_xpvhv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVHV extends Perl5PVMG dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {
1.6 +14 -3 ponie/src/pmc/perl5pvio.pmc
Index: perl5pvio.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvio.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvio.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvio.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,19 @@
#include "ponie.h"
-#define new_XPVIO() (void*)new_xpvio()
-#define del_XPVIO(p) del_xpvio((XPVIO *)p)
+#define new_XPVIO() (void*)S_new_xpvio()
+#define del_XPVIO(p) S_del_xpvio((XPVIO *)p)
+
+STATIC XPVIO *
+S_new_xpvio(pTHX)
+{
+ return safemalloc(sizeof(XPVIO));
+}
+STATIC void
+S_del_xpvio(pTHX_ XPVIO*io)
+{
+ safefree(io);
+}
pmclass Perl5PVIO extends Perl5PVMG dynpmc group Perl5_group {
1.6 +49 -3 ponie/src/pmc/perl5pviv.pmc
Index: perl5pviv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pviv.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pviv.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pviv.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVIV() (void*)new_xpviv()
-#define del_XPVIV(p) del_xpviv((XPVIV *)p)
+#define new_XPVIV() (void*)S_new_xpviv()
+#define del_XPVIV(p) S_del_xpviv((XPVIV *)p)
+
+/* allocate another arena's worth of struct xpviv */
+
+STATIC void
+S_more_xpviv(pTHX)
+{
+ register XPVIV* xpviv;
+ register XPVIV* xpvivend;
+ New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
+ xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
+ PL_xpviv_arenaroot = xpviv;
+
+ xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
+ PL_xpviv_root = ++xpviv;
+ while (xpviv < xpvivend) {
+ xpviv->xpv_pv = (char*)(xpviv + 1);
+ xpviv++;
+ }
+ xpviv->xpv_pv = 0;
+}
+
+/* grab a new struct xpviv from the free list, allocating more if necessary */
+
+STATIC XPVIV*
+S_new_xpviv(pTHX)
+{
+ XPVIV* xpviv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpviv_root)
+ S_more_xpviv();
+ xpviv = PL_xpviv_root;
+ PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpviv;
+}
+
+/* return a struct xpviv to the free list */
+
+STATIC void
+S_del_xpviv(pTHX_ XPVIV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpviv_root;
+ PL_xpviv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVIV extends Perl5PV extends Perl5IV dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {
1.5 +50 -3 ponie/src/pmc/perl5pvlv.pmc
Index: perl5pvlv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvlv.pmc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- perl5pvlv.pmc 30 Apr 2005 17:35:36 -0000 1.4
+++ perl5pvlv.pmc 30 Apr 2005 22:00:13 -0000 1.5
@@ -12,8 +12,55 @@
#include "ponie.h"
-#define new_XPVLV() (void*)new_xpvlv()
-#define del_XPVLV(p) del_xpvlv((XPVLV *)p)
+#define new_XPVLV() (void*)S_new_xpvlv()
+#define del_XPVLV(p) S_del_xpvlv((XPVLV *)p)
+
+/* allocate another arena's worth of struct xpvlv */
+
+STATIC void
+S_more_xpvlv(pTHX)
+{
+ register XPVLV* xpvlv;
+ register XPVLV* xpvlvend;
+ New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
+ xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
+ PL_xpvlv_arenaroot = xpvlv;
+
+ xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
+ PL_xpvlv_root = ++xpvlv;
+ while (xpvlv < xpvlvend) {
+ xpvlv->xpv_pv = (char*)(xpvlv + 1);
+ xpvlv++;
+ }
+ xpvlv->xpv_pv = 0;
+}
+
+
+/* grab a new struct xpvlv from the free list, allocating more if necessary */
+
+STATIC XPVLV*
+S_new_xpvlv(pTHX)
+{
+ XPVLV* xpvlv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvlv_root)
+ S_more_xpvlv();
+ xpvlv = PL_xpvlv_root;
+ PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvlv;
+}
+
+/* return a struct xpvlv to the free list */
+
+STATIC void
+S_del_xpvlv(pTHX_ XPVLV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvlv_root;
+ PL_xpvlv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVLV extends Perl5PVGV dynpmc group Perl5_group {
1.6 +49 -3 ponie/src/pmc/perl5pvmg.pmc
Index: perl5pvmg.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvmg.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvmg.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvmg.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVMG() (void*)new_xpvmg()
-#define del_XPVMG(p) del_xpvmg((XPVMG *)p)
+#define new_XPVMG() (void*)S_new_xpvmg()
+#define del_XPVMG(p) S_del_xpvmg((XPVMG *)p)
+
+/* allocate another arena's worth of struct xpvmg */
+
+STATIC void
+S_more_xpvmg(pTHX)
+{
+ register XPVMG* xpvmg;
+ register XPVMG* xpvmgend;
+ New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
+ xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
+ PL_xpvmg_arenaroot = xpvmg;
+
+ xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
+ PL_xpvmg_root = ++xpvmg;
+ while (xpvmg < xpvmgend) {
+ xpvmg->xpv_pv = (char*)(xpvmg + 1);
+ xpvmg++;
+ }
+ xpvmg->xpv_pv = 0;
+}
+
+/* grab a new struct xpvmg from the free list, allocating more if necessary */
+
+STATIC XPVMG*
+S_new_xpvmg(pTHX)
+{
+ XPVMG* xpvmg;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvmg_root)
+ S_more_xpvmg();
+ xpvmg = PL_xpvmg_root;
+ PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvmg;
+}
+
+/* return a struct xpvmg to the free list */
+
+STATIC void
+S_del_xpvmg(pTHX_ XPVMG *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvmg_root;
+ PL_xpvmg_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVMG extends Perl5PVNV dynpmc group Perl5_group {
1.6 +49 -3 ponie/src/pmc/perl5pvnv.pmc
Index: perl5pvnv.pmc
===================================================================
RCS file: /cvs/public/ponie/src/pmc/perl5pvnv.pmc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- perl5pvnv.pmc 30 Apr 2005 17:35:36 -0000 1.5
+++ perl5pvnv.pmc 30 Apr 2005 22:00:13 -0000 1.6
@@ -12,8 +12,54 @@
#include "ponie.h"
-#define new_XPVNV() (void*)new_xpvnv()
-#define del_XPVNV(p) del_xpvnv((XPVNV *)p)
+#define new_XPVNV() (void*)S_new_xpvnv()
+#define del_XPVNV(p) S_del_xpvnv((XPVNV *)p)
+
+/* allocate another arena's worth of struct xpvnv */
+
+STATIC void
+S_more_xpvnv(pTHX)
+{
+ register XPVNV* xpvnv;
+ register XPVNV* xpvnvend;
+ New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
+ xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
+ PL_xpvnv_arenaroot = xpvnv;
+
+ xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
+ PL_xpvnv_root = ++xpvnv;
+ while (xpvnv < xpvnvend) {
+ xpvnv->xpv_pv = (char*)(xpvnv + 1);
+ xpvnv++;
+ }
+ xpvnv->xpv_pv = 0;
+}
+
+/* grab a new struct xpvnv from the free list, allocating more if necessary */
+
+STATIC XPVNV*
+S_new_xpvnv(pTHX)
+{
+ XPVNV* xpvnv;
+ LOCK_SV_MUTEX;
+ if (!PL_xpvnv_root)
+ S_more_xpvnv();
+ xpvnv = PL_xpvnv_root;
+ PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
+ UNLOCK_SV_MUTEX;
+ return xpvnv;
+}
+
+/* return a struct xpvnv to the free list */
+
+STATIC void
+S_del_xpvnv(pTHX_ XPVNV *p)
+{
+ LOCK_SV_MUTEX;
+ p->xpv_pv = (char*)PL_xpvnv_root;
+ PL_xpvnv_root = p;
+ UNLOCK_SV_MUTEX;
+}
pmclass Perl5PVNV extends Perl5PVIV extends Perl5NV dynpmc group Perl5_group {
void set_pointer_keyed_int(INTVAL key, void *value) {