<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
Can you by chance see the other threads? I suspect not -- user threads I presume.<br>Can you try sprinking a lot more Disable/EnableSwitching around?<br>I guess you tried that..and..?<br><br> - Jay<br><br><br>> From: hosking@cs.purdue.edu<br>> Date: Fri, 15 Apr 2011 11:26:15 -0400<br>> To: mika@async.caltech.edu<br>> CC: m3devel@elegosoft.com<br>> Subject: Re: [M3devel] malloc/free from Modula-3?<br>> <br>> I suspect the problem is re-entrance to the library. Should you be disabling user thread switching somewhere?<br>> <br>> Antony Hosking | Associate Professor | Computer Science | Purdue University<br>> 305 N. University Street | West Lafayette | IN 47907 | USA<br>> Office +1 765 494 6001 | Mobile +1 765 427 5484<br>> <br>> <br>> <br>> <br>> On Apr 15, 2011, at 6:37 AM, Mika Nystrom wrote:<br>> <br>> > Hi m3devel,<br>> > <br>> > I'm debugging a problem with some code I have that calls out to C<br>> > code.  It's calling pqlib (PostgreSQL library) and you might expect<br>> > things to go wrong there, but as it turns out it's dying in CM3's code.<br>> > <br>> > The system is AMD64_LINUX (user threading because of the problems with<br>> > pthreads) and the program is just freezing up hard.  No segfault,<br>> > bus error or anything.  It locks up a couple of times a day.<br>> > <br>> > What are the rules on calling malloc/free from Modula-3?<br>> > <br>> > Stack trace:<br>> > <br>> > (gdb) where<br>> > #0  0x00002ac519a9202e in ?? () from /lib/libc.so.6<br>> > #1  0x00002ac519a2fb43 in ?? () from /lib/libc.so.6<br>> > #2  0x00002ac519a2caab in free () from /lib/libc.so.6<br>> > #3  0x000000000091462f in Cstdlib__free (a=Cannot access memory at address 0x2ac73b0ef0d8<br>> > ) at ../src/C/Common/CstdlibC.c:26<br>> > #4  0x000000000091477d in M3toC__FreeCopiedS (s=Cannot access memory at address 0x2ac73b0ef0f8<br>> > ) at ../src/C/Common/M3toC.m3:46<br>> > #5  0x00000000007884f0 in UnsafeDatabase_M3_LINE_230.1181 (L_2=Cannot access memory at address 0x2ac73b0ef118<br>> > ) at ../src/UnsafeDatabase.m3:230<br>> > #6  0x000000000078881f in UnsafeDatabase__ExecM (t=Cannot access memory at address 0x2ac73b0ef148<br>> > ) at ../src/UnsafeDatabase.m3:228<br>> > #7  0x0000000000788aa6 in UnsafeDatabase__TExecM (t=Cannot access memory at address 0x2ac73b0ef268<br>> > ) at ../src/UnsafeDatabase.m3:258<br>> > #8  0x000000000077ad5b in DesynchronizedDB__SExec (t=Cannot access memory at address 0x2ac73b0ef328<br>> > ) at ../src/DesynchronizedDB.m3:126<br>> > #9  0x000000000077c190 in DesynchronizedDB__SMExec (t=Cannot access memory at address 0x2ac73b0ef3e8<br>> > ) at ../src/DesynchronizedDB.m3:293<br>> > #10 0x0000000000569367 in GCOMSOrderManager__OrderEntered (t=Cannot access memory at address 0x2ac73b0ef5a8<br>> > ) at ../src/GCOMSOrderManager.m3:596<br>> > #11 0x0000000000566b95 in GCOMSOrderManager__PlaceSingleOrder (t=Cannot access memory at address 0x2ac73b0ef668<br>> > ) at ../src/GCOMSOrderManager.m3:310<br>> > #12 0x000000000041ba25 in EuroDriver__OApply__PlaceOrder.1253 (price={<No data fields>}, count=Cannot access memory at address 0x2ac73b0ef7b8<br>> > ) at ../src/EuroDriver.m3:1108<br>> > #13 0x000000000041d97c in EuroDriver__OApply__MainLoop.1289 () at ../src/EuroDriver.m3:1401<br>> > #14 0x00000000004197a1 in EuroDriver__OApply (cl=Cannot access memory at address 0x2ac73b0efd38<br>> > ) at ../src/EuroDriver.m3:1545<br>> > #15 0x00000000009112c1 in ThreadPosix__RunThread () at ../src/thread/POSIX/ThreadPosix.m3:1174<br>> > #16 0x00002ac5199fa7b0 in ?? () from /lib/libc.so.6<br>> > #17 0x0000000000000000 in ?? ()<br>> > (gdb) <br>> > <br>> > Here is the code that causes the problem:<br>> > <br>> >    VAR<br>> >      s := CopyTtoS(query);<br>> >    BEGIN<br>> >      TRY<br>> >        t.res := t.myExec(s,busyWait)<br>> >      FINALLY<br>> >        FreeCopiedS(s) (* stuck here *)<br>> >      END<br>> >    END;<br>> > <br>> > The query is a SQL query---t.myExec eventually calls the libpq SQL exec<br>> > routine (PQexec I think it's called).<br>> > <br>> > Since this is already an unsafe module I suppose I could just make an<br>> > array of CHARs on the stack and pass a pointer to that...<br>> > <br>> > <br>> >   Regards,<br>> >     Mika<br>> <br>                                    </body>
</html>