Skip to content
Snippets Groups Projects
Commit 76677481 authored by Don Gagne's avatar Don Gagne
Browse files

Reference counting for LinkInterface, LinkConfiguration

Prevent shutdown ordering crashes
parent 5040e3d9
No related branches found
No related tags found
No related merge requests found
......@@ -177,10 +177,7 @@ public:
bool connect(void);
bool disconnect(void);
LinkConfiguration* getLinkConfiguration() { return _config; }
public slots:
/*! @brief Add a new host to broadcast messages to */
void addHost (const QString& host);
/*! @brief Remove a host from broadcasting messages to */
......@@ -189,23 +186,11 @@ public slots:
void readBytes();
private slots:
/*!
* @brief Write a number of bytes to the interface.
*
* @param data Pointer to the data byte array
* @param size The size of the bytes array
**/
void _writeBytes(const QByteArray data);
protected:
QUdpSocket* _socket;
UDPConfiguration* _config;
bool _connectState;
private:
// Links are only created/destroyed by LinkManager so constructor/destructor is not public
UDPLink(UDPConfiguration* config);
UDPLink(SharedLinkConfigurationPointer& config);
~UDPLink();
// From LinkInterface
......@@ -223,6 +208,9 @@ private:
#endif
bool _running;
QUdpSocket* _socket;
UDPConfiguration* _udpConfig;
bool _connectState;
};
#endif // UDPLINK_H
......@@ -57,29 +57,29 @@ void LinkManagerTest::cleanup(void)
void LinkManagerTest::_add_test(void)
{
Q_ASSERT(_linkMgr);
Q_ASSERT(_linkMgr->links()->count() == 0);
Q_ASSERT(_linkMgr->links().count() == 0);
_connectMockLink();
QCOMPARE(_linkMgr->links()->count(), 1);
QCOMPARE(_linkMgr->links()->value<MockLink*>(0), _mockLink);
QCOMPARE(_linkMgr->links().count(), 1);
QCOMPARE(_linkMgr->links().at(0), _mockLink);
}
void LinkManagerTest::_delete_test(void)
{
Q_ASSERT(_linkMgr);
Q_ASSERT(_linkMgr->links()->count() == 0);
Q_ASSERT(_linkMgr->links().count() == 0);
_connectMockLink();
_disconnectMockLink();
QCOMPARE(_linkMgr->links()->count(), 0);
QCOMPARE(_linkMgr->links().count(), 0);
}
void LinkManagerTest::_addSignals_test(void)
{
Q_ASSERT(_linkMgr);
Q_ASSERT(_linkMgr->links()->count() == 0);
Q_ASSERT(_linkMgr->links().count() == 0);
Q_ASSERT(_multiSpy->checkNoSignals() == true);
_connectMockLink();
......@@ -99,7 +99,7 @@ void LinkManagerTest::_addSignals_test(void)
void LinkManagerTest::_deleteSignals_test(void)
{
Q_ASSERT(_linkMgr);
Q_ASSERT(_linkMgr->links()->count() == 0);
Q_ASSERT(_linkMgr->links().count() == 0);
Q_ASSERT(_multiSpy->checkNoSignals() == true);
_connectMockLink();
......
......@@ -17,8 +17,7 @@
#include "TCPLoopBackServer.h"
TCPLinkTest::TCPLinkTest(void)
: _config(NULL)
, _link(NULL)
: _link(NULL)
, _multiSpy(NULL)
{
......@@ -31,13 +30,12 @@ void TCPLinkTest::init(void)
Q_ASSERT(_link == nullptr);
Q_ASSERT(_multiSpy == nullptr);
Q_ASSERT(_config == nullptr);
_config = new TCPConfiguration("MockTCP");
_config->setAddress(QHostAddress::LocalHost);
_config->setPort(5760);
_link = new TCPLink(_config);
Q_ASSERT(_link != NULL);
TCPConfiguration* tcpConfig = new TCPConfiguration("MockTCP");
tcpConfig->setAddress(QHostAddress::LocalHost);
tcpConfig->setPort(5760);
_sharedConfig = SharedLinkConfigurationPointer(tcpConfig);
_link = new TCPLink(_sharedConfig);
_rgSignals[bytesReceivedSignalIndex] = SIGNAL(bytesReceived(LinkInterface*, QByteArray));
_rgSignals[connectedSignalIndex] = SIGNAL(connected(void));
......@@ -55,7 +53,6 @@ void TCPLinkTest::cleanup(void)
{
Q_ASSERT(_multiSpy);
Q_ASSERT(_link);
Q_ASSERT(_config);
delete _multiSpy;
_multiSpy = nullptr;
......@@ -63,15 +60,13 @@ void TCPLinkTest::cleanup(void)
delete _link;
_link = nullptr;
delete _config;
_config = nullptr;
_sharedConfig.clear();
UnitTest::cleanup();
}
void TCPLinkTest::_connectFail_test(void)
{
Q_ASSERT(_config);
Q_ASSERT(_link);
Q_ASSERT(_multiSpy);
Q_ASSERT(_multiSpy->checkNoSignals() == true);
......@@ -110,7 +105,8 @@ void TCPLinkTest::_connectSucceed_test(void)
Q_ASSERT(_multiSpy->checkNoSignals() == true);
// Start the server side
TCPLoopBackServer* server = new TCPLoopBackServer(_config->address(), _config->port());
TCPConfiguration* tcpConfig = qobject_cast<TCPConfiguration*>(_sharedConfig.data());
TCPLoopBackServer* server = new TCPLoopBackServer(tcpConfig->address(), tcpConfig->port());
Q_CHECK_PTR(server);
// Connect to the server
......
......@@ -60,11 +60,11 @@ private:
//deleteLinkSignalMask = 1 << deleteLinkSignalIndex,
};
TCPConfiguration* _config;
TCPLink* _link;
MultiSignalSpy* _multiSpy;
static const size_t _cSignals = maxSignalIndex;
const char* _rgSignals[_cSignals];
SharedLinkConfigurationPointer _sharedConfig;
TCPLink* _link;
MultiSignalSpy* _multiSpy;
static const size_t _cSignals = maxSignalIndex;
const char* _rgSignals[_cSignals];
};
#endif
......@@ -85,7 +85,10 @@ void QGCMAVLinkLogPlayer::_selectLogFileForPlayback(void)
linkConfig->setLogFilename(logFilename);
linkConfig->setName(linkConfig->logFilenameShort());
_ui->logFileNameLabel->setText(linkConfig->logFilenameShort());
_replayLink = (LogReplayLink*)qgcApp()->toolbox()->linkManager()->createConnectedLink(linkConfig);
LinkManager* linkMgr = qgcApp()->toolbox()->linkManager();
SharedLinkConfigurationPointer sharedConfig = linkMgr->addConfiguration(linkConfig);
_replayLink = (LogReplayLink*)qgcApp()->toolbox()->linkManager()->createConnectedLink(sharedConfig);
connect(_replayLink, &LogReplayLink::logFileStats, this, &QGCMAVLinkLogPlayer::_logFileStats);
connect(_replayLink, &LogReplayLink::playbackStarted, this, &QGCMAVLinkLogPlayer::_playbackStarted);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment