diff --git a/mps/code/global.c b/mps/code/global.c
index fa2eb684c5b..9fd8d7aeed8 100644
--- a/mps/code/global.c
+++ b/mps/code/global.c
@@ -1,7 +1,7 @@
/* global.c: ARENA-GLOBAL INTERFACES
*
* $Id$
- * Copyright (c) 2001-2014 Ravenbrook Limited. See end of file for license.
+ * Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license.
* Portions copyright (C) 2002 Global Graphics Software.
*
* .sources: See . design.mps.thread-safety is relevant
@@ -188,7 +188,8 @@ Bool GlobalsCheck(Globals arenaGlobals)
CHECKL(RingCheck(&arenaRing));
CHECKL(BoolCheck(arena->emergency));
- /* There can only be an emergency when a trace is busy. */
+ /* .emergency.invariant: There can only be an emergency when a trace
+ * is busy. */
CHECKL(!arena->emergency || arena->busyTraces != TraceSetEMPTY);
if (arenaGlobals->defaultChain != NULL)
@@ -1066,7 +1067,7 @@ Bool ArenaEmergency(Arena arena)
/* C. COPYRIGHT AND LICENSE
*
- * Copyright (C) 2001-2014 Ravenbrook Limited .
+ * Copyright (C) 2001-2016 Ravenbrook Limited .
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*
diff --git a/mps/code/trace.c b/mps/code/trace.c
index 2672799dd38..02c04e4b841 100644
--- a/mps/code/trace.c
+++ b/mps/code/trace.c
@@ -846,12 +846,14 @@ void TraceDestroyFinished(Trace trace)
EVENT1(TraceDestroy, trace);
+ /* Hopefully the trace reclaimed some memory, so clear any emergency.
+ * Do this before removing the trace from busyTraces, to avoid
+ * violating . */
+ ArenaSetEmergency(trace->arena, FALSE);
+
trace->sig = SigInvalid;
trace->arena->busyTraces = TraceSetDel(trace->arena->busyTraces, trace);
trace->arena->flippedTraces = TraceSetDel(trace->arena->flippedTraces, trace);
-
- /* Hopefully the trace reclaimed some memory, so clear any emergency. */
- ArenaSetEmergency(trace->arena, FALSE);
}