[M3devel] malloc/free from Modula-3?

Tony Hosking hosking at cs.purdue.edu
Fri Apr 15 17:26:15 CEST 2011


I suspect the problem is re-entrance to the library. Should you be disabling user thread switching somewhere?

Antony Hosking | Associate Professor | Computer Science | Purdue University
305 N. University Street | West Lafayette | IN 47907 | USA
Office +1 765 494 6001 | Mobile +1 765 427 5484




On Apr 15, 2011, at 6:37 AM, Mika Nystrom wrote:

> Hi m3devel,
> 
> I'm debugging a problem with some code I have that calls out to C
> code.  It's calling pqlib (PostgreSQL library) and you might expect
> things to go wrong there, but as it turns out it's dying in CM3's code.
> 
> The system is AMD64_LINUX (user threading because of the problems with
> pthreads) and the program is just freezing up hard.  No segfault,
> bus error or anything.  It locks up a couple of times a day.
> 
> What are the rules on calling malloc/free from Modula-3?
> 
> Stack trace:
> 
> (gdb) where
> #0  0x00002ac519a9202e in ?? () from /lib/libc.so.6
> #1  0x00002ac519a2fb43 in ?? () from /lib/libc.so.6
> #2  0x00002ac519a2caab in free () from /lib/libc.so.6
> #3  0x000000000091462f in Cstdlib__free (a=Cannot access memory at address 0x2ac73b0ef0d8
> ) at ../src/C/Common/CstdlibC.c:26
> #4  0x000000000091477d in M3toC__FreeCopiedS (s=Cannot access memory at address 0x2ac73b0ef0f8
> ) at ../src/C/Common/M3toC.m3:46
> #5  0x00000000007884f0 in UnsafeDatabase_M3_LINE_230.1181 (L_2=Cannot access memory at address 0x2ac73b0ef118
> ) at ../src/UnsafeDatabase.m3:230
> #6  0x000000000078881f in UnsafeDatabase__ExecM (t=Cannot access memory at address 0x2ac73b0ef148
> ) at ../src/UnsafeDatabase.m3:228
> #7  0x0000000000788aa6 in UnsafeDatabase__TExecM (t=Cannot access memory at address 0x2ac73b0ef268
> ) at ../src/UnsafeDatabase.m3:258
> #8  0x000000000077ad5b in DesynchronizedDB__SExec (t=Cannot access memory at address 0x2ac73b0ef328
> ) at ../src/DesynchronizedDB.m3:126
> #9  0x000000000077c190 in DesynchronizedDB__SMExec (t=Cannot access memory at address 0x2ac73b0ef3e8
> ) at ../src/DesynchronizedDB.m3:293
> #10 0x0000000000569367 in GCOMSOrderManager__OrderEntered (t=Cannot access memory at address 0x2ac73b0ef5a8
> ) at ../src/GCOMSOrderManager.m3:596
> #11 0x0000000000566b95 in GCOMSOrderManager__PlaceSingleOrder (t=Cannot access memory at address 0x2ac73b0ef668
> ) at ../src/GCOMSOrderManager.m3:310
> #12 0x000000000041ba25 in EuroDriver__OApply__PlaceOrder.1253 (price={<No data fields>}, count=Cannot access memory at address 0x2ac73b0ef7b8
> ) at ../src/EuroDriver.m3:1108
> #13 0x000000000041d97c in EuroDriver__OApply__MainLoop.1289 () at ../src/EuroDriver.m3:1401
> #14 0x00000000004197a1 in EuroDriver__OApply (cl=Cannot access memory at address 0x2ac73b0efd38
> ) at ../src/EuroDriver.m3:1545
> #15 0x00000000009112c1 in ThreadPosix__RunThread () at ../src/thread/POSIX/ThreadPosix.m3:1174
> #16 0x00002ac5199fa7b0 in ?? () from /lib/libc.so.6
> #17 0x0000000000000000 in ?? ()
> (gdb) 
> 
> Here is the code that causes the problem:
> 
>    VAR
>      s := CopyTtoS(query);
>    BEGIN
>      TRY
>        t.res := t.myExec(s,busyWait)
>      FINALLY
>        FreeCopiedS(s) (* stuck here *)
>      END
>    END;
> 
> The query is a SQL query---t.myExec eventually calls the libpq SQL exec
> routine (PQexec I think it's called).
> 
> Since this is already an unsafe module I suppose I could just make an
> array of CHARs on the stack and pass a pointer to that...
> 
> 
>   Regards,
>     Mika




More information about the M3devel mailing list