aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorItay Grudev <itay+git2020@grudev.com>2020-09-09 02:28:07 +0100
committerItay Grudev <itay+git2020@grudev.com>2020-09-09 02:28:07 +0100
commit3e83f5ce13c06bf6c65fb369d152cd570d718bcb (patch)
tree7076c96d11e80d9fc32274e6d78791bbda37192e
parentMoved the random sleep functionality to SingleApplicationPrivate (diff)
downloadsingleapplication-3e83f5ce13c06bf6c65fb369d152cd570d718bcb.tar.xz
Improved the connectToPrimary() method and fixed issue with instanceStarted() not getting emitted
-rw-r--r--singleapplication.cpp7
-rw-r--r--singleapplication_p.cpp73
-rw-r--r--singleapplication_p.h2
3 files changed, 46 insertions, 36 deletions
diff --git a/singleapplication.cpp b/singleapplication.cpp
index 9b58bf8..d369aa1 100644
--- a/singleapplication.cpp
+++ b/singleapplication.cpp
@@ -85,7 +85,7 @@ SingleApplication::SingleApplication( int &argc, char *argv[], bool allowSeconda
abortSafely();
}
} else {
- qCritical() << "SingleApplication: Unable create block.";
+ qCritical() << "SingleApplication: Unable to create block.";
abortSafely();
}
}
@@ -238,7 +238,8 @@ bool SingleApplication::sendMessage( const QByteArray &message, int timeout )
if( isPrimary() ) return false;
// Make sure the socket is connected
- d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect );
+ if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) )
+ return false;
d->socket->write( message );
bool dataWritten = d->socket->waitForBytesWritten( timeout );
@@ -254,7 +255,7 @@ void SingleApplication::abortSafely()
{
Q_D( SingleApplication );
- qCritical() << d->memory->errorString();
+ qCritical() << "SingleApplication: " << d->memory->error() << d->memory->errorString();
delete d;
::exit( EXIT_FAILURE );
}
diff --git a/singleapplication_p.cpp b/singleapplication_p.cpp
index c453315..2aa4976 100644
--- a/singleapplication_p.cpp
+++ b/singleapplication_p.cpp
@@ -208,59 +208,68 @@ void SingleApplicationPrivate::startSecondary()
instanceNumber = inst->secondary;
}
-void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType connectionType )
+bool SingleApplicationPrivate::connectToPrimary( int timeout, ConnectionType connectionType )
{
+ QElapsedTimer time;
+ time.start();
+
// Connect to the Local Server of the Primary Instance if not already
// connected.
if( socket == nullptr ){
socket = new QLocalSocket();
}
- // If already connected - we are done;
- if( socket->state() == QLocalSocket::ConnectedState )
- return;
+ if( socket->state() == QLocalSocket::ConnectedState ) return true;
- // If not connect
- if( socket->state() == QLocalSocket::UnconnectedState ||
- socket->state() == QLocalSocket::ClosingState ){
- socket->connectToServer( blockServerName );
- }
+ if( socket->state() != QLocalSocket::ConnectedState ){
+
+ while( true ){
+ randomSleep();
+
+ if( socket->state() != QLocalSocket::ConnectingState )
+ socket->connectToServer( blockServerName );
- // Wait for being connected
- if( socket->state() == QLocalSocket::ConnectingState ){
- socket->waitForConnected( msecs );
+ if( socket->state() == QLocalSocket::ConnectingState ){
+ socket->waitForConnected( timeout - time.elapsed() );
+ }
+
+ // If connected break out of the loop
+ if( socket->state() == QLocalSocket::ConnectedState ) break;
+
+ // If elapsed time since start is longer than the method timeout return
+ if( time.elapsed() >= timeout ) return false;
+ }
}
// Initialisation message according to the SingleApplication protocol
- if( socket->state() == QLocalSocket::ConnectedState ){
- // Notify the parent that a new instance had been started;
- QByteArray initMsg;
- QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
+ QByteArray initMsg;
+ QDataStream writeStream(&initMsg, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
- writeStream.setVersion(QDataStream::Qt_5_6);
+ writeStream.setVersion(QDataStream::Qt_5_6);
#endif
- writeStream << blockServerName.toLatin1();
- writeStream << static_cast<quint8>(connectionType);
- writeStream << instanceNumber;
- quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
- writeStream << checksum;
+ writeStream << blockServerName.toLatin1();
+ writeStream << static_cast<quint8>(connectionType);
+ writeStream << instanceNumber;
+ quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
+ writeStream << checksum;
- // The header indicates the message length that follows
- QByteArray header;
- QDataStream headerStream(&header, QIODevice::WriteOnly);
+ // The header indicates the message length that follows
+ QByteArray header;
+ QDataStream headerStream(&header, QIODevice::WriteOnly);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
- headerStream.setVersion(QDataStream::Qt_5_6);
+ headerStream.setVersion(QDataStream::Qt_5_6);
#endif
- headerStream << static_cast <quint64>( initMsg.length() );
+ headerStream << static_cast <quint64>( initMsg.length() );
- socket->write( header );
- socket->write( initMsg );
- socket->flush();
- socket->waitForBytesWritten( msecs );
- }
+ socket->write( header );
+ socket->write( initMsg );
+ socket->flush();
+ if( socket->waitForBytesWritten( timeout - time.elapsed() )) return true;
+
+ return false;
}
quint16 SingleApplicationPrivate::blockChecksum()
diff --git a/singleapplication_p.h b/singleapplication_p.h
index 6ecf9a6..2233707 100644
--- a/singleapplication_p.h
+++ b/singleapplication_p.h
@@ -75,7 +75,7 @@ public:
void initializeMemoryBlock();
void startPrimary();
void startSecondary();
- void connectToPrimary(int msecs, ConnectionType connectionType );
+ bool connectToPrimary(int msecs, ConnectionType connectionType );
quint16 blockChecksum();
qint64 primaryPid();
QString primaryUser();