| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 | /*= StarPU-Top for StarPU =Copyright (C) 2011 William BraikYann CourtoisJean-Marie CouteyenAnthony RoyCopyright (C) 2011 Université de Bordeaux 1This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA*/#include <QMessageBox>#include "communicationthread.h"#include "configurationmanager.h"#include "mainwindow.h"#include "communicationmanager.h"#include "starpu_top_types.h"const int MAX_CONNECTION_ATTEMPTS = 10;CommunicationThread::CommunicationThread(        MainWindow *mainWindow,        ConfigurationManager *configurationManager){    static bool instanciated = false;    Q_ASSERT_X(instanciated == false, "CommunicationThread's' constructor",               "Singleton pattern violated - "               "CommunicationThread instanciated more than once");    _mainWindow = mainWindow;    _configurationManager = configurationManager;    _communicationManager = 0;    _SSHProcess = NULL;    instanciated = true;    QObject::connect(this, SIGNAL(progress(QString)),                   _mainWindow, SLOT(updateStatusBarMessage(QString)));    QObject::connect(this, SIGNAL(disconnected()),                    _mainWindow, SLOT(disconnected()));    QObject::connect(this, SIGNAL(abort(QString)),                   _mainWindow, SLOT(connectionAborted(QString)));    qDebug() << "CommunicationThread : initializing";}CommunicationThread::~CommunicationThread(){    qDebug() << "CommunicationThread : terminating";    delete _communicationManager;}void CommunicationThread::createNewCommunicationManager(void){    emit progress(tr("Connecting..."));    if (_communicationManager == 0)        delete(_communicationManager );    _communicationManager = new CommunicationManager(this);    // Type registering is necessary for Qt "Queued Connections"    // as we are going to send signals to a different thread    qRegisterMetaType<QAbstractSocket::SocketError> (            "QAbstractSocket::SocketError");    // Connection events    QObject::connect(_communicationManager, SIGNAL(protoConnected()),                   _mainWindow, SLOT(connectionSucceeded()));    QObject::connect(_communicationManager, SIGNAL(protoConnected()),                   this, SLOT(connectionSucceeded()));    QObject::connect(_communicationManager, SIGNAL(error(QAbstractSocket::SocketError)),                   this, SLOT(connectionError(QAbstractSocket::SocketError)));    QObject::connect(_communicationManager, SIGNAL(disconnected()),                    this, SLOT(connectionDisconnected()));    // Change communication state    QObject::connect(_communicationManager, SIGNAL(protocolError(QString)),                     _mainWindow, SLOT(protocolErrorCaught(QString)));    QObject::connect(_communicationManager,                     SIGNAL(sessionTimeSynchronized(qlonglong)),                     _mainWindow,                     SLOT(synchronizeSessionTime(qlonglong)));    QObject::connect(_communicationManager,                     SIGNAL(serverInitCompleted(QString,                                                QList<DataDescription*>*,                                                QList<ParamDescription*>*,                                                QList<Starpu_TopDevice>*)),                     _mainWindow, SLOT(initClient(                             QString,                             QList<DataDescription*>*,                             QList<ParamDescription*>*,                             QList<Starpu_TopDevice>*)));    // Output data    QObject::connect(_mainWindow, SIGNAL(clientLaunched()),                     _communicationManager, SLOT(sendGoMessage()));    QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)),                     _communicationManager, SLOT(sendDataEnableMessage(int)));    QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)),                     _communicationManager, SLOT(sendDataDisableMessage(int)));    QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,bool)),                     _communicationManager, SLOT(sendParamSetMessage(int,bool)));    QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,int)),                     _communicationManager, SLOT(sendParamSetMessage(int,int)));    QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,double)),                     _communicationManager, SLOT(sendParamSetMessage(int,double)));    QObject::connect(_mainWindow, SIGNAL(debugEnabled(bool)),                     _communicationManager, SLOT(sendDebugEnabledMessage(bool)));    QObject::connect(_mainWindow, SIGNAL(debugStepped()),                     _communicationManager, SLOT(sendStepMessage()));    // Input data    QObject::connect(_communicationManager,                     SIGNAL(notifyDebugEnabled(bool)),                     _mainWindow, SLOT(setDebug(bool)));    QObject::connect(_communicationManager,                     SIGNAL(notifyDebugMessage(QString)), _mainWindow,                     SLOT(setDebugMessage(QString)));    QObject::connect(_communicationManager,                     SIGNAL(notifyDebugLock(QString)), _mainWindow,                     SLOT(setDebugLock(QString)));    QObject	::connect(_communicationManager,                      SIGNAL(notifyParamUpdate(int,bool,qlonglong)),                      _mainWindow, SLOT(updateInteractiveWidget(int,bool,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyParamUpdate(int,int,qlonglong)),                     _mainWindow, SLOT(updateInteractiveWidget(int,int,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyParamUpdate(int,double,qlonglong)),                     _mainWindow, SLOT(updateInteractiveWidget(int,double,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyTaskPrevUpdate(int,int,qlonglong,qlonglong,qlonglong)),                     _mainWindow,                     SLOT(updateTaskPrev(int,int,qlonglong,qlonglong,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyTaskStartUpdate(int,int,qlonglong)),                     _mainWindow, SLOT(updateTaskStart(int,int,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyTaskEndUpdate(int,qlonglong)),                     _mainWindow, SLOT(updateTaskEnd(int,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyDataUpdate(int,bool,qlonglong)),                     _mainWindow, SLOT(updateDataWidget(int,bool,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyDataUpdate(int,int,qlonglong)),                     _mainWindow, SLOT(updateDataWidget(int,int,qlonglong)));    QObject::connect(_communicationManager,                      SIGNAL(notifyDataUpdate(int,double,qlonglong)),                     _mainWindow, SLOT(updateDataWidget(int,double,qlonglong)));    _communicationManager->connectToHost(_configurationManager->serverHost(),                                         _configurationManager->serverPort());}void CommunicationThread::run(){    if(_configurationManager->ssh())        {                _connectionAttemptsCount = 0;                QString commandLine;                #ifdef WIN32                commandLine.append("cmd /c start ");                #else                commandLine.append("xterm -e ");                #endif                commandLine.append(_configurationManager->commandLine());                qDebug() << "CommunicationThread : executing SSH command line : "                        << commandLine;                _SSHProcess = new QProcess();                _SSHProcess->start(commandLine);        }    createNewCommunicationManager();    exec();}void CommunicationThread::connectionError(QAbstractSocket::SocketError error){    qDebug() << "CommunicationThread : connection error occured" << error;    switch (error)    {    case QAbstractSocket::ConnectionRefusedError:        if (_configurationManager->ssh()) {            if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) {                qDebug() << "refused, retrying";                emit progress(tr("Connecting refused, retrying (") + QString::number(_connectionAttemptsCount)+(")..."));                this->sleep(1);                _communicationManager->connectToHost(_configurationManager->serverHost(),                                                     _configurationManager->serverPort());                break;            }        }	qDebug() << "Too many retries, giving up";        emit abort(tr("Connection refused by server (port : ") + QString::number(                   _configurationManager->serverPort()) + tr(") !"));        delete _SSHProcess;        exit(1);        break;    case QAbstractSocket::RemoteHostClosedError:        if (_connectionAttemptsCount == INT_MAX) {            _communicationManager->abort();	} else {            if (_configurationManager->ssh()) {                if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) {                    qDebug() << "closed, retrying";                    emit progress(tr("Connecting closed, retrying (") + QString::number(_connectionAttemptsCount)+(")..."));                    _communicationManager->abort();                    break;                }            }            qDebug() << "Too many retries, giving up";            emit abort(tr("Server closed the connection !"));        }        delete _SSHProcess;        exit(1);        break;    case QAbstractSocket::HostNotFoundError:        emit abort(tr("Server not found (host name : ")                + _configurationManager->serverHost() + tr(") !"));        delete _SSHProcess;        exit(1);        break;    default:        emit abort(tr("Connection to server is broken !"));        delete _SSHProcess;        exit(1);    }}void CommunicationThread::connectionSucceeded(){    /* Connected at application level, do not try to reconnect on closure */    _connectionAttemptsCount = INT_MAX;}void CommunicationThread::connectionDisconnected(){    if (_connectionAttemptsCount == INT_MAX) {        /* Only raise to mainWindow if we had connected */        emit disconnected();    } else {        /* Just closing for a retry, do retry */        qDebug() << "and retrying";        this->sleep(1);        createNewCommunicationManager();    }}
 |