--- nono/vm/virtio_net.cpp 2026/04/29 17:05:46 1.1.1.6 +++ 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" @@ -119,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; } @@ -229,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]; @@ -248,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; } @@ -269,7 +270,7 @@ VirtIONetDevice::RxEvent(Event& ev) Rx(q); rx_packet.Clear(); - event.time = 500_usec; + event->time = 500_usec; scheduler->RestartEvent(event); }