# New Ticket Created by Allison Randal # Please include the string: [perl #48357] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=48357 >
-------- Original Message -------- Subject: Re: Platform testing for concurrency scheduler runloop Date: Fri, 7 Dec 2007 15:38:10 -0500 (EST) From: Andy Dougherty <[EMAIL PROTECTED]> To: Allison Randal <[EMAIL PROTECTED]> CC: p2 <[EMAIL PROTECTED]> References: <[EMAIL PROTECTED]> On Solaris 8/SPARC, the only regression is in src/vtables.t $ perl5.10 -Ilib t/src/vtables.t 1..4 ok 1 - Parrot_new_vtable ok 2 - Parrot_clone_vtable not ok 3 - Parrot_destroy_vtable # TODO vtable not NULL after destroy # Failed (TODO) test (t/src/vtables.t at line 100) # got: 'ok # not ok # ' # expected: 'ok # ok # ' # './t/src/vtables_3' failed with exit code 0 not ok 4 - parrot_alloc_vtables # Failed test (t/src/vtables.t at line 142) # Exited with error code: [SIGNAL 139] # Received: # # Expected: # ok # ok # ok # # Looks like you failed 1 test of 4. Under the debugger, here's what I see $ dbx vtables_4 (dbx) run Running: vtables_4 (process id 3750) ok ok ok [EMAIL PROTECTED] ([EMAIL PROTECTED]) signal SEGV (no mapping at the fault address) in pmc_new at line 70 in file "pmc.c" 70 PMC *const classobj = interp->vtables[base_type]->pmc_class; (dbx) where current thread: [EMAIL PROTECTED] =>[1] pmc_new(interp = 0x485318, base_type = 79), line 70 in "pmc.c" [2] Parrot_cx_runloop_end(interp = 0x485318), line 232 in "scheduler.c" [3] Parrot_really_destroy(interp = 0x485318, exit_code_unused = 0, arg_unused = (nil)), line 380 in "inter_create.c" [4] Parrot_exit(interp = 0x485318, status = 0), line 94 in "exit.c" [5] main(argc = 1, argv = 0xffbefa8c), line 33 in "vtables_4.c" (dbx) print *interp *interp = { ctx = { state = 0x486580 bp = { regs_n = 0x4866e0 regs_i = 0x4866e0 } bp_ps = { regs_p = 0x4867e0 regs_s = 0x4867e0 } } ctx_mem = { free_list = 0x486430 n_free_slots = 81 } arena_base = 0x487078 class_hash = 0x4eb110 vtables = 0x67e0a0 n_vtable_max = 81 n_vtable_alloced = 100 [ etc. ] } (dbx) print *interp->vtables *interp->vtables = (nil) The problem may well be in the vtables_4.c test file and not in pmc_new: #include <parrot/parrot.h> #include <parrot/embed.h> #include <parrot/vtables.h> int main(int argc, char* argv[]) { Interp *interp; VTABLE *vtable; interp = Parrot_new(NULL); if (!interp) { return 1; } parrot_alloc_vtables(interp); [ . . . ] In parrot_alloc_vtables, space is allocated for the vtables, but it is all zeroed. It doesn't point anywhere useful. Thus when Parrot_cx_runloop_end() calls pmc_new(), and it does: PMC *const classobj = interp->vtables[base_type]->pmc_class; things go boom. Whether this is a defect in the vtables_4 test sourcefile for failing to initialize the vtables, or whether pmc_new ought to be more defensive, I can't say. -- Andy Dougherty [EMAIL PROTECTED]