From 2374f2fd94d438ae941d81bc92d0d10b1fc874dc Mon Sep 17 00:00:00 2001 From: sof Date: Mon, 4 Feb 2002 20:21:22 +0000 Subject: [PATCH] [project @ 2002-02-04 20:21:16 by sof] - sm_mutex is now a Mutex (not a pthread_mutex_t). - sm_mutex lock/unlocks are only done for SMP builds. --- ghc/rts/Storage.c | 29 +++++++++++++++++------------ ghc/rts/Storage.h | 31 ++++++++++++++++++------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/ghc/rts/Storage.c b/ghc/rts/Storage.c index 180e9c9..f1120b0 100644 --- a/ghc/rts/Storage.c +++ b/ghc/rts/Storage.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.c,v 1.58 2002/01/24 01:45:55 sof Exp $ + * $Id: Storage.c,v 1.59 2002/02/04 20:21:22 sof Exp $ * * (c) The GHC Team, 1998-1999 * @@ -21,6 +21,7 @@ #include "Storage.h" #include "Schedule.h" +#include "OSThreads.h" #include "StoragePriv.h" #include "RetainerProfile.h" // for counting memory blocks (memInventory) @@ -48,7 +49,7 @@ lnat total_allocated = 0; /* total memory allocated during run */ * simultaneous access by two STG threads. */ #ifdef SMP -pthread_mutex_t sm_mutex = PTHREAD_MUTEX_INITIALIZER; +Mutex sm_mutex = INIT_MUTEX_VAR; #endif /* @@ -80,6 +81,10 @@ initStorage( void ) initBlockAllocator(); +#if defined(SMP) + initCondition(&sm_mutex); +#endif + /* allocate generation info array */ generations = (generation *)stgMallocBytes(RtsFlags.GcFlags.generations * sizeof(struct _generation), @@ -190,8 +195,8 @@ initStorage( void ) /* Tell GNU multi-precision pkg about our custom alloc functions */ mp_set_memory_functions(stgAllocForGMP, stgReallocForGMP, stgDeallocForGMP); -#ifdef SMP - pthread_mutex_init(&sm_mutex, NULL); +#if defined(SMP) + initMutex(&sm_mutex); #endif IF_DEBUG(gc, statDescribeGens()); @@ -254,7 +259,7 @@ newCAF(StgClosure* caf) * come to do a major GC we won't need the mut_link field * any more and can use it as a STATIC_LINK. */ - ACQUIRE_LOCK(&sm_mutex); + ACQUIRE_SM_LOCK; if (is_dynamically_loaded_rwdata_ptr((StgPtr)caf)) { ((StgIndStatic *)caf)->saved_info = (StgInfoTable *)caf->header.info; @@ -266,7 +271,7 @@ newCAF(StgClosure* caf) oldest_gen->mut_once_list = (StgMutClosure *)caf; } - RELEASE_LOCK(&sm_mutex); + RELEASE_SM_LOCK; #ifdef PAR /* If we are PAR or DIST then we never forget a CAF */ @@ -438,7 +443,7 @@ allocate( nat n ) bdescr *bd; StgPtr p; - ACQUIRE_LOCK(&sm_mutex); + ACQUIRE_SM_LOCK; TICK_ALLOC_HEAP_NOCTR(n); CCS_ALLOC(CCCS,n); @@ -459,7 +464,7 @@ allocate( nat n ) * much difference. */ alloc_blocks += req_blocks; - RELEASE_LOCK(&sm_mutex); + RELEASE_SM_LOCK; return bd->start; /* small allocation (= LARGE_OBJECT_THRESHOLD/sizeof(W_)) { - RELEASE_LOCK(&sm_mutex); + RELEASE_SM_LOCK; return allocate(n); } @@ -545,7 +550,7 @@ allocatePinned( nat n ) p = bd->free; bd->free += n; - RELEASE_LOCK(&sm_mutex); + RELEASE_SM_LOCK; return p; } diff --git a/ghc/rts/Storage.h b/ghc/rts/Storage.h index 27cefc0..1642749 100644 --- a/ghc/rts/Storage.h +++ b/ghc/rts/Storage.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.h,v 1.39 2002/02/01 10:50:35 simonmar Exp $ + * $Id: Storage.h,v 1.40 2002/02/04 20:21:16 sof Exp $ * * (c) The GHC Team, 1998-1999 * @@ -119,8 +119,13 @@ extern void GarbageCollect(void (*get_roots)(evac_fn),rtsBool force_major_gc); /* * Storage manager mutex */ -#ifdef SMP -extern pthread_mutex_t sm_mutex; +#if defined(SMP) +extern Mutex sm_mutex; +#define ACQUIRE_SM_LOCK ACQUIRE_LOCK(&sm_mutex) +#define RELEASE_SM_LOCK RELEASE_LOCK(&sm_mutex) +#else +#define ACQUIRE_SM_LOCK +#define RELEASE_SM_LOCK #endif /* ToDo: shouldn't recordMutable and recordOldToNewPtrs acquire some @@ -172,10 +177,10 @@ recordOldToNewPtrs(StgMutClosure *p) } else { \ ((StgIndOldGen *)p1)->indirectee = p2; \ if (info != &stg_BLACKHOLE_BQ_info) { \ - ACQUIRE_LOCK(&sm_mutex); \ + ACQUIRE_SM_LOCK; \ ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list; \ generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1; \ - RELEASE_LOCK(&sm_mutex); \ + RELEASE_SM_LOCK; \ } \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ TICK_UPD_OLD_IND(); \ @@ -206,10 +211,10 @@ recordOldToNewPtrs(StgMutClosure *p) } else { \ ((StgIndOldGen *)p1)->indirectee = p2; \ if (info != &stg_BLACKHOLE_BQ_info) { \ - ACQUIRE_LOCK(&sm_mutex); \ + ACQUIRE_SM_LOCK; \ ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list; \ generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1; \ - RELEASE_LOCK(&sm_mutex); \ + RELEASE_SM_LOCK; \ } \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ LDV_recordCreate((p1)); \ @@ -248,10 +253,10 @@ recordOldToNewPtrs(StgMutClosure *p) } \ } \ } \ - ACQUIRE_LOCK(&sm_mutex); \ + ACQUIRE_SM_LOCK; \ ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list; \ generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1; \ - RELEASE_LOCK(&sm_mutex); \ + RELEASE_SM_LOCK; \ } \ ((StgIndOldGen *)p1)->indirectee = p2; \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ @@ -267,10 +272,10 @@ recordOldToNewPtrs(StgMutClosure *p) ASSERT( p1 != p2 && !closure_IND(p1) ); \ ASSERT( ((StgMutClosure*)p1)->mut_link == NULL ); \ \ - ACQUIRE_LOCK(&sm_mutex); \ + ACQUIRE_SM_LOCK; \ ((StgMutClosure *)p1)->mut_link = oldest_gen->mut_once_list; \ oldest_gen->mut_once_list = (StgMutClosure *)p1; \ - RELEASE_LOCK(&sm_mutex); \ + RELEASE_SM_LOCK; \ \ ((StgInd *)p1)->indirectee = p2; \ SET_INFO((StgInd *)p1, &stg_IND_STATIC_info); \ @@ -304,10 +309,10 @@ updateWithPermIndirection(const StgInfoTable *info, StgClosure *p1, StgClosure * } else { ((StgIndOldGen *)p1)->indirectee = p2; if (info != &stg_BLACKHOLE_BQ_info) { - ACQUIRE_LOCK(&sm_mutex); + ACQUIRE_SM_LOCK; ((StgIndOldGen *)p1)->mut_link = generations[bd->gen_no].mut_once_list; generations[bd->gen_no].mut_once_list = (StgMutClosure *)p1; - RELEASE_LOCK(&sm_mutex); + RELEASE_SM_LOCK; } SET_INFO(p1,&stg_IND_OLDGEN_PERM_info); #ifdef PROFILING -- 1.7.10.4