summaryrefslogtreecommitdiff
path: root/sv.c
diff options
context:
space:
mode:
authorMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-10-03 15:17:39 +0000
committerMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-10-03 15:17:39 +0000
commitfba3b22e783d72569126ff6fe76f3cb6cd1f043b (patch)
treea06e4145c0f1a902cb2070e0aaa8729cebfe5b6e /sv.c
parentc23142e2edb5ee317dcd6cd29300b6f2196357db (diff)
downloadperl-fba3b22e783d72569126ff6fe76f3cb6cd1f043b.tar.gz
Fixed sv_mutex locking for new_SV, del_SV and nice_chunks.
p4raw-id: //depot/perl@103
Diffstat (limited to 'sv.c')
-rw-r--r--sv.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/sv.c b/sv.c
index bdc3c71ed5..e4214c6b8d 100644
--- a/sv.c
+++ b/sv.c
@@ -65,14 +65,18 @@ typedef void (*SVFUNC) _((SV*));
#define new_SV(p) \
do { \
+ MUTEX_LOCK(&sv_mutex); \
(p) = (SV*)safemalloc(sizeof(SV)); \
reg_add(p); \
+ MUTEX_UNLOCK(&sv_mutex); \
} while (0)
#define del_SV(p) \
do { \
+ MUTEX_LOCK(&sv_mutex); \
reg_remove(p); \
free((char*)(p)); \
+ MUTEX_UNLOCK(&sv_mutex); \
} while (0)
static SV **registry;
@@ -171,28 +175,33 @@ U32 flags;
--sv_count; \
} while (0)
+/* sv_mutex must be held while calling uproot_SV() */
#define uproot_SV(p) \
do { \
- MUTEX_LOCK(&sv_mutex); \
(p) = sv_root; \
sv_root = (SV*)SvANY(p); \
++sv_count; \
- MUTEX_UNLOCK(&sv_mutex); \
} while (0)
-#define new_SV(p) \
- if (sv_root) \
- uproot_SV(p); \
- else \
- (p) = more_sv()
+#define new_SV(p) do { \
+ MUTEX_LOCK(&sv_mutex); \
+ if (sv_root) \
+ uproot_SV(p); \
+ else \
+ (p) = more_sv(); \
+ MUTEX_UNLOCK(&sv_mutex); \
+ } while (0)
#ifdef DEBUGGING
-#define del_SV(p) \
- if (debug & 32768) \
- del_sv(p); \
- else \
- plant_SV(p)
+#define del_SV(p) do { \
+ MUTEX_LOCK(&sv_mutex); \
+ if (debug & 32768) \
+ del_sv(p); \
+ else \
+ plant_SV(p); \
+ MUTEX_UNLOCK(&sv_mutex); \
+ } while (0)
static void
del_sv(p)
@@ -253,6 +262,7 @@ U32 flags;
SvFLAGS(sv) = SVTYPEMASK;
}
+/* sv_mutex must be held while calling more_sv() */
static SV*
more_sv()
{