X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FRaiseAsync.c;h=21bc78ec753f59764bfd9ddae363b1d88e16a5f8;hp=ee53e0d0a641af0b80d47bac5f3444cdbb06965e;hb=65bb9b5ae78ee29100ea6bf5617b0fdbc0a100bd;hpb=9b0be04d7d23a4ccce0275f3a7c519d9b614f3a2 diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index ee53e0d..21bc78e 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -944,21 +944,12 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, // printObj((StgClosure *)ap); // ); - // Replace the updatee with an indirection - // - // Warning: if we're in a loop, more than one update frame on - // the stack may point to the same object. Be careful not to - // overwrite an IND_OLDGEN in this case, because we'll screw - // up the mutable lists. To be on the safe side, don't - // overwrite any kind of indirection at all. See also - // threadSqueezeStack in GC.c, where we have to make a similar - // check. - // - if (!closure_IND(((StgUpdateFrame *)frame)->updatee)) { - // revert the black hole - UPD_IND_NOLOCK(((StgUpdateFrame *)frame)->updatee, - (StgClosure *)ap); - } + // Perform the update + // TODO: this may waste some work, if the thunk has + // already been updated by another thread. + UPD_IND_NOLOCK(((StgUpdateFrame *)frame)->updatee, + (StgClosure *)ap); + sp += sizeofW(StgUpdateFrame) - 1; sp[0] = (W_)ap; // push onto stack frame = sp + 1;