Annotation of nono/vm/scsidomain.h, revision 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.