[M3devel] A RT failure in ThreadPThread.Alert]

Rodney M. Bates rodney.bates at wichita.edu
Fri Sep 21 18:57:59 CEST 2007




I got a runtime failure in ThreadPThread.Alert, on this line:

----------------------------------------------------------------------------------
PROCEDURE Alert (t: T) =
   BEGIN
     WITH r = Upthread.mutex_lock(cm) DO <*ASSERT r=0*> END;
     t.alerted := TRUE;
--> WITH r = Upthread.cond_signal(t.waitCond^) DO <*ASSERT r=0*> END;
     WITH r = Upthread.mutex_unlock(cm) DO <*ASSERT r=0*> END;
   END Alert;
------------------------------------------------------------------------------------
Here, t.waitCond is NIL and being dereferenced.  I tried just making this
silently tolerate NIL t.waitCond, and it made the immediate symptom go away,
with no other immediately apparent problems.  But this seems not very likely
to be right.  For one thing, there are several other places that assume
waitCond is non-NIL.  And, a quick reading revealed only one place that creates
this object, which always allocates waitCond, no places that change it, and
T is opaque and revealed only in this module.  How could this happen?


Here is a bit of debugger output: The display of t is at the bottom.
------------------------------------------------------------------------------------


***
*** runtime error:
***    Attempt to reference an illegal memory location.
***    file "../src/thread/PTHREAD/ThreadPThread.m3", line 304
***

------------------ EXCEPTION HANDLER STACK ---------------------
0xb5eb71dc TRY-EXCEPT  {0xa893a19c}
0xb5eb72bc LOCK  mutex = 0xb436e0e4
0xb5eb731c LOCK  mutex = 0xb6ebbc44
----------------------------------------------------------------
[Switching to Thread -1242858592 (LWP 8289)]

Breakpoint 2, 0x08126a38 in InnerRuntimeFailureDialog () at AssertDevel.m3:272
272     ; PROCEDURE InnerRuntimeFailureDialog ( )
(m3gdb) bt
#0  0x08126a38 in InnerRuntimeFailureDialog () at AssertDevel.m3:272
#1  0x08126c89 in RuntimeFailureDialog () at AssertDevel.m3:314
#2  0xb72e596f in InvokeExitors () at RTProcess.m3:40
#3  0xb72e59e3 in Crash (msg=NIL) at RTProcess.m3:61
#4  0xb72e3648 in EndError (crash=TRUE) at RTError.m3:115
#5  0xb72e3389 in MsgS (file=16_b731de58, line=304, msgA=16_b7318068, msgB=16_b73126d4,
     msgC=16_b7318068) at RTError.m3:40
#6  0xb72e3a46 in Crash (a=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END, raises=FALSE,
     rte=16_b73124c0) at RTException.m3:79
#7  0xb72e3770 in DefaultBackstop (a=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END, raises=FALSE)
     at RTException.m3:39
#8  0xb72e36d4 in InvokeBackstop (a=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END, raises=FALSE)
     at RTException.m3:25
#9  0xb72f3397 in Raise (act=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END) at RTExFrame.m3:29
#10 0xb72e3810 in DefaultBackstop (a=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END, raises=FALSE)
     at RTException.m3:47
#11 0xb72e36d4 in InvokeBackstop (a=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END, raises=FALSE)
     at RTException.m3:25
#12 0xb72f3397 in Raise (act=
     RECORD exception = 16_b73124c0; arg = 16_0000000c; module = 16_b731e020; line = 304; pc = NIL;
info0 = NIL; info1 = NIL; un_except = 16_b73124c0; un_arg = 16_00000004;  END) at RTExFrame.m3:29
#13 0xb72cb223 in ReportFault (module=16_b731e020, info=9732) at RTHooks.m3:110
#14 0xb72fb697 in _m3_fault (arg=9732) from /usr/local/cm3/pkg/m3core/LINUXLIBC6/libm3core.so.5
#15 0xb72f5cd7 in Alert (t=16_b3a9bdc8) at ThreadPThread.m3:304
#16 0xb7df741d in DisplayDir (v=16_b436e004) at FileBrowserVBT.m3:496
#17 0xb7df4d83 in Refresh (v=16_b436e004) at FileBrowserVBT.m3:210
#18 0xb7df5413 in Watcher (cl=16_b6ebbc9c) at FileBrowserVBT.m3:254
#19 0xb72f76f5 in RunThread (me=16_08e1c518) at ThreadPThread.m3:538
#20 0xb72f7403 in ThreadBase (param=16_08e1c518) at ThreadPThread.m3:519
#21 0xb707c540 in start_thread () from /lib/i686/libpthread.so.0
#22 0xb6fef55e in clone () from /lib/i686/libc.so.6
(m3gdb) frame 5
#5  0xb72e3389 in MsgS (file=16_b731de58, line=304, msgA=16_b7318068, msgB=16_b73126d4,
     msgC=16_b7318068) at RTError.m3:40
40      RTError.m3: No such file or directory.
         in RTError.m3
(m3gdb) p msgA
$1 = (*16_b7318068*) ""
(m3gdb) p msgB
$2 = (*16_b73126d4*) "Attempt to reference an illegal memory location."
(m3gdb) p msgC
$3 = (*16_b7318068*) ""
(m3gdb) frame 15
#15 0xb72f5cd7 in Alert (t=16_b3a9bdc8) at ThreadPThread.m3:304
304     ThreadPThread.m3: No such file or directory.
         in ThreadPThread.m3
(m3gdb) p t
$4 = (*16_b3a9bdc8*) OBJECT act = 16_08e94678; closure = NIL; result = NIL; cond = 16_b3a9bdf4;
     waitingOn = NIL; nextWaiter = NIL; waitCond = NIL; alerted = TRUE; completed = TRUE;
     joined = FALSE; id = 73;  END
(m3gdb)
--
-------------------------------------------------------------
Rodney M. Bates, retired assistant professor
Dept. of Computer Science, Wichita State University
Wichita, KS 67260-0083
316-978-3922
rodney.bates at wichita.edu





More information about the M3devel mailing list