summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2008-07-25 14:47:08 +0000
committerSimon Marlow <marlowsd@gmail.com>2008-07-25 14:47:08 +0000
commitfcc3794aeb78081c04103a0b7e7560cb8c7bea58 (patch)
treee5fd7bd2223d72ebfa6a877e046fd993b541f70b /rts
parent9bcd5a09b7b57de8b7d6780fa7a767ff72049a7a (diff)
downloadhaskell-fcc3794aeb78081c04103a0b7e7560cb8c7bea58.tar.gz
move an inline function to keep older versions of gcc happy
no idea why this only just showed up...
Diffstat (limited to 'rts')
-rw-r--r--rts/Makefile6
-rw-r--r--rts/sm/Evac.c138
2 files changed, 75 insertions, 69 deletions
diff --git a/rts/Makefile b/rts/Makefile
index 6fe606943e..8ca69efc4c 100644
--- a/rts/Makefile
+++ b/rts/Makefile
@@ -161,6 +161,12 @@ ifeq "$(UseLibFFIForAdjustors)" "YES"
SRC_CC_OPTS += -DUSE_LIBFFI_FOR_ADJUSTORS
endif
+ifeq "$(Windows)" "YES"
+# SDM: when compiled with -fasm the RTS currently has bogus references to
+# __imp_base_ things, so working around for now:
+SRC_HC_OPTS = -fvia-C
+endif
+
ifneq "$(DYNAMIC_RTS)" "YES"
SRC_HC_OPTS += -static
else
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
index 375cf81d11..ab2047036d 100644
--- a/rts/sm/Evac.c
+++ b/rts/sm/Evac.c
@@ -225,6 +225,75 @@ copy(StgClosure **p, const StgInfoTable *info,
copy_tag(p,info,src,size,stp,0);
}
+/* -----------------------------------------------------------------------------
+ Evacuate a large object
+
+ This just consists of removing the object from the (doubly-linked)
+ step->large_objects list, and linking it on to the (singly-linked)
+ step->new_large_objects list, from where it will be scavenged later.
+
+ Convention: bd->flags has BF_EVACUATED set for a large object
+ that has been evacuated, or unset otherwise.
+ -------------------------------------------------------------------------- */
+
+STATIC_INLINE void
+evacuate_large(StgPtr p)
+{
+ bdescr *bd = Bdescr(p);
+ step *stp, *new_stp;
+ step_workspace *ws;
+
+ stp = bd->step;
+ ACQUIRE_SPIN_LOCK(&stp->sync_large_objects);
+
+ // object must be at the beginning of the block (or be a ByteArray)
+ ASSERT(get_itbl((StgClosure *)p)->type == ARR_WORDS ||
+ (((W_)p & BLOCK_MASK) == 0));
+
+ // already evacuated?
+ if (bd->flags & BF_EVACUATED) {
+ /* Don't forget to set the gct->failed_to_evac flag if we didn't get
+ * the desired destination (see comments in evacuate()).
+ */
+ if (stp < gct->evac_step) {
+ gct->failed_to_evac = rtsTrue;
+ TICK_GC_FAILED_PROMOTION();
+ }
+ RELEASE_SPIN_LOCK(&stp->sync_large_objects);
+ return;
+ }
+
+ // remove from large_object list
+ if (bd->u.back) {
+ bd->u.back->link = bd->link;
+ } else { // first object in the list
+ stp->large_objects = bd->link;
+ }
+ if (bd->link) {
+ bd->link->u.back = bd->u.back;
+ }
+
+ /* link it on to the evacuated large object list of the destination step
+ */
+ new_stp = stp->to;
+ if (new_stp < gct->evac_step) {
+ if (gct->eager_promotion) {
+ new_stp = gct->evac_step;
+ } else {
+ gct->failed_to_evac = rtsTrue;
+ }
+ }
+
+ ws = &gct->steps[new_stp->abs_no];
+ bd->flags |= BF_EVACUATED;
+ bd->step = new_stp;
+ bd->gen_no = new_stp->gen_no;
+ bd->link = ws->todo_large_objects;
+ ws->todo_large_objects = bd;
+
+ RELEASE_SPIN_LOCK(&stp->sync_large_objects);
+}
+
/* ----------------------------------------------------------------------------
Evacuate
@@ -672,75 +741,6 @@ loop:
}
/* -----------------------------------------------------------------------------
- Evacuate a large object
-
- This just consists of removing the object from the (doubly-linked)
- step->large_objects list, and linking it on to the (singly-linked)
- step->new_large_objects list, from where it will be scavenged later.
-
- Convention: bd->flags has BF_EVACUATED set for a large object
- that has been evacuated, or unset otherwise.
- -------------------------------------------------------------------------- */
-
-STATIC_INLINE void
-evacuate_large(StgPtr p)
-{
- bdescr *bd = Bdescr(p);
- step *stp, *new_stp;
- step_workspace *ws;
-
- stp = bd->step;
- ACQUIRE_SPIN_LOCK(&stp->sync_large_objects);
-
- // object must be at the beginning of the block (or be a ByteArray)
- ASSERT(get_itbl((StgClosure *)p)->type == ARR_WORDS ||
- (((W_)p & BLOCK_MASK) == 0));
-
- // already evacuated?
- if (bd->flags & BF_EVACUATED) {
- /* Don't forget to set the gct->failed_to_evac flag if we didn't get
- * the desired destination (see comments in evacuate()).
- */
- if (stp < gct->evac_step) {
- gct->failed_to_evac = rtsTrue;
- TICK_GC_FAILED_PROMOTION();
- }
- RELEASE_SPIN_LOCK(&stp->sync_large_objects);
- return;
- }
-
- // remove from large_object list
- if (bd->u.back) {
- bd->u.back->link = bd->link;
- } else { // first object in the list
- stp->large_objects = bd->link;
- }
- if (bd->link) {
- bd->link->u.back = bd->u.back;
- }
-
- /* link it on to the evacuated large object list of the destination step
- */
- new_stp = stp->to;
- if (new_stp < gct->evac_step) {
- if (gct->eager_promotion) {
- new_stp = gct->evac_step;
- } else {
- gct->failed_to_evac = rtsTrue;
- }
- }
-
- ws = &gct->steps[new_stp->abs_no];
- bd->flags |= BF_EVACUATED;
- bd->step = new_stp;
- bd->gen_no = new_stp->gen_no;
- bd->link = ws->todo_large_objects;
- ws->todo_large_objects = bd;
-
- RELEASE_SPIN_LOCK(&stp->sync_large_objects);
-}
-
-/* -----------------------------------------------------------------------------
Evaluate a THUNK_SELECTOR if possible.
p points to a THUNK_SELECTOR that we want to evaluate. The