--- nono/vm/virtio_net.cpp 2026/04/29 17:05:42 1.1.1.5 +++ nono/vm/virtio_net.cpp 2026/04/29 17:05:50 1.1.1.7 @@ -12,6 +12,7 @@ #include "virtio_def.h" #include "config.h" #include "ethernet.h" +#include "event.h" #include "macaddr.h" #include "memorystream.h" #include "monitor.h" @@ -63,7 +64,7 @@ VirtIONetDevice::~VirtIONetDevice() { // EthernetDevice と同じ…。 if ((bool)hostnet) { - hostnet->SetRxCallback(NULL); + hostnet->ResetRxCallback(); } } @@ -77,14 +78,15 @@ VirtIONetDevice::Create() // EthernetDevice とほぼ同じ…。 try { - hostnet.reset(new HostNetDevice(this, 0)); + hostnet.reset(new HostNetDevice(this, 0, "VirtIO Network")); } catch (...) { } if ((bool)hostnet == false) { warnx("Failed to initialize HostNetDevice at %s", __method__); return false; } - hostnet->SetRxCallback(ToDeviceCallback(&VirtIONetDevice::HostRxCallback)); + auto func = ToDeviceCallback(&VirtIONetDevice::HostRxCallback); + hostnet->SetRxCallback(func, 0); return true; } @@ -118,10 +120,10 @@ VirtIONetDevice::Init() scheduler->ConnectMessage(MessageID::HOSTNET_RX(0), this, ToMessageCallback(&VirtIONetDevice::RxMessage)); - // time は都度設定する - event.func = ToEventCallback(&VirtIONetDevice::RxEvent); - event.SetName("VirtIONet RX"); - scheduler->RegistEvent(event); + auto evman = GetEventManager(); + event = evman->Regist(this, + ToEventCallback(&VirtIONetDevice::RxEvent), + "VirtIONet RX"); return true; } @@ -209,7 +211,7 @@ VirtIONetDevice::ProcessDesc(VirtIOReq& // これは Host スレッドから呼ばれる void -VirtIONetDevice::HostRxCallback() +VirtIONetDevice::HostRxCallback(uint32 dummy) { // スレッドを超えるためにメッセージを投げる scheduler->SendMessage(MessageID::HOSTNET_RX(0)); @@ -228,15 +230,15 @@ VirtIONetDevice::RxMessage(MessageID msg // 受信イベントが止まっていれば動かす。 // 受信イベントがすでに動いていれば、1パケット受信完了後に // ホストキューを確認するので、ここでは何もしなくてよい。 - if (event.IsRunning() == false) { - event.time = 0; + if (event->IsRunning() == false) { + event->time = 0; scheduler->StartEvent(event); } } // 受信ループイベント。 void -VirtIONetDevice::RxEvent(Event& ev) +VirtIONetDevice::RxEvent(Event *ev) { VirtQueue *q = &vqueues[0]; @@ -247,8 +249,8 @@ VirtIONetDevice::RxEvent(Event& ev) // 空きディスクリプタがなければ、空くまでポーリングで待ち続ける。 uint16 avail_idx = ReadLE16(q->driver + 2); if (q->last_avail_idx == avail_idx) { - event.time = 500_usec; - putlog(2, "%s: wait %u usec", __func__, (uint)(event.time / 1_usec)); + event->time = 500_usec; + putlog(2, "%s: wait %u usec", __func__, (uint)(event->time / 1_usec)); scheduler->RestartEvent(event); return; } @@ -268,7 +270,7 @@ VirtIONetDevice::RxEvent(Event& ev) Rx(q); rx_packet.Clear(); - event.time = 500_usec; + event->time = 500_usec; scheduler->RestartEvent(event); }