diff options
author | Brian Helfrich <helfrich9000@gmail.com> | 2008-03-17 17:36:10 +0000 |
---|---|---|
committer | Brian Helfrich <helfrich9000@gmail.com> | 2008-03-17 17:36:10 +0000 |
commit | be5ba89f1805e292b5ed94e99e30888c63ef9f9c (patch) | |
tree | 17d8599fee5070e61ecdaae9d79567bb68fc6cbe | |
parent | 06793eb0801610a1ab186794693e9e51979beadf (diff) | |
download | nanoengineer-be5ba89f1805e292b5ed94e99e30888c63ef9f9c.tar.gz nanoengineer-be5ba89f1805e292b5ed94e99e30888c63ef9f9c.zip |
Added mechanisms to get job management working on Windows.
11 files changed, 94 insertions, 21 deletions
diff --git a/cad/plugins/NanoVision-1/include/Nanorex/Interface/NXEntityManager.h b/cad/plugins/NanoVision-1/include/Nanorex/Interface/NXEntityManager.h index 0244dac44..c594a6285 100644 --- a/cad/plugins/NanoVision-1/include/Nanorex/Interface/NXEntityManager.h +++ b/cad/plugins/NanoVision-1/include/Nanorex/Interface/NXEntityManager.h @@ -146,16 +146,27 @@ public: true); // inPollingThread // TODO: Handle if result != 0 + // TODO: Fix - why does NV1 crash on Win32 when we emit this logging + // message? if (result->getResult() != NX_CMD_SUCCESS) { + printf("DataStorePollingThread: %s\n", + qPrintable(GetNV1ResultCodeString(result))); + /* NXLOG_WARNING("DataStorePollingThread", qPrintable(GetNV1ResultCodeString(result))); + */ } + delete result; msleep(500);//100); +printf("DataStorePollingThread: stop=%d storeComplete=%d lastFrame=%d\n", _stop,dataStoreInfo->storeIsComplete(frameSetId),dataStoreInfo->isLastFrame(frameSetId));fflush(0); } } - void stop() { _stop = true; } + void stop() { +printf("DataStorePollingThread::stop()\n"); + _stop = true; + } private: int frameSetId; diff --git a/cad/plugins/NanoVision-1/include/Nanorex/Utility/NXLogger.h b/cad/plugins/NanoVision-1/include/Nanorex/Utility/NXLogger.h index 2d925aeda..cb0f50124 100644 --- a/cad/plugins/NanoVision-1/include/Nanorex/Utility/NXLogger.h +++ b/cad/plugins/NanoVision-1/include/Nanorex/Utility/NXLogger.h @@ -10,6 +10,7 @@ #include <QMutex> #include <QDateTime> +//#include <QMutexLocker> namespace Nanorex { @@ -93,12 +94,14 @@ class NXLogger { void log(NXLogLevel logLevel, const std::string& source, const std::string& message) { + mutex.lock(); LogRecord logRecord(logLevel, source, message); std::list<NXLogHandler*>::iterator iter = logHandlers.begin(); while (iter != logHandlers.end()) { (*iter)->publish(logRecord); iter++; } + mutex.unlock(); } void addHandler(NXLogHandler* logHandler) { @@ -111,6 +114,7 @@ class NXLogger { static NXLogger* Instance() { return ThisInstance; } private: + QMutex mutex; std::list<NXLogHandler*> logHandlers; static NXLogger* ThisInstance; }; @@ -158,7 +162,7 @@ class NXConsoleLogHandler : public NXLogHandler { NXConsoleLogHandler(NXLogLevel logLevel) : NXLogHandler(logLevel) { } void publish(LogRecord logRecord) { if (logRecord.getLogLevel() >= logLevel) { - mutex.lock(); + //mutex.lock(); printf("%s [%-7s] %s %s\n", qPrintable(logRecord.getDateTime() .toString("yyyy-MM-dd hh:mm:ss.zzz")), @@ -167,7 +171,7 @@ class NXConsoleLogHandler : public NXLogHandler { "" : logRecord.getSource().append(":").c_str()), logRecord.getMessage().c_str()); fflush(0); - mutex.unlock(); + //mutex.unlock(); } } @@ -204,7 +208,7 @@ class NXFileLogHandler : public NXLogHandler { } void publish(LogRecord logRecord) { if ((filehandle != 0) && (logRecord.getLogLevel() >= logLevel)) { - mutex.lock(); + //mutex.lock(); fprintf(filehandle,"%s [%-7s] %s %s\n", qPrintable(logRecord.getDateTime() .toString("yyyy-MM-dd hh:mm:ss.zzz")), @@ -212,7 +216,7 @@ class NXFileLogHandler : public NXLogHandler { (logRecord.getSource().length() == 0 ? "" : logRecord.getSource().append(":").c_str()), logRecord.getMessage().c_str()); - mutex.unlock(); + //mutex.unlock(); } } diff --git a/cad/plugins/NanoVision-1/src/Interface/NXEntityManager.cpp b/cad/plugins/NanoVision-1/src/Interface/NXEntityManager.cpp index 0b9bca576..d5f2273ee 100644 --- a/cad/plugins/NanoVision-1/src/Interface/NXEntityManager.cpp +++ b/cad/plugins/NanoVision-1/src/Interface/NXEntityManager.cpp @@ -349,6 +349,7 @@ NXCommandResult* NXEntityManager::importFromFile(const string& filename, resultVector.push_back("not found"); result->setParamVector(resultVector); } + //PR_Unlock(importExportPluginsMutex); return result; } diff --git a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp index 33e53131d..4b41a5025 100644 --- a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp +++ b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp @@ -27,15 +27,18 @@ void GROMACS_JobMonitor::run() { emit startedMonitoring("GMX", initString, title); bool _aborted = aborted = false; + bool emittedJobAborted = false; bool monitorError = false; bool stillRunning = true; int status; static int bufferSize = 64; char buffer[bufferSize]; QString pid = initString; - QString command = QString("ps -A | grep %1").arg(pid); + QString command = QString("ps %1").arg(pid); FILE* commandPipe; - while (stillRunning && !_aborted && !monitorError) { + while (stillRunning && /*!_aborted &&*/ !monitorError) { + sleep(1); + commandPipe = popen(qPrintable(command), "r"); if (commandPipe == 0) { QString logMessage = tr("Command failed: %1").arg(command); @@ -45,10 +48,15 @@ void GROMACS_JobMonitor::run() { } stillRunning = false; +printf("%s output:\n", qPrintable(command)); while (fgets(buffer, bufferSize, commandPipe) != 0) { +printf("\t%s\n", buffer); string bufferString = buffer; + + // Remove spaces from beginning of line while ((bufferString.length() > 0) && (bufferString[0] == ' ')) bufferString = bufferString.substr(1); + if (bufferString.compare(0, pid.length(), qPrintable(pid)) == 0) stillRunning = true; } @@ -57,18 +65,16 @@ void GROMACS_JobMonitor::run() { if (status == -1) NXLOG_DEBUG("GROMACS_JobMonitor::run", "close pipe failed"); - if (stillRunning) { - sleep(1); - jobControlMutex.lock(); - _aborted = aborted; - jobControlMutex.unlock(); - } + jobControlMutex.lock(); + _aborted = aborted; + jobControlMutex.unlock(); } - if (_aborted) { + if (_aborted && !emittedJobAborted) { debugMessage = tr("Emitting jobAborted(%1)").arg(initString); NXLOG_DEBUG("GROMACS_JobMonitor", qPrintable(debugMessage)); emit jobAborted(initString); + emittedJobAborted = true; } else if (monitorError) { ;// TODO: handle this @@ -89,13 +95,58 @@ bool GROMACS_JobMonitor::CheckJobActive(const QString& pid) { /* FUNCTION: abortJob */ +#if defined(WIN32) +#include "windows.h" +#endif + void GROMACS_JobMonitor::abortJob() { QMutexLocker locker(&jobControlMutex); +#if defined(WIN32) + WCHAR mutexName[32]; + swprintf(mutexName, L"GMX_SIGTERM_Signal%d", initString.toInt()); +wprintf(L">>> mutexName=%s\n", mutexName); + + HANDLE mutex = NULL; + mutex = + CreateMutex( + NULL, // default security attributes + FALSE, // initially not owned + mutexName); // mutex name + + if (mutex != NULL) { +printf(">>> mutex created, not owned\n"); + // Once we can't lock the mutex it means that the GMX process has locked + // it and has thereby acknowledged its existence and the SIGTERM signal. + bool mutexLocked = false; + while (!mutexLocked) { + DWORD result = + WaitForSingleObject( + mutex, // handle to mutex + 0); // don't wait, just test + + if (result == WAIT_OBJECT_0) { +printf(">>> Got mutex\n"); fflush(0); + ReleaseMutex(mutex); + + } else { +printf(">>> mutex locked - GMX acks\n");fflush(0); + aborted = true; + mutexLocked = true; + } + sleep(1); + } + CloseHandle(mutex); + + } else { +printf(">>> couldn't create mutex\n"); + } +#else QString command = QString("kill -15 %1").arg(initString); int status = system(qPrintable(command)); if (status == 0) aborted = true; +#endif } diff --git a/cad/plugins/NanoVision-1/src/KDevelop/Interface/Interface.pro b/cad/plugins/NanoVision-1/src/KDevelop/Interface/Interface.pro index ca0c4fd85..efb479b67 100644 --- a/cad/plugins/NanoVision-1/src/KDevelop/Interface/Interface.pro +++ b/cad/plugins/NanoVision-1/src/KDevelop/Interface/Interface.pro @@ -22,8 +22,9 @@ HEADERS += \ INCLUDEPATH += ../../../include \ $(OPENBABEL_INCPATH) \ - ../../../src -# The "../../../src" is temporary for NXEntityManager to access an + ../../../src \ + $(HDF5_SIMRESULTS_INCPATH) +# The "../../../src" and $HDF5... are temporary for NXEntityManager to access an # HDF5_SimResultsImportExport plugin function directly. SOURCES += ../../Interface/NXDataStoreInfo.cpp \ diff --git a/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro b/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro index 11c214cac..d952815a6 100644 --- a/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro +++ b/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro @@ -29,6 +29,7 @@ INCLUDEPATH += ../../../../../../include \ ../../../../../../src \ ../../../../../../src/Plugins/RenderingEngines/OpenGL/GLT \ $(OPENBABEL_INCPATH) \ + $(HDF5_SIMRESULTS_INCPATH) \ ../../../../../../src/Plugins/RenderingEngines/OpenGL LIBS += -L$(OPENBABEL_LIBPATH) \ diff --git a/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro b/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro index 8e1aaf8d3..4bfc5e85d 100644 --- a/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro +++ b/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro @@ -71,6 +71,7 @@ RESOURCES += ../../application.qrc INCLUDEPATH += ../../../include \ $(OPENBABEL_INCPATH) \ + $(HDF5_SIMRESULTS_INCPATH) \ ../../Plugins/RenderingEngines/OpenGL/GLT \ ../../../src \ ../../../src/Plugins/RenderingEngines/OpenGL diff --git a/cad/plugins/NanoVision-1/src/LogHandlerWidget.cpp b/cad/plugins/NanoVision-1/src/LogHandlerWidget.cpp index 95bb05140..6c08e728c 100644 --- a/cad/plugins/NanoVision-1/src/LogHandlerWidget.cpp +++ b/cad/plugins/NanoVision-1/src/LogHandlerWidget.cpp @@ -14,7 +14,7 @@ LogHandlerWidget::LogHandlerWidget(NXLogLevel logLevel, QWidget* parent) /* FUNCTION: publish */ void LogHandlerWidget::publish(LogRecord logRecord) { if (logRecord.getLogLevel() >= logLevel) { - mutex.lock(); + //mutex.lock(); QString color = ""; QString bgcolor = ""; if (logRecord.getLogLevel() == 3) @@ -42,6 +42,6 @@ void LogHandlerWidget::publish(LogRecord logRecord) { if (logRecord.getLogLevel() > 2) emit raiseWidget(); - mutex.unlock(); + //mutex.unlock(); } } diff --git a/cad/plugins/NanoVision-1/src/LogHandlerWidget.h b/cad/plugins/NanoVision-1/src/LogHandlerWidget.h index e59fffd9b..487bc746e 100644 --- a/cad/plugins/NanoVision-1/src/LogHandlerWidget.h +++ b/cad/plugins/NanoVision-1/src/LogHandlerWidget.h @@ -29,7 +29,7 @@ class LogHandlerWidget : public QWidget, public NXLogHandler, void raiseWidget(); private: - QMutex mutex; + //QMutex mutex; }; #endif diff --git a/cad/plugins/NanoVision-1/src/Plugins/HDF5_SimResultsImportExport/HDF5_SimResultsImportExport.cpp b/cad/plugins/NanoVision-1/src/Plugins/HDF5_SimResultsImportExport/HDF5_SimResultsImportExport.cpp index 13b9b2262..3dadccabb 100644 --- a/cad/plugins/NanoVision-1/src/Plugins/HDF5_SimResultsImportExport/HDF5_SimResultsImportExport.cpp +++ b/cad/plugins/NanoVision-1/src/Plugins/HDF5_SimResultsImportExport/HDF5_SimResultsImportExport.cpp @@ -82,9 +82,10 @@ NXCommandResult* HDF5_SimResultsImportExport::importFromFile int runResult = -1; // 0=success, 1=still running, 2=failure, 3=aborted string failureDescription; simResults->getRunResult(runResult, failureDescription); - if (runResult == 1) + if (runResult == 1) { dataStoreInfo->setStoreComplete(frameSetId, false); - else { +printf("HDF5: setstorecomplete(false)\n");fflush(0); + } else { if (((frameIndex != 0) || (frameSetId != 0)) && !dataStoreInfo->storeIsComplete(frameSetId)) { // The data store just completed, read the results summary info @@ -92,6 +93,7 @@ NXCommandResult* HDF5_SimResultsImportExport::importFromFile dataStoreInfo->setResultsSummary(properties); } dataStoreInfo->setStoreComplete(frameSetId, true); +printf("HDF5: setStoreComplete(true)\n"); } } diff --git a/cad/plugins/NanoVision-1/src/nv1.cpp b/cad/plugins/NanoVision-1/src/nv1.cpp index 510f9587a..6c84c1734 100644 --- a/cad/plugins/NanoVision-1/src/nv1.cpp +++ b/cad/plugins/NanoVision-1/src/nv1.cpp @@ -423,6 +423,7 @@ void nv1::removeMonitoredJob(const QString& id) { delete abortJobAction; JobMonitor* jobMonitor = jobMonitors[id]; + jobMonitor->wait(); if (jobMonitor->isFinished()) delete jobMonitor; else |