Annotation of nono/vm/scsidomain.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2025 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // SCSI ドメイン
                      9: //
                     10: 
                     11: #pragma once
                     12: 
                     13: #include "device.h"
                     14: #include <array>
                     15: 
                     16: class SCSIBus;
                     17: class SCSIDevice;
                     18: class SCSIHostDevice;
                     19: class SCSITarget;
                     20: 
                     21: //
                     22: // 一つの SCSI イニシエータとそのターゲットデバイス一式の管理構造。
                     23: // 設定周りとインスタンスの所有。
                     24: // バスは含まない (VirtIO SCSI だとバスという構造が存在しないため)。
                     25: //
                     26: class SCSIDomain : public Device
                     27: {
                     28:        using inherited = Device;
                     29: 
                     30:  public:
                     31:        // このドメインで扱うデバイス数。
                     32:        static constexpr size_t MaxDevices = 8;
                     33: 
                     34:  public:
                     35:        SCSIDomain(IODevice *parent_, const char *config_name_);
                     36:        ~SCSIDomain() override;
                     37: 
                     38:        bool Create() override;
                     39:        bool Init() override;
                     40: 
                     41:        // 設定ファイル上のこのホストデバイスを示す接頭語を返す
                     42:        const char *GetConfigName() const noexcept { return config_name; }
                     43: 
                     44:        // イニシエータを返す。ないことはないはず。
                     45:        SCSIHostDevice *GetInitiator() const noexcept { return initiator.get(); }
                     46: 
                     47:        // すべてのターゲットをバスに参加させる。
                     48:        void AttachTargets(SCSIBus *bus_);
                     49: 
                     50:        // イニシエータに ID を付与してバスに参加させる。
                     51:        bool AttachInitiator(SCSIBus *bus_, uint id);
                     52: 
                     53:        // 指定 id のターゲットデバイスを返す。なければ NULL を返す。
                     54:        SCSITarget *GetTarget(uint id) const noexcept { return target[id].get(); }
                     55: 
                     56:        // デバイス (イニシエータ+ターゲット) 配列のコピーを返す。
                     57:        void GetDevices(std::array<SCSIDevice *, MaxDevices> *dst) const {
                     58:                *dst = device;
                     59:        }
                     60: 
                     61:        // 指定 id のデバイスを返す。なければ NULL を返す。
                     62:        SCSIDevice *GetDevice(uint id) const { return device[id]; }
                     63: 
                     64:        // (イニシエータを除く) デバイス数を返す。
                     65:        uint GetTargetCount() const;
                     66: 
                     67:        // (イニシエータがあれば含む) すべてのデバイスのリストを返す。
                     68:        const std::vector<SCSIDevice*>& GetConnectedDevices() const noexcept {
                     69:                return connected_devices;
                     70:        }
                     71: 
                     72:  private:
                     73:        DECLARE_MONITOR_CALLBACK(MonitorUpdate);
                     74: 
                     75:        // device[] と connected_devices を更新する。
                     76:        bool RefreshDevices();
                     77: 
                     78:        // 設定ファイルに使われるこのホストデバイスを示す接頭語。
                     79:        // ("spc0" とか)
                     80:        const char *config_name {};
                     81: 
                     82:        // SCSI イニシエータ (所有)
                     83:        std::unique_ptr<SCSIHostDevice> initiator /*{}*/;
                     84: 
                     85:        // SCSI ターゲット (所有)。イニシエータは含まない。
                     86:        std::array<std::unique_ptr<SCSITarget>, MaxDevices> target /*{}*/;
                     87: 
                     88:        // SCSI デバイス (イニシエータ+ターゲット) のポインタ。
                     89:        std::array<SCSIDevice *, MaxDevices> device {};
                     90: 
                     91:        // 接続中のデバイス(イニシエータ含む)を ID 順に詰めたリスト。
                     92:        std::vector<SCSIDevice*> connected_devices {};
                     93: 
                     94:        IODevice *parent {};
                     95: 
                     96:        Monitor *monitor {};
                     97: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.