From 11e6c813799ef5254cd56206ddedf4ce978e4517 Mon Sep 17 00:00:00 2001 From: wfjm Date: Sat, 15 Dec 2018 14:49:34 +0100 Subject: [PATCH] add HasPort/HasVirt(); Port() and Virt() return reference --- doc/CHANGELOG.md | 2 + tools/src/librlink/RlinkConnect.cpp | 37 ++++++------ tools/src/librlink/RlinkConnect.hpp | 7 ++- tools/src/librlink/RlinkConnect.ipp | 23 +++++++- tools/src/librlink/RlinkPacketBufRcv.cpp | 11 ++-- tools/src/librlink/RlinkPacketBufRcv.hpp | 7 ++- tools/src/librlink/RlinkPacketBufSnd.cpp | 23 ++++---- tools/src/librlink/RlinkPacketBufSnd.hpp | 21 +++---- tools/src/librlink/RlinkServer.cpp | 4 +- tools/src/librlinktpp/RtclRlinkConnect.cpp | 15 +++-- tools/src/librlinktpp/RtclRlinkPort.cpp | 48 ++++++++-------- tools/src/librlinktpp/RtclRlinkPort.hpp | 11 ++-- tools/src/librw11/Rw11CntlDEUNA.cpp | 13 +++-- tools/src/librw11/Rw11CntlLP11.cpp | 4 +- tools/src/librw11/Rw11CntlPC11.cpp | 5 +- tools/src/librw11/Rw11CntlRHRP.cpp | 7 ++- tools/src/librw11/Rw11CntlRK11.cpp | 7 ++- tools/src/librw11/Rw11CntlRL11.cpp | 7 ++- tools/src/librw11/Rw11CntlTM11.cpp | 27 ++++----- tools/src/librw11/Rw11UnitDEUNA.cpp | 5 +- tools/src/librw11/Rw11UnitDisk.cpp | 11 ++-- tools/src/librw11/Rw11UnitDiskBase.ipp | 5 +- tools/src/librw11/Rw11UnitRHRP.cpp | 7 ++- tools/src/librw11/Rw11UnitRL11.cpp | 7 ++- tools/src/librw11/Rw11UnitStream.cpp | 27 ++++----- tools/src/librw11/Rw11UnitStream.hpp | 7 ++- tools/src/librw11/Rw11UnitTape.cpp | 67 +++++++++++----------- tools/src/librw11/Rw11UnitTape.ipp | 9 +-- tools/src/librw11/Rw11UnitTapeBase.ipp | 7 ++- tools/src/librw11/Rw11UnitTerm.cpp | 13 +++-- tools/src/librw11/Rw11UnitVirt.hpp | 7 ++- tools/src/librw11/Rw11UnitVirt.ipp | 25 +++++++- tools/src/librwxxtpp/RtclRw11UnitBase.ipp | 11 ++-- 33 files changed, 281 insertions(+), 206 deletions(-) diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index 0f87decf..639f0717 100644 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -105,6 +105,8 @@ The full set of tests is only run for tagged releases. - replace boost with std - use std::unique_ptr instead of boost::scoped_ptr - use std::shared_ptr instead of boost + - reduce usage of pointers in APIs + - add HasPort/HasVirt(); Port() and Virt() return reference - rw11/shell.tcl: add workaround for tclreadline and `after` interference ### Bug Fixes diff --git a/tools/src/librlink/RlinkConnect.cpp b/tools/src/librlink/RlinkConnect.cpp index 0b7c7e83..233d9d8f 100644 --- a/tools/src/librlink/RlinkConnect.cpp +++ b/tools/src/librlink/RlinkConnect.cpp @@ -1,4 +1,4 @@ -// $Id: RlinkConnect.cpp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: RlinkConnect.cpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2011-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 2.8 add HasPort(); return ref for Port() // 2018-12-01 1076 2.7 use unique_ptr instead of scoped_ptr // 2018-11-30 1075 2.6.4 use list-init; use range loop // 2018-10-27 1059 2.6.3 coverity fixup (uncaught exception in dtor) @@ -176,19 +177,19 @@ bool RlinkConnect::Open(const std::string& name, RerrMsg& emsg) Close(); fupPort = move(RlinkPortFactory::Open(name, emsg)); - if (!fupPort) return false; + if (!HasPort()) return false; - fSndPkt.SetXonEscape(fupPort->XonEnable()); // transfer XON enable + fSndPkt.SetXonEscape(Port().XonEnable()); // transfer XON enable - fupPort->SetLogFile(fspLog); - fupPort->SetTraceLevel(fTraceLevel); + Port().SetLogFile(fspLog); + Port().SetTraceLevel(fTraceLevel); fLinkInitDone = false; fRbufSize = 2048; // use minimum (2kB) as startup fSysId = 0xffffffff; fUsrAcc = 0x00000000; - if (! fupPort->Url().FindOpt("noinit")) { + if (! Port().Url().FindOpt("noinit")) { if (!LinkInit(emsg)) { Close(); return false; @@ -203,13 +204,13 @@ bool RlinkConnect::Open(const std::string& name, RerrMsg& emsg) void RlinkConnect::Close() { - if (!fupPort) return; + if (!HasPort()) return; if (fpServ) fpServ->Stop(); // stop server in case still running - if (fupPort->Url().FindOpt("keep")) { + if (Port().Url().FindOpt("keep")) { RerrMsg emsg; - fSndPkt.SndKeep(fupPort.get(), emsg); + fSndPkt.SndKeep(Port(), emsg); } fupPort.reset(); @@ -513,7 +514,7 @@ int RlinkConnect::WaitAttn(const Rtime& timeout, Rtime& twait, Rtime tbeg = tnow; while (tnow < tend) { - int irc = fRcvPkt.ReadData(fupPort.get(), tend-tnow, emsg); + int irc = fRcvPkt.ReadData(Port(), tend-tnow, emsg); if (irc == RlinkPort::kTout) return -1; if (irc == RlinkPort::kErr) return -2; tnow.GetClock(CLOCK_MONOTONIC); @@ -547,7 +548,7 @@ bool RlinkConnect::SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg) { boost::lock_guard lock(*this); fStats.Inc(kStatNSndOob); - return fSndPkt.SndOob(fupPort.get(), addr, data, emsg); + return fSndPkt.SndOob(Port(), addr, data, emsg); } //------------------------------------------+----------------------------------- @@ -556,7 +557,7 @@ bool RlinkConnect::SndOob(uint16_t addr, uint16_t data, RerrMsg& emsg) bool RlinkConnect::SndAttn(RerrMsg& emsg) { boost::lock_guard lock(*this); - return fSndPkt.SndAttn(fupPort.get(), emsg); + return fSndPkt.SndAttn(Port(), emsg); } //------------------------------------------+----------------------------------- @@ -619,7 +620,7 @@ void RlinkConnect::SetDumpLevel(uint32_t lvl) void RlinkConnect::SetTraceLevel(uint32_t lvl) { fTraceLevel = lvl; - if (fupPort) fupPort->SetTraceLevel(lvl); + if (HasPort()) Port().SetTraceLevel(lvl); return; } @@ -687,8 +688,8 @@ void RlinkConnect::Dump(std::ostream& os, int ind, const char* text, RosFill bl(ind); os << bl << (text?text:"--") << "RlinkConnect @ " << this << endl; - if (fupPort) { - fupPort->Dump(os, ind+2, "fupPort: ", detail); + if (HasPort()) { + Port().Dump(os, ind+2, "fupPort: ", detail); } else { os << bl << " fupPort: " << fupPort.get() << endl; } @@ -740,7 +741,7 @@ void RlinkConnect::HandleUnsolicitedData() boost::lock_guard lock(*this); RerrMsg emsg; - int irc = fRcvPkt.ReadData(fupPort.get(), Rtime(), emsg); + int irc = fRcvPkt.ReadData(Port(), Rtime(), emsg); if (irc == 0) return; if (irc < 0) { RlogMsg lmsg(*fspLog, 'E'); @@ -766,7 +767,7 @@ bool RlinkConnect::ExecPart(RlinkCommandList& clist, size_t ibeg, size_t iend, EncodeRequest(clist, ibeg, iend); // FIXME_code: handle send fail properly; - if (!fSndPkt.SndPacket(fupPort.get(), emsg)) return false; + if (!fSndPkt.SndPacket(Port(), emsg)) return false; // FIXME_code: handle recoveries // FIXME_code: use proper value for timeout (rest time for Exec ?) @@ -1084,7 +1085,7 @@ bool RlinkConnect::ReadResponse(const Rtime& timeout, RerrMsg& emsg) Rtime tend = tnow + timeout; while (tnow < tend) { - int irc = fRcvPkt.ReadData(fupPort.get(), tend-tnow, emsg); + int irc = fRcvPkt.ReadData(Port(), tend-tnow, emsg); if (irc <= 0) { RlogMsg lmsg(*fspLog, 'E'); lmsg << "ReadResponse: IO error or timeout: " << emsg; diff --git a/tools/src/librlink/RlinkConnect.hpp b/tools/src/librlink/RlinkConnect.hpp index 4b2251a9..17512de4 100644 --- a/tools/src/librlink/RlinkConnect.hpp +++ b/tools/src/librlink/RlinkConnect.hpp @@ -1,4 +1,4 @@ -// $Id: RlinkConnect.hpp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: RlinkConnect.hpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2011-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 2.8 add HasPort(); return ref for Port() // 2018-12-07 1078 2.7.1 use std::shared_ptr instead of boost // 2018-12-01 1076 2.7 use unique_ptr instead of scoped_ptr // 2017-04-22 883 2.6.3 add rbus monitor probe, add HasRbmon() @@ -87,7 +88,9 @@ namespace Retro { bool Open(const std::string& name, RerrMsg& emsg); void Close(); bool IsOpen() const; - RlinkPort* Port() const; + bool HasPort() const; + RlinkPort& Port(); + const RlinkPort& Port() const; bool LinkInit(RerrMsg& emsg); bool LinkInitDone() const; diff --git a/tools/src/librlink/RlinkConnect.ipp b/tools/src/librlink/RlinkConnect.ipp index e7e30ac2..c5f2b027 100644 --- a/tools/src/librlink/RlinkConnect.ipp +++ b/tools/src/librlink/RlinkConnect.ipp @@ -1,4 +1,4 @@ -// $Id: RlinkConnect.ipp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: RlinkConnect.ipp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2011-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 2.7 add HasPort; return ref for Port() // 2018-12-07 1078 2.6.1 use std::shared_ptr instead of boost // 2018-12-01 1076 2.6 use unique_ptr instead of scoped_ptr // 2017-04-22 883 2.5.2 add rbus monitor probe, add HasRbmon() @@ -50,9 +51,25 @@ inline bool RlinkConnect::IsOpen() const //------------------------------------------+----------------------------------- //! FIXME_docs -inline RlinkPort* RlinkConnect::Port() const +inline bool RlinkConnect::HasPort() const { - return fupPort.get(); + return bool(fupPort); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +inline RlinkPort& RlinkConnect::Port() +{ + return *fupPort; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +inline const RlinkPort& RlinkConnect::Port() const +{ + return *fupPort; } //------------------------------------------+----------------------------------- diff --git a/tools/src/librlink/RlinkPacketBufRcv.cpp b/tools/src/librlink/RlinkPacketBufRcv.cpp index 6b14aaa1..37c8447a 100644 --- a/tools/src/librlink/RlinkPacketBufRcv.cpp +++ b/tools/src/librlink/RlinkPacketBufRcv.cpp @@ -1,6 +1,6 @@ -// $Id: RlinkPacketBufRcv.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: RlinkPacketBufRcv.cpp 1079 2018-12-09 10:56:59Z mueller $ // -// Copyright 2014-2017 by Walter F.J. Mueller +// Copyright 2014-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.2 use ref not ptr for RlinkPort // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2017-02-19 853 1.1 use Rtime // 2014-12-25 621 1.0.1 Reorganize packet send/revd stats @@ -76,10 +77,10 @@ RlinkPacketBufRcv::~RlinkPacketBufRcv() //------------------------------------------+----------------------------------- //! FIXME_docs -int RlinkPacketBufRcv::ReadData(RlinkPort* port, const Rtime& timeout, +int RlinkPacketBufRcv::ReadData(RlinkPort& port, const Rtime& timeout, RerrMsg& emsg) { - if (port == nullptr) + if (&port==nullptr || !port.IsOpen()) throw Rexception("RlinkPacketBufRcv::ReadData()", "Bad state: port not open"); if (fRawBufDone != fRawBufSize) @@ -89,7 +90,7 @@ int RlinkPacketBufRcv::ReadData(RlinkPort* port, const Rtime& timeout, fRawBufDone = 0; fRawBufSize = 0; - int irc = port->Read(fRawBuf, sizeof(fRawBuf), timeout, emsg); + int irc = port.Read(fRawBuf, sizeof(fRawBuf), timeout, emsg); if (timeout.IsZero() && irc == RlinkPort::kTout) return 0; diff --git a/tools/src/librlink/RlinkPacketBufRcv.hpp b/tools/src/librlink/RlinkPacketBufRcv.hpp index 90bc9437..31eab0a4 100644 --- a/tools/src/librlink/RlinkPacketBufRcv.hpp +++ b/tools/src/librlink/RlinkPacketBufRcv.hpp @@ -1,6 +1,6 @@ -// $Id: RlinkPacketBufRcv.hpp 1052 2018-09-30 08:10:52Z mueller $ +// $Id: RlinkPacketBufRcv.hpp 1079 2018-12-09 10:56:59Z mueller $ // -// Copyright 2014-2017 by Walter F.J. Mueller +// Copyright 2014-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.2 use ref not ptr for RlinkPort // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2017-02-19 853 1.1 use Rtime // 2014-12-25 621 1.0.1 Reorganize packet send/revd stats @@ -40,7 +41,7 @@ namespace Retro { RlinkPacketBufRcv(); ~RlinkPacketBufRcv(); - int ReadData(RlinkPort* port, const Rtime& timeout, + int ReadData(RlinkPort& port, const Rtime& timeout, RerrMsg& emsg); bool ProcessData(); void AcceptPacket(); diff --git a/tools/src/librlink/RlinkPacketBufSnd.cpp b/tools/src/librlink/RlinkPacketBufSnd.cpp index cb38783b..be0b5ec1 100644 --- a/tools/src/librlink/RlinkPacketBufSnd.cpp +++ b/tools/src/librlink/RlinkPacketBufSnd.cpp @@ -1,6 +1,6 @@ -// $Id: RlinkPacketBufSnd.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: RlinkPacketBufSnd.cpp 1079 2018-12-09 10:56:59Z mueller $ // -// Copyright 2014-2017 by Walter F.J. Mueller +// Copyright 2014-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.2 use ref not ptr for RlinkPort // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2015-04-11 666 1.1 handle xon/xoff escaping, add (Set)XonEscape() // 2014-12-25 621 1.0.1 Reorganize packet send/revd stats @@ -89,7 +90,7 @@ void RlinkPacketBufSnd::PutWithCrc(const uint16_t* pdata, size_t count) //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndPacket(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndPacket(RlinkPort& port, RerrMsg& emsg) { size_t nesc = 0; size_t nxesc = 0; @@ -138,7 +139,7 @@ bool RlinkPacketBufSnd::SndPacket(RlinkPort* port, RerrMsg& emsg) //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndOob(RlinkPort* port, uint16_t addr, uint16_t data, +bool RlinkPacketBufSnd::SndOob(RlinkPort& port, uint16_t addr, uint16_t data, RerrMsg& emsg) { Init(); @@ -161,7 +162,7 @@ bool RlinkPacketBufSnd::SndOob(RlinkPort* port, uint16_t addr, uint16_t data, //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndKeep(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndKeep(RlinkPort& port, RerrMsg& emsg) { Init(); @@ -175,7 +176,7 @@ bool RlinkPacketBufSnd::SndKeep(RlinkPort* port, RerrMsg& emsg) //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndAttn(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndAttn(RlinkPort& port, RerrMsg& emsg) { Init(); @@ -187,7 +188,7 @@ bool RlinkPacketBufSnd::SndAttn(RlinkPort* port, RerrMsg& emsg) //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndNak(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndNak(RlinkPort& port, RerrMsg& emsg) { Init(); @@ -199,7 +200,7 @@ bool RlinkPacketBufSnd::SndNak(RlinkPort* port, RerrMsg& emsg) //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndUnJam(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndUnJam(RlinkPort& port, RerrMsg& emsg) { Init(); @@ -236,13 +237,13 @@ void RlinkPacketBufSnd::Dump(std::ostream& os, int ind, const char* text, //------------------------------------------+----------------------------------- //! FIXME_docs -bool RlinkPacketBufSnd::SndRaw(RlinkPort* port, RerrMsg& emsg) +bool RlinkPacketBufSnd::SndRaw(RlinkPort& port, RerrMsg& emsg) { - if (port==0 || !port->IsOpen()) + if (&port==nullptr || !port.IsOpen()) throw Rexception("RlinkPacketBufSnd::SndRaw()", "Bad state: port not open"); size_t rawbufsize = fRawBuf.size(); - int irc = port->Write(fRawBuf.data(), rawbufsize, emsg); + int irc = port.Write(fRawBuf.data(), rawbufsize, emsg); if (irc < 0) return false; if ((size_t)irc != rawbufsize) { emsg.Init("RlinkPacketBufSnd::SndRaw()", "failed to write all data"); diff --git a/tools/src/librlink/RlinkPacketBufSnd.hpp b/tools/src/librlink/RlinkPacketBufSnd.hpp index 8a6b43dd..7411ed43 100644 --- a/tools/src/librlink/RlinkPacketBufSnd.hpp +++ b/tools/src/librlink/RlinkPacketBufSnd.hpp @@ -1,6 +1,6 @@ -// $Id: RlinkPacketBufSnd.hpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: RlinkPacketBufSnd.hpp 1079 2018-12-09 10:56:59Z mueller $ // -// Copyright 2014-2017 by Walter F.J. Mueller +// Copyright 2014-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.2 use ref not ptr for RlinkPort // 2017-04-07 868 1.1.2 Dump(): add detail arg // 2015-04-11 666 1.1 handle xon/xoff escaping, add (Set)XonEscape() // 2014-12-25 621 1.0.1 Reorganize packet send/revd stats @@ -38,7 +39,7 @@ namespace Retro { public: RlinkPacketBufSnd(); - ~RlinkPacketBufSnd(); + ~RlinkPacketBufSnd(); void SetXonEscape(bool xon); bool XonEscape() const; @@ -52,13 +53,13 @@ namespace Retro { void PutRawEsc(uint8_t ec); - bool SndPacket(RlinkPort* port, RerrMsg& emsg); - bool SndOob(RlinkPort* port, uint16_t addr, uint16_t data, + bool SndPacket(RlinkPort& port, RerrMsg& emsg); + bool SndOob(RlinkPort& port, uint16_t addr, uint16_t data, RerrMsg& emsg); - bool SndKeep(RlinkPort* port, RerrMsg& emsg); - bool SndAttn(RlinkPort* port, RerrMsg& emsg); - bool SndNak(RlinkPort* port, RerrMsg& emsg); - bool SndUnJam(RlinkPort* port, RerrMsg& emsg); + bool SndKeep(RlinkPort& port, RerrMsg& emsg); + bool SndAttn(RlinkPort& port, RerrMsg& emsg); + bool SndNak(RlinkPort& port, RerrMsg& emsg); + bool SndUnJam(RlinkPort& port, RerrMsg& emsg); size_t RawSize() const; @@ -73,7 +74,7 @@ namespace Retro { }; protected: - bool SndRaw(RlinkPort* port, RerrMsg& emsg); + bool SndRaw(RlinkPort& port, RerrMsg& emsg); protected: bool fXonEscape; //!< escape XON/XOFF diff --git a/tools/src/librlink/RlinkServer.cpp b/tools/src/librlink/RlinkServer.cpp index 097b4e1e..d582ceaa 100644 --- a/tools/src/librlink/RlinkServer.cpp +++ b/tools/src/librlink/RlinkServer.cpp @@ -1,4 +1,4 @@ -// $Id: RlinkServer.cpp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: RlinkServer.cpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -413,7 +413,7 @@ void RlinkServer::StartOrResume(bool resume) Exec(clist); // setup poll handler for Rlink traffic - int rlinkfd = fspConn->Port()->FdRead(); + int rlinkfd = fspConn->Port().FdRead(); if (!fELoop.TestPollHandler(rlinkfd, POLLIN)) fELoop.AddPollHandler(boost::bind(&RlinkServer::RlinkHandler, this, _1), rlinkfd, POLLIN); diff --git a/tools/src/librlinktpp/RtclRlinkConnect.cpp b/tools/src/librlinktpp/RtclRlinkConnect.cpp index 543b089f..97599699 100644 --- a/tools/src/librlinktpp/RtclRlinkConnect.cpp +++ b/tools/src/librlinktpp/RtclRlinkConnect.cpp @@ -1,4 +1,4 @@ -// $Id: RtclRlinkConnect.cpp 1077 2018-12-07 19:37:03Z mueller $ +// $Id: RtclRlinkConnect.cpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2011-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.6.4 use HasPort(); Port() returns now ref // 2018-12-07 1077 1.6.3 use SetLastExpectBlock move semantics // 2018-11-16 1070 1.6.2 use auto; use range loop // 2018-09-16 1047 1.6.1 coverity fixup (uninitialized scalar) @@ -197,7 +198,7 @@ int RtclRlinkConnect::M_open(RtclArgs& args) if (args.NOptMiss() == 0) { // open path if (!Obj().Open(path, emsg)) return args.Quit(emsg); } else { // open - string name = Obj().IsOpen() ? Obj().Port()->Url().Url() : string(); + string name = Obj().IsOpen() ? Obj().Port().Url().Url() : string(); args.SetResult(name); } return kOK; @@ -684,6 +685,8 @@ int RtclRlinkConnect::M_oob(RtclArgs& args) int RtclRlinkConnect::M_rawread(RtclArgs& args) { + if (!(Obj().HasPort() && + Obj().Port().IsOpen())) return args.Quit("-E: port not open"); return RtclRlinkPort::DoRawRead(args, Obj().Port()); } @@ -692,6 +695,8 @@ int RtclRlinkConnect::M_rawread(RtclArgs& args) int RtclRlinkConnect::M_rawrblk(RtclArgs& args) { + if (!(Obj().HasPort() && + Obj().Port().IsOpen())) return args.Quit("-E: port not open"); size_t errcnt = 0; int rc = RtclRlinkPort::DoRawRblk(args, Obj().Port(), errcnt); Obj().Context().IncErrorCount(errcnt); @@ -703,6 +708,8 @@ int RtclRlinkConnect::M_rawrblk(RtclArgs& args) int RtclRlinkConnect::M_rawwblk(RtclArgs& args) { + if (!(Obj().HasPort() && + Obj().Port().IsOpen())) return args.Quit("-E: port not open"); return RtclRlinkPort::DoRawWblk(args, Obj().Port()); } @@ -716,8 +723,8 @@ int RtclRlinkConnect::M_stats(RtclArgs& args) if (!RtclStats::Collect(args, cntx, Obj().Stats())) return kERR; if (!RtclStats::Collect(args, cntx, Obj().SndStats())) return kERR; if (!RtclStats::Collect(args, cntx, Obj().RcvStats())) return kERR; - if (Obj().Port()) { - if (!RtclStats::Collect(args, cntx, Obj().Port()->Stats())) return kERR; + if (Obj().HasPort()) { + if (!RtclStats::Collect(args, cntx, Obj().Port().Stats())) return kERR; } return kOK; } diff --git a/tools/src/librlinktpp/RtclRlinkPort.cpp b/tools/src/librlinktpp/RtclRlinkPort.cpp index c0288729..484234ac 100644 --- a/tools/src/librlinktpp/RtclRlinkPort.cpp +++ b/tools/src/librlinktpp/RtclRlinkPort.cpp @@ -1,4 +1,4 @@ -// $Id: RtclRlinkPort.cpp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: RtclRlinkPort.cpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.4 use ref not ptr for RlinkPort // 2018-12-01 1076 1.3 use unique_ptr // 2017-04-29 888 1.2 LogFileName(): returns now const std::string& // drop M_rawio; add M_rawread,M_rawrblk,M_rawwblk @@ -64,7 +65,9 @@ RtclRlinkPort::RtclRlinkPort(Tcl_Interp* interp, const char* name) fupObj(), fspLog(new RlogFile(&cout)), fTraceLevel(0), - fErrCnt(0) + fErrCnt(0), + fGets(), + fSets() { CreateObjectCmd(interp, name); AddMeth("open", boost::bind(&RtclRlinkPort::M_open, this, _1)); @@ -119,7 +122,7 @@ int RtclRlinkPort::M_open(RtclArgs& args) int RtclRlinkPort::M_close(RtclArgs& args) { if (!args.AllDone()) return kERR; - if (!TestOpen(args)) return kERR; + if (!TestPort(args, false)) return kERR; fupObj.reset(); SetupGetSet(); return kOK; @@ -150,7 +153,8 @@ int RtclRlinkPort::M_errcnt(RtclArgs& args) int RtclRlinkPort::M_rawread(RtclArgs& args) { - return DoRawRead(args, fupObj.get()); + if (!TestPort(args)) return kERR; + return DoRawRead(args, *fupObj); } //------------------------------------------+----------------------------------- @@ -158,7 +162,8 @@ int RtclRlinkPort::M_rawread(RtclArgs& args) int RtclRlinkPort::M_rawrblk(RtclArgs& args) { - return DoRawRblk(args, fupObj.get(), fErrCnt); + if (!TestPort(args)) return kERR; + return DoRawRblk(args, *fupObj, fErrCnt); } //------------------------------------------+----------------------------------- @@ -166,7 +171,8 @@ int RtclRlinkPort::M_rawrblk(RtclArgs& args) int RtclRlinkPort::M_rawwblk(RtclArgs& args) { - return DoRawWblk(args, fupObj.get()); + if (!TestPort(args)) return kERR; + return DoRawWblk(args, *fupObj); } //------------------------------------------+----------------------------------- @@ -176,7 +182,7 @@ int RtclRlinkPort::M_stats(RtclArgs& args) { RtclStats::Context cntx; - if (!TestOpen(args)) return kERR; + if (!TestPort(args, false)) return kERR; if (!RtclStats::GetArgs(args, cntx)) return kERR; if (!RtclStats::Collect(args, cntx, fupObj->Stats())) return kERR; return kOK; @@ -202,7 +208,7 @@ int RtclRlinkPort::M_dump(RtclArgs& args) int detail=0; if (!GetArgsDump(args, detail)) return kERR; if (!args.AllDone()) return kERR; - if (!TestOpen(args)) return kERR; + if (!TestPort(args, false)) return kERR; ostringstream sos; fupObj->Dump(sos, 0, "", 0); @@ -266,9 +272,9 @@ void RtclRlinkPort::SetupGetSet() //------------------------------------------+----------------------------------- //! FIXME_docs -bool RtclRlinkPort::TestOpen(RtclArgs& args) +bool RtclRlinkPort::TestPort(RtclArgs& args, bool testopen) { - if (fupObj) return true; + if (fupObj && (!testopen || fupObj->IsOpen())) return true; args.AppendResult("-E: port not open", nullptr); return false; } @@ -298,10 +304,8 @@ inline const std::string& RtclRlinkPort::LogFileName() const //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkPort::DoRawRead(RtclArgs& args, RlinkPort* pport) +int RtclRlinkPort::DoRawRead(RtclArgs& args, RlinkPort& port) { - if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); - int32_t rsize; string rvname; vector rdata; @@ -322,8 +326,8 @@ int RtclRlinkPort::DoRawRead(RtclArgs& args, RlinkPort* pport) Rtime tused; rdata.resize(rsize); - int irc = pport->RawRead(rdata.data(), rdata.size(), false, Rtime(timeout), - tused, emsg); + int irc = port.RawRead(rdata.data(), rdata.size(), false, Rtime(timeout), + tused, emsg); if (irc == RlinkPort::kEof) return args.Quit("-E: RawRead EOF"); if (irc == RlinkPort::kTout) return args.Quit("-E: RawRead timeout"); @@ -342,10 +346,8 @@ int RtclRlinkPort::DoRawRead(RtclArgs& args, RlinkPort* pport) //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkPort::DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt) +int RtclRlinkPort::DoRawRblk(RtclArgs& args, RlinkPort& port, size_t& errcnt) { - if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); - int32_t rsize; string rvname; vector rdata; @@ -371,8 +373,8 @@ int RtclRlinkPort::DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt) Rtime tused; rdata.resize(rsize); - int irc = pport->RawRead(rdata.data(), rdata.size(), true, Rtime(timeout), - tused, emsg); + int irc = port.RawRead(rdata.data(), rdata.size(), true, Rtime(timeout), + tused, emsg); if (irc == RlinkPort::kEof) return args.Quit("-E: RawRead EOF"); if (irc == RlinkPort::kTout) return args.Quit("-E: RawRead timeout"); if (irc < 0) return args.Quit(emsg); @@ -399,15 +401,13 @@ int RtclRlinkPort::DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt) //------------------------------------------+----------------------------------- //! FIXME_docs -int RtclRlinkPort::DoRawWblk(RtclArgs& args, RlinkPort* pport) +int RtclRlinkPort::DoRawWblk(RtclArgs& args, RlinkPort& port) { - if (!(pport && pport->IsOpen())) return args.Quit("-E: port not open"); - vector wdata; if (!args.GetArg("data", wdata, 1, 4096)) return kERR; RerrMsg emsg; - int irc = pport->RawWrite(wdata.data(), wdata.size(), emsg); + int irc = port.RawWrite(wdata.data(), wdata.size(), emsg); if (irc != (int)wdata.size()) return args.Quit(emsg); return kOK; diff --git a/tools/src/librlinktpp/RtclRlinkPort.hpp b/tools/src/librlinktpp/RtclRlinkPort.hpp index 93d6b9d4..dec04afd 100644 --- a/tools/src/librlinktpp/RtclRlinkPort.hpp +++ b/tools/src/librlinktpp/RtclRlinkPort.hpp @@ -1,4 +1,4 @@ -// $Id: RtclRlinkPort.hpp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: RtclRlinkPort.hpp 1079 2018-12-09 10:56:59Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-08 1079 1.3 use ref not ptr for RlinkPort // 2018-12-07 1078 1.2.1 use std::shared_ptr instead of boost // 2018-12-01 1076 1.2 use unique_ptr // 2017-04-29 888 1.1 LogFileName(): returns now const std::string& @@ -65,13 +66,13 @@ namespace Retro { int M_default(RtclArgs& args); void SetupGetSet(); - bool TestOpen(RtclArgs& args); + bool TestPort(RtclArgs& args, bool testopen=true); void SetLogFileName(const std::string& name); const std::string& LogFileName() const; - static int DoRawRead(RtclArgs& args, RlinkPort* pport); - static int DoRawRblk(RtclArgs& args, RlinkPort* pport, size_t& errcnt); - static int DoRawWblk(RtclArgs& args, RlinkPort* pport); + static int DoRawRead(RtclArgs& args, RlinkPort& port); + static int DoRawRblk(RtclArgs& args, RlinkPort& port, size_t& errcnt); + static int DoRawWblk(RtclArgs& args, RlinkPort& port); protected: RlinkPort::port_uptr_t fupObj; //!< uptr to managed port diff --git a/tools/src/librw11/Rw11CntlDEUNA.cpp b/tools/src/librw11/Rw11CntlDEUNA.cpp index 939117b1..95b1e3a0 100644 --- a/tools/src/librw11/Rw11CntlDEUNA.cpp +++ b/tools/src/librw11/Rw11CntlDEUNA.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlDEUNA.cpp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: Rw11CntlDEUNA.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2014-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 0.5.4 use HasVirt(); Virt() returns ref // 2018-12-08 1078 0.5.3 BUGFIX: Start(Tx|Rx)Ring, was broken in r1049 // when fixing -Wunused-variable warnings // 2018-11-30 1075 0.5.2 use list-init @@ -380,7 +381,7 @@ void Rw11CntlDEUNA::UnitSetup(size_t /*ind*/) void Rw11CntlDEUNA::SetType(const std::string& type) { - if (fPr1State != kSTATE_READY || fspUnit[0]->Virt()) + if (fPr1State != kSTATE_READY || fspUnit[0]->HasVirt()) throw Rexception("Rw11CntlDEUNA::SetType", string("Bad state: not in READY state or attached")); @@ -444,7 +445,7 @@ void Rw11CntlDEUNA::SetMacDefault(const std::string& mac) throw Rexception("Rw11CntlDEUNA::SetMacDefault", string("Bad args: mcast address given, lsb not 0")); if (fPr1State == kSTATE_READY && // if not running - (!fspUnit[0]->Virt()) && // and not attached + (!fspUnit[0]->HasVirt()) && // and not attached fMacList[0] == fMacDefault) { // and old pa was old dpa fMacList[0] = bmac; // update also pa ! } @@ -1363,7 +1364,7 @@ uint16_t Rw11CntlDEUNA::GetPr1() const if (fPr1Delua) { pr1 |= kPR1_M_DELUA; } else { - if (!fspUnit[0]->Virt()) { + if (!fspUnit[0]->HasVirt()) { pr1 |= kPR1_M_XPWR | kPR1_M_ICAB; } } @@ -1561,9 +1562,9 @@ int Rw11CntlDEUNA::TxRingHandler() } LogFrameInfo('t', fTxBuf); // log transmitted frame - if (unit.Virt()) { // attached ? + if (unit.HasVirt()) { // attached ? RerrMsg emsg; - unit.Virt()->Snd(fTxBuf, emsg); + unit.Virt().Snd(fTxBuf, emsg); // FIXME_code: error handling } diff --git a/tools/src/librw11/Rw11CntlLP11.cpp b/tools/src/librw11/Rw11CntlLP11.cpp index 0fc67bc7..1f1fe522 100644 --- a/tools/src/librw11/Rw11CntlLP11.cpp +++ b/tools/src/librw11/Rw11CntlLP11.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlLP11.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11CntlLP11.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2017 by Walter F.J. Mueller // @@ -123,7 +123,7 @@ void Rw11CntlLP11::Start() void Rw11CntlLP11::UnitSetup(size_t ind) { Rw11UnitLP11& unit = *fspUnit[ind]; - SetOnline(unit.Virt()); // online if stream attached + SetOnline(unit.HasVirt()); // online if stream attached return; } diff --git a/tools/src/librw11/Rw11CntlPC11.cpp b/tools/src/librw11/Rw11CntlPC11.cpp index bcc23039..872d9535 100644 --- a/tools/src/librw11/Rw11CntlPC11.cpp +++ b/tools/src/librw11/Rw11CntlPC11.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlPC11.cpp 1062 2018-10-28 11:14:20Z mueller $ +// $Id: Rw11CntlPC11.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.3.2 use HasVirt(); Virt() returns ref // 2018-10-28 1062 1.3.1 replace boost/foreach // 2017-05-14 897 1.3 trace received chars // 2017-04-02 865 1.2.2 Dump(): add detail arg @@ -226,7 +227,7 @@ bool Rw11CntlPC11::BootCode(size_t /*unit*/, std::vector& code, void Rw11CntlPC11::UnitSetup(size_t ind) { Rw11UnitPC11& unit = *fspUnit[ind]; - SetOnline(ind, unit.Virt()); // online if stream attached + SetOnline(ind, unit.HasVirt()); // online if stream attached return; } diff --git a/tools/src/librw11/Rw11CntlRHRP.cpp b/tools/src/librw11/Rw11CntlRHRP.cpp index daff3834..a97c1e14 100644 --- a/tools/src/librw11/Rw11CntlRHRP.cpp +++ b/tools/src/librw11/Rw11CntlRHRP.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlRHRP.cpp 1062 2018-10-28 11:14:20Z mueller $ +// $Id: Rw11CntlRHRP.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2015-2018 by Walter F.J. Mueller // Other credits: @@ -15,6 +15,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.7 use HasVirt(); Virt() returns ref // 2018-10-28 1062 1.0.6 replace boost/foreach // 2017-04-02 865 1.0.5 Dump(): add detail arg // 2017-03-03 858 1.0.4 use cntl name as message prefix @@ -297,7 +298,7 @@ void Rw11CntlRHRP::UnitSetup(size_t ind) if (unit.Type() != "off") { // is enabled rpds |= kRPDS_M_DPR; - if (unit.Virt()) { // file attached + if (unit.HasVirt()) { // file attached rpds |= kRPDS_M_MOL; // -> set MOL rpds |= kRPDS_M_ERP; // -> clear ER1 via ERP=1 if (unit.WProt()) rpds |= kRPDS_M_WRL; // in case write protected @@ -498,7 +499,7 @@ int Rw11CntlRHRP::AttnHandler(RlinkServer::AttnArgs& args) // SEEK and others are done in ibdr_rhrp autonomously // not attached --> signal drive unsave status - if (! unit.Virt()) { // not attached + if (! unit.HasVirt()) { // not attached AddErrorExit(clist, kRPER1_M_UNS); // signal UNS (drive unsafe) Server().Exec(clist); // doit return 0; diff --git a/tools/src/librw11/Rw11CntlRK11.cpp b/tools/src/librw11/Rw11CntlRK11.cpp index 0ed36042..6e8b3899 100644 --- a/tools/src/librw11/Rw11CntlRK11.cpp +++ b/tools/src/librw11/Rw11CntlRK11.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlRK11.cpp 1062 2018-10-28 11:14:20Z mueller $ +// $Id: Rw11CntlRK11.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // Other credits: @@ -15,6 +15,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 2.0.7 use HasVirt(); Virt() returns ref // 2018-10-28 1062 2.0.6 replace boost/foreach // 2017-04-02 865 2.0.5 Dump(): add detail arg // 2017-03-03 858 2.0.4 use cntl name as message prefix @@ -232,7 +233,7 @@ void Rw11CntlRK11::UnitSetup(size_t ind) RlinkCommandList clist; uint16_t rkds = ind< abort with NXD error } else if (fu != kFUNC_WRITE && // function neither write diff --git a/tools/src/librw11/Rw11CntlRL11.cpp b/tools/src/librw11/Rw11CntlRL11.cpp index b74d5f4c..a1b08619 100644 --- a/tools/src/librw11/Rw11CntlRL11.cpp +++ b/tools/src/librw11/Rw11CntlRL11.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlRL11.cpp 1062 2018-10-28 11:14:20Z mueller $ +// $Id: Rw11CntlRL11.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2014-2018 by Walter F.J. Mueller // Other credits: @@ -16,6 +16,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.7 use HasVirt(); Virt() returns ref // 2018-10-28 1062 1.0.6 replace boost/foreach // 2017-04-02 865 1.0.5 Dump(): add detail arg // 2017-03-03 858 1.0.4 use cntl name as message prefix @@ -278,7 +279,7 @@ void Rw11CntlRL11::UnitSetup(size_t ind) if (unit.Type() == "rl02") // is it RL02 sta |= kSTA_M_DT; // set DT bit (1=RL02,0=RL01) - if (unit.Virt()) { // file attached + if (unit.HasVirt()) { // file attached sta |= kSTA_M_HO | kSTA_M_BH | kST_LOCK; // HO=1; BH=1; ST=LOCK if (unit.WProt()) // in case write protected sta |= kSTA_M_WL; // WL=1 @@ -471,7 +472,7 @@ int Rw11CntlRL11::AttnHandler(RlinkServer::AttnArgs& args) // SEEK and GSTA are done in ibdr_rl11 autonomously // not attached --> assumed Offline, status = load - if (! unit.Virt()) { // not attached + if (! unit.HasVirt()) { // not attached AddErrorExit(clist, kERR_OPI); // just signal OPI // drive stat is LOAD anyway Server().Exec(clist); // doit diff --git a/tools/src/librw11/Rw11CntlTM11.cpp b/tools/src/librw11/Rw11CntlTM11.cpp index c05d4593..8296eebe 100644 --- a/tools/src/librw11/Rw11CntlTM11.cpp +++ b/tools/src/librw11/Rw11CntlTM11.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11CntlTM11.cpp 1062 2018-10-28 11:14:20Z mueller $ +// $Id: Rw11CntlTM11.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2015-2018 by Walter F.J. Mueller // Other credits: @@ -15,6 +15,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.6 use HasVirt(); Virt() returns ref // 2018-10-28 1062 1.0.5 replace boost/foreach // 2017-04-02 865 1.0.4 Dump(): add detail arg // 2017-03-03 858 1.0.3 use cntl name as message prefix @@ -216,10 +217,10 @@ void Rw11CntlTM11::UnitSetup(size_t ind) RlinkCommandList clist; uint16_t tmds = 0; - if (unit.Virt()) { // file attached + if (unit.HasVirt()) { // file attached tmds |= kTMRL_M_ONL; - if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL; - if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT; + if (unit.Virt().WProt()) tmds |= kTMRL_M_WRL; + if (unit.Virt().Bot()) tmds |= kTMRL_M_BOT; } unit.SetTmds(tmds); cpu.AddWibr(clist, fBase+kTMCR, (uint16_t(ind)<WProt()) ) { + if ((!unit.HasVirt()) || (wcmd && unit.Virt().WProt()) ) { AddErrorExit(clist, kTMCR_M_RICMD); Server().Exec(clist); return 0; @@ -508,12 +509,12 @@ void Rw11CntlTM11::AddFastExit(RlinkCommandList& clist, int opcode, size_t ndone uint16_t tmds = 0; // AddFastExit() is also called after UNLOAD, which calls unit.Detach() - // So unlike in all other cases, Virt() may be 0, so check on this - if (unit.Virt()) { + // So unlike in all other cases, HasVirt() may be false, so check on this + if (unit.HasVirt()) { tmds |= kTMRL_M_ONL; - if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL; - if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT; - if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT; + if (unit.Virt().WProt()) tmds |= kTMRL_M_WRL; + if (unit.Virt().Bot()) tmds |= kTMRL_M_BOT; + if (unit.Virt().Eot()) tmds |= kTMRL_M_EOT; } switch (opcode) { @@ -566,9 +567,9 @@ void Rw11CntlTM11::AddNormalExit(RlinkCommandList& clist, size_t ndone, Rw11Cpu& cpu = Cpu(); uint16_t tmds = kTMRL_M_ONL; - if (unit.Virt()->WProt()) tmds |= kTMRL_M_WRL; - if (unit.Virt()->Bot()) tmds |= kTMRL_M_BOT; - if (unit.Virt()->Eot()) tmds |= kTMRL_M_EOT; + if (unit.Virt().WProt()) tmds |= kTMRL_M_WRL; + if (unit.Virt().Bot()) tmds |= kTMRL_M_BOT; + if (unit.Virt().Eot()) tmds |= kTMRL_M_EOT; uint32_t addr = fRd_addr + 2*ndone; uint16_t tmbc = fRd_tmbc + 2*uint16_t(ndone); diff --git a/tools/src/librw11/Rw11UnitDEUNA.cpp b/tools/src/librw11/Rw11UnitDEUNA.cpp index 9c57d162..ca23043b 100644 --- a/tools/src/librw11/Rw11UnitDEUNA.cpp +++ b/tools/src/librw11/Rw11UnitDEUNA.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitDEUNA.cpp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: Rw11UnitDEUNA.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2014-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.2 use HasVirt(); Virt() returns ref // 2018-12-01 1076 1.0.1 use unique_ptr // 2017-01-29 847 1.0 Initial version // 2014-06-09 561 0.1 First draft @@ -72,7 +73,7 @@ void Rw11UnitDEUNA::Dump(std::ostream& os, int ind, const char* text, void Rw11UnitDEUNA::AttachDone() { - fupVirt->SetupRcvCallback(boost::bind(&Rw11CntlDEUNA::RcvCallback, + Virt().SetupRcvCallback(boost::bind(&Rw11CntlDEUNA::RcvCallback, &Cntl(), _1)); Cntl().UnitSetup(0); return; diff --git a/tools/src/librw11/Rw11UnitDisk.cpp b/tools/src/librw11/Rw11UnitDisk.cpp index f7f07f88..5b57f6bb 100644 --- a/tools/src/librw11/Rw11UnitDisk.cpp +++ b/tools/src/librw11/Rw11UnitDisk.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitDisk.cpp 1060 2018-10-27 11:32:39Z mueller $ +// $Id: Rw11UnitDisk.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.3 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.2 Dump(): add detail arg // 2015-03-21 659 1.0.1 add fEnabled, Enabled() // 2013-04-19 507 1.0 Initial version @@ -74,11 +75,11 @@ void Rw11UnitDisk::SetType(const std::string& /*type*/) bool Rw11UnitDisk::VirtRead(size_t lba, size_t nblk, uint8_t* data, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitDisk::VirtRead", "no disk attached"); return false; } - return Virt()->Read(lba, nblk, data, emsg); + return Virt().Read(lba, nblk, data, emsg); } //------------------------------------------+----------------------------------- @@ -87,11 +88,11 @@ bool Rw11UnitDisk::VirtRead(size_t lba, size_t nblk, uint8_t* data, bool Rw11UnitDisk::VirtWrite(size_t lba, size_t nblk, const uint8_t* data, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitDisk::VirtWrite", "no disk attached"); return false; } - return Virt()->Write(lba, nblk, data, emsg); + return Virt().Write(lba, nblk, data, emsg); } //------------------------------------------+----------------------------------- diff --git a/tools/src/librw11/Rw11UnitDiskBase.ipp b/tools/src/librw11/Rw11UnitDiskBase.ipp index 96eef57c..6fb5db97 100644 --- a/tools/src/librw11/Rw11UnitDiskBase.ipp +++ b/tools/src/librw11/Rw11UnitDiskBase.ipp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitDiskBase.ipp 1061 2018-10-27 17:39:11Z mueller $ +// $Id: Rw11UnitDiskBase.ipp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.1.3 use HasVirt(); Virt() returns ref // 2018-10-27 1061 1.1.2 adapt to new Rw11VirtDisk::Setup interface // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2013-05-03 515 1.1 use AttachDone(),DetachCleanup(),DetachDone() @@ -80,7 +81,7 @@ void Rw11UnitDiskBase::Dump(std::ostream& os, int ind, const char* text, template void Rw11UnitDiskBase::AttachDone() { - Virt()->Setup(BlockSize(), NBlock(), NCylinder(), NHead(), NSector()); + Virt().Setup(BlockSize(), NBlock(), NCylinder(), NHead(), NSector()); Cntl().UnitSetup(Index()); return; } diff --git a/tools/src/librw11/Rw11UnitRHRP.cpp b/tools/src/librw11/Rw11UnitRHRP.cpp index c1455708..ae286e72 100644 --- a/tools/src/librw11/Rw11UnitRHRP.cpp +++ b/tools/src/librw11/Rw11UnitRHRP.cpp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitRHRP.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitRHRP.cpp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2015-2017 by Walter F.J. Mueller +// Copyright 2015-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.2 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2015-05-14 680 1.0 Initial version // 2015-03-21 659 0.1 First draft @@ -77,7 +78,7 @@ Rw11UnitRHRP::~Rw11UnitRHRP() void Rw11UnitRHRP::SetType(const std::string& type) { - if (Virt()) { + if (HasVirt()) { throw Rexception("Rw11UnitRHRP::SetType", string("Bad state: file attached")); } diff --git a/tools/src/librw11/Rw11UnitRL11.cpp b/tools/src/librw11/Rw11UnitRL11.cpp index ec8cf584..ff692118 100644 --- a/tools/src/librw11/Rw11UnitRL11.cpp +++ b/tools/src/librw11/Rw11UnitRL11.cpp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitRL11.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitRL11.cpp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2014-2017 by Walter F.J. Mueller +// Copyright 2014-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.3 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.2 Dump(): add detail arg // 2015-03-21 659 1.0.1 BUGFIX: SetType(): set fType; // 2014-06-08 561 1.0 Initial version @@ -70,7 +71,7 @@ Rw11UnitRL11::~Rw11UnitRL11() void Rw11UnitRL11::SetType(const std::string& type) { - if (Virt()) { + if (HasVirt()) { throw Rexception("Rw11UnitRL11::SetType", string("Bad state: file attached")); } diff --git a/tools/src/librw11/Rw11UnitStream.cpp b/tools/src/librw11/Rw11UnitStream.cpp index 2e7731b3..06f21f2f 100644 --- a/tools/src/librw11/Rw11UnitStream.cpp +++ b/tools/src/librw11/Rw11UnitStream.cpp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitStream.cpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitStream.cpp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2013-2017 by Walter F.J. Mueller +// Copyright 2013-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.1.2 use HasVirt(); Virt() returns ref; Pos() not const // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2017-02-04 848 1.1 Pos(): return -1 if not attached // 2013-05-04 515 1.0 Initial version @@ -61,23 +62,23 @@ Rw11UnitStream::~Rw11UnitStream() void Rw11UnitStream::SetPos(int pos) { - if (!Virt()) + if (!HasVirt()) throw Rexception("Rw11UnitStream::SetPos", "no stream attached"); RerrMsg emsg; - if (!Virt()->Seek(pos, emsg)) throw Rexception(emsg); + if (!Virt().Seek(pos, emsg)) throw Rexception(emsg); return; } //------------------------------------------+----------------------------------- //! FIXME_docs -int Rw11UnitStream::Pos() const +int Rw11UnitStream::Pos() { - if (!Virt()) return -1; // allow tcl 'get ?' if not attached + if (!HasVirt()) return -1; // allow tcl 'get ?' if not attached RerrMsg emsg; - int irc = Virt()->Tell(emsg); + int irc = Virt().Tell(emsg); if (irc < 0) throw Rexception(emsg); return irc; } @@ -87,12 +88,12 @@ int Rw11UnitStream::Pos() const int Rw11UnitStream::VirtRead(uint8_t* data, size_t count, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { fStats.Inc(kStatNPreAttMiss); emsg.Init("Rw11UnitStream::VirtRead", "no stream attached"); return -1; } - return Virt()->Read(data, count, emsg); + return Virt().Read(data, count, emsg); } //------------------------------------------+----------------------------------- @@ -100,12 +101,12 @@ int Rw11UnitStream::VirtRead(uint8_t* data, size_t count, RerrMsg& emsg) bool Rw11UnitStream::VirtWrite(const uint8_t* data, size_t count, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { fStats.Inc(kStatNPreAttDrop, double(count)); emsg.Init("Rw11UnitStream::VirtWrite", "no stream attached"); return false; } - return Virt()->Write(data, count, emsg); + return Virt().Write(data, count, emsg); } //------------------------------------------+----------------------------------- @@ -113,11 +114,11 @@ bool Rw11UnitStream::VirtWrite(const uint8_t* data, size_t count, RerrMsg& emsg) bool Rw11UnitStream::VirtFlush(RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitStream::VirtFlush", "no stream attached"); return false; } - return Virt()->Flush(emsg); + return Virt().Flush(emsg); } //------------------------------------------+----------------------------------- diff --git a/tools/src/librw11/Rw11UnitStream.hpp b/tools/src/librw11/Rw11UnitStream.hpp index 970e4f98..79cbb212 100644 --- a/tools/src/librw11/Rw11UnitStream.hpp +++ b/tools/src/librw11/Rw11UnitStream.hpp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitStream.hpp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitStream.hpp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2013-2017 by Walter F.J. Mueller +// Copyright 2013-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.2 Pos() not const anymore // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2013-05-04 515 1.0 Initial version // 2013-05-01 513 0.1 First draft @@ -39,7 +40,7 @@ namespace Retro { ~Rw11UnitStream(); void SetPos(int pos); - int Pos() const; + int Pos(); int VirtRead(uint8_t* data, size_t count, RerrMsg& emsg); bool VirtWrite(const uint8_t* data, size_t count, RerrMsg& emsg); diff --git a/tools/src/librw11/Rw11UnitTape.cpp b/tools/src/librw11/Rw11UnitTape.cpp index fb17267c..0031b4d6 100644 --- a/tools/src/librw11/Rw11UnitTape.cpp +++ b/tools/src/librw11/Rw11UnitTape.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitTape.cpp 1060 2018-10-27 11:32:39Z mueller $ +// $Id: Rw11UnitTape.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2015-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.2 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2015-06-04 686 1.0 Initial version // 2015-05-17 683 0.1 First draft @@ -68,8 +69,8 @@ void Rw11UnitTape::SetType(const std::string& /*type*/) void Rw11UnitTape::SetWProt(bool wprot) { - if (Virt()) throw Rexception("Rw11UnitTape::SetWProt", - "not allowed when tape attached"); + if (HasVirt()) throw Rexception("Rw11UnitTape::SetWProt", + "not allowed when tape attached"); fWProt = wprot; return; } @@ -79,8 +80,8 @@ void Rw11UnitTape::SetWProt(bool wprot) void Rw11UnitTape::SetCapacity(size_t nbyte) { - if (Virt()) throw Rexception("Rw11UnitTape::SetCapacity", - "not allowed when tape attached"); + if (HasVirt()) throw Rexception("Rw11UnitTape::SetCapacity", + "not allowed when tape attached"); fCapacity = nbyte; return; } @@ -90,9 +91,9 @@ void Rw11UnitTape::SetCapacity(size_t nbyte) void Rw11UnitTape::SetPosFile(int posfile) { - if (!Virt()) throw Rexception("Rw11UnitTape::SetPosFile", - "no tape attached"); - Virt()->SetPosFile(posfile); + if (!HasVirt()) throw Rexception("Rw11UnitTape::SetPosFile", + "no tape attached"); + Virt().SetPosFile(posfile); return; } @@ -101,9 +102,9 @@ void Rw11UnitTape::SetPosFile(int posfile) void Rw11UnitTape::SetPosRecord(int posrec) { - if (!Virt()) throw Rexception("Rw11UnitTape::SetPosRecord", - "no tape attached"); - Virt()->SetPosRecord(posrec); + if (!HasVirt()) throw Rexception("Rw11UnitTape::SetPosRecord", + "no tape attached"); + Virt().SetPosRecord(posrec); return; } @@ -112,8 +113,8 @@ void Rw11UnitTape::SetPosRecord(int posrec) bool Rw11UnitTape::Bot() const { - if (!Virt()) return false; - return Virt()->Bot(); + if (!HasVirt()) return false; + return Virt().Bot(); } //------------------------------------------+----------------------------------- @@ -121,8 +122,8 @@ bool Rw11UnitTape::Bot() const bool Rw11UnitTape::Eot() const { - if (!Virt()) return false; - return Virt()->Eot(); + if (!HasVirt()) return false; + return Virt().Eot(); } //------------------------------------------+----------------------------------- @@ -130,8 +131,8 @@ bool Rw11UnitTape::Eot() const bool Rw11UnitTape::Eom() const { - if (!Virt()) return false; - return Virt()->Eom(); + if (!HasVirt()) return false; + return Virt().Eom(); } //------------------------------------------+----------------------------------- @@ -139,8 +140,8 @@ bool Rw11UnitTape::Eom() const int Rw11UnitTape::PosFile() const { - if (!Virt()) return -1; - return Virt()->PosFile(); + if (!HasVirt()) return -1; + return Virt().PosFile(); } //------------------------------------------+----------------------------------- @@ -148,8 +149,8 @@ int Rw11UnitTape::PosFile() const int Rw11UnitTape::PosRecord() const { - if (!Virt()) return -1; - return Virt()->PosRecord(); + if (!HasVirt()) return -1; + return Virt().PosRecord(); } //------------------------------------------+----------------------------------- @@ -158,11 +159,11 @@ int Rw11UnitTape::PosRecord() const bool Rw11UnitTape::VirtReadRecord(size_t nbyte, uint8_t* data, size_t& ndone, int& opcode, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtReadRecord", "no tape attached"); return false; } - return Virt()->ReadRecord(nbyte, data, ndone, opcode, emsg); + return Virt().ReadRecord(nbyte, data, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- @@ -171,11 +172,11 @@ bool Rw11UnitTape::VirtReadRecord(size_t nbyte, uint8_t* data, size_t& ndone, bool Rw11UnitTape::VirtWriteRecord(size_t nbyte, const uint8_t* data, int& opcode, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtWriteRecord", "no tape attached"); return false; } - return Virt()->WriteRecord(nbyte, data, opcode, emsg); + return Virt().WriteRecord(nbyte, data, opcode, emsg); } //------------------------------------------+----------------------------------- @@ -183,11 +184,11 @@ bool Rw11UnitTape::VirtWriteRecord(size_t nbyte, const uint8_t* data, bool Rw11UnitTape::VirtWriteEof(RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtWriteEof", "no tape attached"); return false; } - return Virt()->WriteEof(emsg); + return Virt().WriteEof(emsg); } //------------------------------------------+----------------------------------- @@ -196,11 +197,11 @@ bool Rw11UnitTape::VirtWriteEof(RerrMsg& emsg) bool Rw11UnitTape::VirtSpaceForw(size_t nrec, size_t& ndone, int& opcode, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtSpaceForw", "no tape attached"); return false; } - return Virt()->SpaceForw(nrec, ndone, opcode, emsg); + return Virt().SpaceForw(nrec, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- @@ -209,11 +210,11 @@ bool Rw11UnitTape::VirtSpaceForw(size_t nrec, size_t& ndone, bool Rw11UnitTape::VirtSpaceBack(size_t nrec, size_t& ndone, int& opcode, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtSpaceBack", "no tape attached"); return false; } - return Virt()->SpaceBack(nrec, ndone, opcode, emsg); + return Virt().SpaceBack(nrec, ndone, opcode, emsg); } //------------------------------------------+----------------------------------- @@ -221,11 +222,11 @@ bool Rw11UnitTape::VirtSpaceBack(size_t nrec, size_t& ndone, bool Rw11UnitTape::VirtRewind(int& opcode, RerrMsg& emsg) { - if (!Virt()) { + if (!HasVirt()) { emsg.Init("Rw11UnitTape::VirtRewind", "no tape attached"); return false; } - return Virt()->Rewind(opcode, emsg); + return Virt().Rewind(opcode, emsg); } //------------------------------------------+----------------------------------- diff --git a/tools/src/librw11/Rw11UnitTape.ipp b/tools/src/librw11/Rw11UnitTape.ipp index e766bd52..fd0afb68 100644 --- a/tools/src/librw11/Rw11UnitTape.ipp +++ b/tools/src/librw11/Rw11UnitTape.ipp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitTape.ipp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitTape.ipp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2015- by Walter F.J. Mueller +// Copyright 2015-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.1 use HasVirt(); Virt() returns ref // 2015-06-04 686 1.0 Initial version // 2015-05-17 683 0.1 First draft // --------------------------------------------------------------------------- @@ -46,7 +47,7 @@ inline bool Rw11UnitTape::Enabled() const inline bool Rw11UnitTape::WProt() const { - return Virt() ? Virt()->WProt() : fWProt; + return HasVirt() ? Virt().WProt() : fWProt; } //------------------------------------------+----------------------------------- @@ -54,7 +55,7 @@ inline bool Rw11UnitTape::WProt() const inline size_t Rw11UnitTape::Capacity() const { - return Virt() ? Virt()->Capacity() : fCapacity; + return HasVirt() ? Virt().Capacity() : fCapacity; } diff --git a/tools/src/librw11/Rw11UnitTapeBase.ipp b/tools/src/librw11/Rw11UnitTapeBase.ipp index 32530bd0..ee33285c 100644 --- a/tools/src/librw11/Rw11UnitTapeBase.ipp +++ b/tools/src/librw11/Rw11UnitTapeBase.ipp @@ -1,6 +1,6 @@ -// $Id: Rw11UnitTapeBase.ipp 983 2018-01-02 20:35:59Z mueller $ +// $Id: Rw11UnitTapeBase.ipp 1080 2018-12-09 20:30:33Z mueller $ // -// Copyright 2015-2017 by Walter F.J. Mueller +// Copyright 2015-2018 by Walter F.J. Mueller // // This program is free software; you may redistribute and/or modify it under // the terms of the GNU General Public License as published by the Free @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.0.2 use HasVirt(); Virt() returns ref // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2015-06-04 686 1.0 Initial version // 2015-05-17 683 0.1 First draft @@ -79,7 +80,7 @@ template void Rw11UnitTapeBase::AttachDone() { // transfer, if defined capacity from unit to virt - if (Capacity()!=0 && Virt()->Capacity()==0) Virt()->SetCapacity(Capacity()); + if (Capacity()!=0 && Virt().Capacity()==0) Virt().SetCapacity(Capacity()); Cntl().UnitSetup(Index()); return; } diff --git a/tools/src/librw11/Rw11UnitTerm.cpp b/tools/src/librw11/Rw11UnitTerm.cpp index 7dcc5303..e85a444f 100644 --- a/tools/src/librw11/Rw11UnitTerm.cpp +++ b/tools/src/librw11/Rw11UnitTerm.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitTerm.cpp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: Rw11UnitTerm.cpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.1.4 use HasVirt(); Virt() returns ref // 2018-12-01 1076 1.1.3 use unique_ptr // 2017-04-07 868 1.1.2 Dump(): add detail arg // 2017-02-25 855 1.1.1 RcvNext() --> RcvQueueNext(); WakeupCntl() now pure @@ -75,7 +76,7 @@ Rw11UnitTerm::~Rw11UnitTerm() const std::string& Rw11UnitTerm::ChannelId() const { - if (fupVirt) return fupVirt->ChannelId(); + if (HasVirt()) return Virt().ChannelId(); static string nil; return nil; } @@ -204,9 +205,9 @@ bool Rw11UnitTerm::Snd(const uint8_t* buf, size_t count) } } - if (fupVirt) { // if virtual device attached + if (HasVirt()) { // if virtual device attached RerrMsg emsg; - ok = fupVirt->Snd(bufout, bufcnt, emsg); + ok = Virt().Snd(bufout, bufcnt, emsg); // FIXME_code: handler errors } else { // no virtual device attached @@ -293,8 +294,8 @@ void Rw11UnitTerm::Dump(std::ostream& os, int ind, const char* text, void Rw11UnitTerm::AttachDone() { - fupVirt->SetupRcvCallback(boost::bind(&Rw11UnitTerm::RcvCallback, - this, _1, _2)); + Virt().SetupRcvCallback(boost::bind(&Rw11UnitTerm::RcvCallback, + this, _1, _2)); return; } diff --git a/tools/src/librw11/Rw11UnitVirt.hpp b/tools/src/librw11/Rw11UnitVirt.hpp index 6249df91..06acf5f7 100644 --- a/tools/src/librw11/Rw11UnitVirt.hpp +++ b/tools/src/librw11/Rw11UnitVirt.hpp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitVirt.hpp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: Rw11UnitVirt.hpp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.2 add HasVirt(); return ref for Virt() // 2018-12-01 1076 1.1 use unique_ptr instead of scoped_ptr // 2017-04-15 875 1.0.2 add VirtBase() // 2017-04-07 868 1.0.1 Dump(): add detail arg @@ -42,7 +43,9 @@ namespace Retro { Rw11UnitVirt(Rw11Cntl* pcntl, size_t index); ~Rw11UnitVirt(); - TV* Virt() const; + bool HasVirt() const; + TV& Virt(); + const TV& Virt() const; virtual Rw11Virt* VirtBase() const; virtual bool Attach(const std::string& url, RerrMsg& emsg); diff --git a/tools/src/librw11/Rw11UnitVirt.ipp b/tools/src/librw11/Rw11UnitVirt.ipp index ef0a8634..b989e58c 100644 --- a/tools/src/librw11/Rw11UnitVirt.ipp +++ b/tools/src/librw11/Rw11UnitVirt.ipp @@ -1,4 +1,4 @@ -// $Id: Rw11UnitVirt.ipp 1076 2018-12-02 12:45:49Z mueller $ +// $Id: Rw11UnitVirt.ipp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.4 add HasVirt(); return ref for Virt() // 2018-12-01 1076 1.3 use unique_ptr instead of scoped_ptr // 2017-04-15 875 1.2.2 add VirtBase() // 2017-04-07 868 1.2.1 Dump(): add detail arg @@ -62,9 +63,27 @@ Rw11UnitVirt::~Rw11UnitVirt() //! FIXME_docs template -inline TV* Rw11UnitVirt::Virt() const +inline bool Rw11UnitVirt::HasVirt() const { - return fupVirt.get(); + return bool(fupVirt); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +template +inline TV& Rw11UnitVirt::Virt() +{ + return *fupVirt; +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + +template +inline const TV& Rw11UnitVirt::Virt() const +{ + return *fupVirt; } //------------------------------------------+----------------------------------- diff --git a/tools/src/librwxxtpp/RtclRw11UnitBase.ipp b/tools/src/librwxxtpp/RtclRw11UnitBase.ipp index 70d5c469..8b59abcb 100644 --- a/tools/src/librwxxtpp/RtclRw11UnitBase.ipp +++ b/tools/src/librwxxtpp/RtclRw11UnitBase.ipp @@ -1,4 +1,4 @@ -// $Id: RtclRw11UnitBase.ipp 1078 2018-12-08 14:19:03Z mueller $ +// $Id: RtclRw11UnitBase.ipp 1080 2018-12-09 20:30:33Z mueller $ // // Copyright 2013-2018 by Walter F.J. Mueller // @@ -13,6 +13,7 @@ // // Revision History: // Date Rev Version Comment +// 2018-12-09 1080 1.3.4 use HasVirt(); Virt() returns ref // 2018-12-07 1078 1.3.3 use std::shared_ptr instead of boost // 2018-12-01 1076 1.3.2 use unique_ptr // 2017-04-15 875 1.3.1 add attached,attachutl getters @@ -127,8 +128,8 @@ inline const std::shared_ptr& RtclRw11UnitBase::ObjSPtr() template void RtclRw11UnitBase::AttachDone() { - if (!Obj().Virt()) return; - std::unique_ptr pvirt(RtclRw11VirtFactory(Obj().Virt())); + if (!Obj().HasVirt()) return; + std::unique_ptr pvirt(RtclRw11VirtFactory(&Obj().Virt())); if (!pvirt) return; this->fupVirt = move(pvirt); this->AddMeth("virt", boost::bind(&RtclRw11Unit::M_virt, this, _1)); @@ -144,8 +145,8 @@ int RtclRw11UnitBase::M_stats(RtclArgs& args) RtclStats::Context cntx; if (!RtclStats::GetArgs(args, cntx)) return TB::kERR; if (!RtclStats::Collect(args, cntx, Obj().Stats())) return TB::kERR; - if (Obj().Virt()) { - if (!RtclStats::Collect(args, cntx, Obj().Virt()->Stats())) return TB::kERR; + if (Obj().HasVirt()) { + if (!RtclStats::Collect(args, cntx, Obj().Virt().Stats())) return TB::kERR; } return TB::kOK; }