A platform for high-performance distributed tool and library development written in C++. It can be deployed in two different cluster modes: standalone or distributed. API for v0.5.0, released on June 13, 2018.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
PDBWorker.cc
Go to the documentation of this file.
1 /*****************************************************************************
2  * *
3  * Copyright 2018 Rice University *
4  * *
5  * Licensed under the Apache License, Version 2.0 (the "License"); *
6  * you may not use this file except in compliance with the License. *
7  * You may obtain a copy of the License at *
8  * *
9  * http://www.apache.org/licenses/LICENSE-2.0 *
10  * *
11  * Unless required by applicable law or agreed to in writing, software *
12  * distributed under the License is distributed on an "AS IS" BASIS, *
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
14  * See the License for the specific language governing permissions and *
15  * limitations under the License. *
16  * *
17  *****************************************************************************/
18 
19 #ifndef PDB_WORKER_C
20 #define PDB_WORKER_C
21 
22 #include "Allocator.h"
23 #include "LockGuard.h"
24 #include "PDBWorker.h"
25 #include <iostream>
26 
27 namespace pdb {
28 
29 PDBWorker::PDBWorker(PDBWorkerQueue* parentIn) : parent(parentIn) {
30  pthread_mutex_init(&workerMutex, nullptr);
31  pthread_cond_init(&workToDoSignal, nullptr);
32  okToExecute = false;
33 }
34 
36  return parent->getWorker();
37 }
38 
40  return parent->getLogger();
41 }
42 
43 void PDBWorker::execute(PDBWorkPtr runMeIn, PDBBuzzerPtr buzzWhenDoneIn) {
44  const LockGuard guard{workerMutex};
45  runMe = runMeIn;
46  buzzWhenDone = buzzWhenDoneIn;
47  okToExecute = true;
48  pthread_cond_signal(&workToDoSignal);
49 }
50 
52  if (buzzWhenDone != nullptr) {
53  buzzWhenDone->buzz(withMe);
54  }
55 }
56 
58 
59  // wait for someone to tell us it is OK to do work
60  {
61  const LockGuard guard{workerMutex};
62  while (okToExecute == false) {
63  pthread_cond_wait(&workToDoSignal, &workerMutex);
64  }
65  }
66  getAllocator().cleanInactiveBlocks((size_t)(67108844));
67  getAllocator().cleanInactiveBlocks((size_t)(12582912));
68  // then do the work
69  runMe->execute(parent, buzzWhenDone);
70  okToExecute = false;
71 }
72 
74  runMe = nullptr;
75  buzzWhenDone = nullptr;
76 }
77 
79  pthread_mutex_destroy(&workerMutex);
80  pthread_cond_destroy(&workToDoSignal);
81 }
82 }
83 
84 #endif
pthread_mutex_t workerMutex
Definition: PDBWorker.h:85
PDBWorkerPtr getWorker()
bool okToExecute
Definition: PDBWorker.h:89
void enter()
Definition: PDBWorker.cc:57
Allocator & getAllocator()
Definition: Allocator.cc:943
shared_ptr< PDBWork > PDBWorkPtr
Definition: PDBWork.h:47
PDBWorkerQueue * parent
Definition: PDBWorker.h:76
void execute(PDBWorkPtr runMe, PDBBuzzerPtr myBuzzer)
Definition: PDBWorker.cc:43
PDBWorkPtr runMe
Definition: PDBWorker.h:79
void reset()
Definition: PDBWorker.cc:73
PDBBuzzerPtr buzzWhenDone
Definition: PDBWorker.h:82
shared_ptr< PDBBuzzer > PDBBuzzerPtr
Definition: PDBBuzzer.h:32
PDBWorkerPtr getWorker()
Definition: PDBWorker.cc:35
shared_ptr< PDBWorker > PDBWorkerPtr
Definition: PDBWorker.h:40
pthread_cond_t workToDoSignal
Definition: PDBWorker.h:86
PDBAlarm
Definition: PDBAlarm.h:28
std::shared_ptr< PDBLogger > PDBLoggerPtr
Definition: PDBLogger.h:40
PDBWorker(PDBWorkerQueue *parent)
Definition: PDBWorker.cc:29
void soundBuzzer(PDBAlarm withMe)
Definition: PDBWorker.cc:51
PDBLoggerPtr getLogger()
Definition: PDBWorker.cc:39
PDBLoggerPtr getLogger()