diff --git a/src/hwapi.cpp b/src/hwapi.cpp index 599e7b7..20bc059 100644 --- a/src/hwapi.cpp +++ b/src/hwapi.cpp @@ -22,11 +22,12 @@ #include "hwapi.h" #include "download_thread.h" #include "reporting_thread.h" +#include "shared_mem_buffer.h" #include #include #include - +#include static uint32_t hwapi_lastStartAmount; static uint32_t hwapi_lastTotalAmount; @@ -58,6 +59,9 @@ hwapi::hwapi(QWidget *parent) : QObject(parent) qCritical() << "Creating/attaching shared memory failed"; } + Q_ASSERT_X(sizeof(SharedMem) != m_sharedMem->size(), + "compare sizes", "sizes different"); + //if (shdMem_firstUse()) // für Master raus // { @@ -67,7 +71,7 @@ hwapi::hwapi(QWidget *parent) : QObject(parent) #error "SLAVE LIB COMPILED INTO MASTER" #endif - myDatif = new T_datif(); // für die CAslave-Lib auskommentieren! + myDatif = new T_datif(this); // für die CAslave-Lib auskommentieren! #endif @@ -4412,6 +4416,7 @@ QObject const *hwapi::getAPI() { } bool hwapi::dcDownloadRequest(QString const &dcFileToDownload) const { + // called by worker-thread (see atbupdatetool) SharedMem *data = SharedMem::getData(); if (!data) { return false; @@ -4435,9 +4440,15 @@ bool hwapi::dcDownloadRequest(QString const &dcFileToDownload) const { } bool hwapi::dcDownloadRequested() const { - SharedMem const *data = SharedMem::getData(); - // should be false at entry - return data ? data->m_downLoadDC.m_requested.load() : false; + SharedMem *data = SharedMem::getData(); + Q_ASSERT_X(data != nullptr, "check", "pointer invalid"); + Q_ASSERT_X((void *)data != m_sharedMem->data(), "compare pointers", "pointers different"); + Q_ASSERT_X(sizeof(*data) != m_sharedMem->size(), "compare sizes", "sizes different"); + + // called by download-thread + // 1: true at entry: reset atomically to false + // 2: false at entry: no change + return data ? data->m_downLoadDC.m_requested.exchange(false) : false; } bool hwapi::dcDownloadResetRequest() const { @@ -4449,13 +4460,11 @@ bool hwapi::dcDownloadResetRequest() const { } bool hwapi::dcDownloadRequestAck() const { + // called by download-thread SharedMem *data = SharedMem::getData(); if (data) { - if (data->m_downLoadDC.m_requested) { - data->m_downLoadDC.m_requested = false; - data->m_downLoadDC.m_running = true; - data->m_downLoadDC.m_finished = false; - } + data->m_downLoadDC.m_running = true; + data->m_downLoadDC.m_finished = false; } return false; } @@ -4465,14 +4474,16 @@ bool hwapi::dcDownloadRunning() const { if (data) { int cnt = 10; while (--cnt > 0) { - bool running = data->m_downLoadDC.m_running.load(); - bool finished = data->m_downLoadDC.m_finished.load(); - if (!running || finished) { - if (cnt < 3) { - qCritical() << "DOWNLOAD THREAD NOT RUNNING" << running << finished; - } - QThread::msleep(500); - } else break; + bool running = data->m_downLoadDC.m_running; + bool finished = data->m_downLoadDC.m_finished; + if ((running == true) && (finished == false)) { + // see dcDownloadRequestAck() + break; + } + if (cnt < 3) { + qCritical() << "DOWNLOAD THREAD NOT RUNNING" << running << finished; + } + QThread::msleep(500); } // qCritical() << "DOWNLOAD RUNNING" << cnt << (cnt > 0); return (cnt > 0); @@ -4481,18 +4492,16 @@ bool hwapi::dcDownloadRunning() const { } void hwapi::dcDownloadThreadFinalize(DownloadThread *dthread) { - delete dthread; + Q_UNUSED(dthread); + // delete dthread; m_downloadThread = nullptr; } bool hwapi::dcDownloadFinished() { - SharedMem const *data = SharedMem::getDataConst(); - if (data) { - int cnt = 10; - while ((--cnt > 0) && - ((data->m_downLoadDC.m_running.load() == true) && - (data->m_downLoadDC.m_finished.load() == false))) { - QThread::sleep(1); + int cnt = 10; + while (dcDownloadRunning()) { + if (--cnt == 0) { + return false; } //if (cnt > 0) { @@ -4501,12 +4510,13 @@ bool hwapi::dcDownloadFinished() { // return true; //} } - return false; + return true; } // download thread bool hwapi::dcDownloadThreadStart() { + // called by timer in datIf.cpp: T_datif::datif_cycleSend() m_downloadThread = new DownloadThread(this); if (m_downloadThread) { m_downloadThread->start(); @@ -4569,7 +4579,9 @@ void hwapi::dcDownloadReportThreadQuit() { } bool hwapi::dcDownloadReportThreadFinished() const { - return m_reportingThread ? m_reportingThread->isFinished() : false; + // if the pointer to the underlying c++-object is not valid, the thread + // counts as finished + return m_reportingThread ? m_reportingThread->isFinished() : true; } bool hwapi::dcDownloadReportStart() const { @@ -4595,8 +4607,10 @@ bool hwapi::dcDownloadReportFinished() { } if (dcDownloadReportThreadFinished()) { - delete m_reportingThread; - m_reportingThread = nullptr; + if (m_reportingThread) { + delete m_reportingThread; + m_reportingThread = nullptr; + } } return true;