--- nono/vm/mpscc.cpp 2026/04/29 17:05:38 1.1.1.8 +++ nono/vm/mpscc.cpp 2026/04/29 17:05:46 1.1.1.10 @@ -75,19 +75,23 @@ MPSCCDevice::MPSCCDevice() MPSCCDevice::~MPSCCDevice() { if ((bool)hostcom) { - hostcom->SetRxCallback(NULL); + hostcom->ResetRxCallback(); } } bool MPSCCDevice::Create() { - // 対応するホストドライバを作成 - hostcom.reset(new HostCOMDevice(this, "HostCOM")); + // 対応するホストドライバを作成。 + // ポート名は継承先ごとに Init() で設定している。 + try { + hostcom.reset(new HostCOMDevice(this, 0, "")); + } catch (...) { } if ((bool)hostcom == false) { + warnx("Failed to initialize HostCOMDevice at %s", __method__); return false; } - hostcom->SetRxCallback(ToDeviceCallback(&MPSCCDevice::HostRxCallback)); + hostcom->SetRxCallback(ToDeviceCallback(&MPSCCDevice::HostRxCallback), 0); return true; } @@ -97,8 +101,9 @@ MPSCCDevice::SetLogLevel(int loglevel_) { inherited::SetLogLevel(loglevel_); - assert((bool)hostcom); - hostcom->SetLogLevel(loglevel_); + if ((bool)hostcom) { + hostcom->SetLogLevel(loglevel_); + } } // 初期化 @@ -107,7 +112,7 @@ MPSCCDevice::Init() { interrupt = GetInterruptDevice(); - scheduler->ConnectMessage(MessageID::HOSTCOM_RX, this, + scheduler->ConnectMessage(MessageID::HOSTCOM0_RX, this, ToMessageCallback(&MPSCCDevice::RxMessage)); for (int ch = 0; ch < mpscc.chan.size(); ch++) { @@ -674,7 +679,7 @@ MPSCCDevice::TxCallback(Event& ev) // ホストスレッドからの受信通知 // (HostCOM スレッドで呼ばれる) void -MPSCCDevice::HostRxCallback() +MPSCCDevice::HostRxCallback(uint32 dummy) { // XXX 暫定 // HostCom からメッセージが大量に送られると、スケジューラの @@ -688,7 +693,7 @@ MPSCCDevice::HostRxCallback() if (ev.IsRunning() == false) { // スレッドを超えるためにメッセージを投げる - scheduler->SendMessage(MessageID::HOSTCOM_RX); + scheduler->SendMessage(MessageID::HOSTCOM0_RX); } }