# New Ticket Created by Nicholas Clark
# Please include the string: [perl #31806]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=31806 >
---
osname= freebsd
osvers= 5.2-beta
arch= i386-freebsd
cc= cc
---
Flags:
category=core
severity=high
ack=no
---
This started out as me trying to build parrot on FreeBSD, and finding it fails
tests due to a double free() warning not matching "expected" results.
(Also fails on OS X as its malloc() has automatic double free() warnings)
So I had a dig (valgrind on FreeBSD++), and it turns out that it's this line:
mem_sys_free(pio_registered_layers);
in PIO_finish.
gdb traceback:
Starting program: /home/nick/Parrot/parrot04/parrot t/op/interp_1.pasm
calling
In 2
ending
Breakpoint 1, PIO_finish (interpreter=0x8553c00) at io/io.c:325
325 for (layer = interpreter->piodata->default_stack; layer; ) {
(gdb) where
#0 PIO_finish (interpreter=0x8553c00) at io/io.c:325
#1 0x0809993b in Parrot_really_destroy (exit_code=0, vinterp=0x8553c00)
at src/inter_create.c:333
#2 0x080e0e4a in Parrot_exit (status=0) at src/exit.c:79
#3 0x0809949e in main (argc=1, argv=0xbfbfec08) at imcc/main.c:587
#4 0x08098112 in _start ()
(gdb) c
Continuing.
Breakpoint 1, PIO_finish (interpreter=0x82ee400) at io/io.c:325
325 for (layer = interpreter->piodata->default_stack; layer; ) {
(gdb) where
#0 PIO_finish (interpreter=0x82ee400) at io/io.c:325
#1 0x0809993b in Parrot_really_destroy (exit_code=0, vinterp=0x82ee400)
at src/inter_create.c:333
#2 0x080e0e4a in Parrot_exit (status=0) at src/exit.c:79
#3 0x0809949e in main (argc=1, argv=0xbfbfec08) at imcc/main.c:587
#4 0x08098112 in _start ()
(gdb) c
Continuing.
parrot in free(): warning: chunk is already free
It's being called from the same place, but for 2 different interpreters.
At first I was just going to patch it with:
pio_registered_layers = NULL;
after the free(), but than I thought "This is a bug, because I guess we
want to free it with the *last* interpreter, not the first".
But then I thought
AWOOGA! AWOOGA! GLOBAL VARIABLE. NOT IN AN INTERPRETER STRUCTURE.
And I'm not sure what the correct fix is. But it sure ain't threadsafe
currently.
Nicholas Clark
---
Summary of my parrot 0.1.0 configuration:
configdate='Sat Oct 2 10:23:19 2004'
Platform:
osname=freebsd, archname=i386-freebsd
jitcapable=1, jitarchname=i386-freebsd,
jitosname=FREEBSD, jitcpuarch=i386
execcapable=1
perl=/usr/bin/perl
Compiler:
cc='cc', ccflags='-DAPPLLIB_EXP="/usr/local/lib/perl5/5.6.1/BSDPAN"
-I/usr/local/include',
Linker and Libraries:
ld='cc', ldflags='-Wl,-E -L/usr/local/lib',
cc_ldflags='',
libs='-lm -lcrypt -lutil -lc_r -lgmp'
Dynamic Linking:
so='.so', ld_shared='-shared -L/usr/local/lib',
ld_shared_flags=''
Types:
iv=long, intvalsize=4, intsize=4, opcode_t=long, opcode_t_size=4,
ptrsize=4, ptr_alignment=1 byteorder=1234,
nv=double, numvalsize=8, doublesize=8
---
Environment:
HOME LANG LANGUAGE LD_LIBRARY_PATH LOGDIR PATH SHELL