isaki68k / nono-issue

1 stars 0 forks source link

Initのレースコンディション? #87

Closed isaki68k closed 3 years ago

isaki68k commented 3 years ago

LUNA88Kを起動すると即死したが再現はしない。たぶんLUNA-Iも同様。

% wx/nono -c 88k
Segmentation fault (core dumped)
(gdb) bt
#0  0x00000000004c9539 in MK48T02Device::Store (this=0x7a0e7e858b40, cal=...)
    at mk48t02.cpp:283
#1  0x0000000000441f8d in Scheduler::RunRTC (this=0x7a0e7e42c000)
    at scheduler.cpp:618
#2  Scheduler::RunOff (this=this@entry=0x7a0e7e42c000) at scheduler.cpp:292
#3  0x00000000004429bc in Scheduler::ThreadRun (this=0x7a0e7e42c000)
    at scheduler.cpp:217
#4  0x00000000004429dc in scheduler_run (arg=<optimized out>)
    at scheduler.cpp:201
#5  0x00007a0e7a00c072 in ?? () from /usr/lib/libpthread.so.1
#6  0x00007a0e7a887b70 in ?? () from /usr/lib/libc.so.12
Backtrace stopped: Cannot access memory at address 0x7a0e69000000
(gdb) print mem
$1 = (uint8 *) 0x0

VM::Init()Scheduler::Init() を呼び、スレッドを作成して Scheduler::ThreadRun() -> Scheduler::RunOff() -> Scheduler::RunRTC() -> RTCDevice::ClockIn() -> MK48T02Device::Tick1Hz() -> MK48T02Device::Store() で mem[] に書き込むが、 VM::Init() がそのループでその後 MK48T02Device::Init() を呼び、ここで mem を用意してるのが間に合わなかった? たぶん Init() からスレッド作成を分離したほうがいい。

isaki68k commented 3 years ago

2021-10-28 頃に修正。