I don't have any other ideas. If the thread object cannot move (if it is frozen early on), then there is no problem. If it can move, then it seems like the solution is to have the run-time think the thread is in Eiffel code (via EIF_EXIT_C) whenever the thread can try to access `thread_object'. However, it seems to me that after each EIF_EXIT_C call, you must call RTGC or equivalent. Otherwise, a GC could be in progress in another thread and then there is a race condition where `thread_object' is evaluated, then the thread object is moved by the thread doing the GC cycle and `thread_object' is updated, then the thread executing `eif_thr_wait' evaluates the rest of the expression *(EIF_BOOLEAN *) (thread_object + offset) == EIF_FALSE and incorrectly uses the old location.