3232
3333#include " parallelOmpLogic.hpp"
3434
35+ int opdi::ParallelOmpLogic::skipParallelHandling = 0 ;
36+
3537void opdi::ParallelOmpLogic::reverseFunc (void * dataPtr) {
3638
3739 Data* data = (Data*) dataPtr;
@@ -42,6 +44,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
4244 }
4345 #endif
4446
47+ ++ParallelOmpLogic::skipParallelHandling;
48+
4549 #pragma omp parallel num_threads(data->actualThreads)
4650 {
4751 int threadNum = omp_get_thread_num ();
@@ -70,6 +74,8 @@ void opdi::ParallelOmpLogic::reverseFunc(void* dataPtr) {
7074 data->adjointAccessModes [threadNum][j - 1 ] == AdjointAccessMode::Atomic);
7175 }
7276
77+ --ParallelOmpLogic::skipParallelHandling;
78+
7379 tool->setThreadLocalTape (oldTape);
7480
7581 #if OPDI_OMP_LOGIC_INSTRUMENT
@@ -90,6 +96,8 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
9096
9197 Data* data = (Data*) dataPtr;
9298
99+ ++ParallelOmpLogic::skipParallelHandling;
100+
93101 // this triggers possibly pending implicit task end events
94102 #pragma omp parallel num_threads(data->actualThreads)
95103 {
@@ -108,13 +116,15 @@ void opdi::ParallelOmpLogic::deleteFunc(void* dataPtr) {
108116 }
109117 }
110118
119+ --ParallelOmpLogic::skipParallelHandling;
120+
111121 delete [] data->tapes ;
112122 delete data;
113123}
114124
115125void * opdi::ParallelOmpLogic::onParallelBegin (int maxThreads) {
116126
117- if (tool->getThreadLocalTape () != nullptr ) {
127+ if (tool->getThreadLocalTape () != nullptr && ParallelOmpLogic::skipParallelHandling == 0 ) {
118128
119129 Data* data = new Data;
120130
@@ -166,8 +176,9 @@ void opdi::ParallelOmpLogic::onParallelEnd(void* dataPtr) {
166176 tool->pushExternalFunction (data->masterTape , handle);
167177
168178 // do not delete data, it is deleted with the handle
179+
169180 } else {
170- delete data;
181+ deleteFunc ( data) ;
171182 }
172183 }
173184 #if OPDI_OMP_LOGIC_INSTRUMENT
0 commit comments