summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Helfrich <helfrich9000@gmail.com>2008-03-17 17:36:10 +0000
committerBrian Helfrich <helfrich9000@gmail.com>2008-03-17 17:36:10 +0000
commitbe5ba89f1805e292b5ed94e99e30888c63ef9f9c (patch)
tree17d8599fee5070e61ecdaae9d79567bb68fc6cbe
parent06793eb0801610a1ab186794693e9e51979beadf (diff)
downloadnanoengineer-be5ba89f1805e292b5ed94e99e30888c63ef9f9c.tar.gz
nanoengineer-be5ba89f1805e292b5ed94e99e30888c63ef9f9c.zip
Added mechanisms to get job management working on Windows.
-rw-r--r--cad/plugins/NanoVision-1/include/Nanorex/Interface/NXEntityManager.h13
-rw-r--r--cad/plugins/NanoVision-1/include/Nanorex/Utility/NXLogger.h12
-rw-r--r--cad/plugins/NanoVision-1/src/Interface/NXEntityManager.cpp1
-rw-r--r--cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp69
-rw-r--r--cad/plugins/NanoVision-1/src/KDevelop/Interface/Interface.pro5
-rw-r--r--cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro1
-rw-r--r--cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro1
-rw-r--r--cad/plugins/NanoVision-1/src/LogHandlerWidget.cpp4
-rw-r--r--cad/plugins/NanoVision-1/src/LogHandlerWidget.h2
-rw-r--r--cad/plugins/NanoVision-1/src/Plugins/HDF5_SimResultsImportExport/HDF5_SimResultsImportExport.cpp6
-rw-r--r--cad/plugins/NanoVision-1/src/nv1.cpp1
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