Lattice Microbes 2.5
This is for whole cell modeling
Loading...
Searching...
No Matches
DataOutputQueue.h
Go to the documentation of this file.
1/*
2 * University of Illinois Open Source License
3 * Copyright 2008-2018 Luthey-Schulten Group,
4 * All rights reserved.
5 *
6 * Developed by: Luthey-Schulten Group
7 * University of Illinois at Urbana-Champaign
8 * http://www.scs.uiuc.edu/~schulten
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy of
11 * this software and associated documentation files (the Software), to deal with
12 * the Software without restriction, including without limitation the rights to
13 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
14 * of the Software, and to permit persons to whom the Software is furnished to
15 * do so, subject to the following conditions:
16 *
17 * - Redistributions of source code must retain the above copyright notice,
18 * this list of conditions and the following disclaimers.
19 *
20 * - Redistributions in binary form must reproduce the above copyright notice,
21 * this list of conditions and the following disclaimers in the documentation
22 * and/or other materials provided with the distribution.
23 *
24 * - Neither the names of the Luthey-Schulten Group, University of Illinois at
25 * Urbana-Champaign, nor the names of its contributors may be used to endorse or
26 * promote products derived from this Software without specific prior written
27 * permission.
28 *
29 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
32 * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
33 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
34 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
35 * OTHER DEALINGS WITH THE SOFTWARE.
36 *
37 * Author(s): Elijah Roberts
38 */
39
40#ifndef LM_MAIN_DATAOUTPUTQUEUE
41#define LM_MAIN_DATAOUTPUTQUEUE
42
43#include <queue>
44#include <list>
45#include <google/protobuf/message.h>
46#include "core/Exceptions.h"
47#include "core/Types.h"
48#include "core/Print.h"
49#include "thread/Thread.h"
50#include "io/ArbitraryH5.h"
51
52using std::queue;
54
55
56
57namespace lm {
58namespace main {
59
63{
64protected:
67 class DataSet
68 {
69 public:
71 DataSet() : size(0), data(NULL) {}
72 DataSet(size_t size):size(size) {data=new byte[size];}
76 DataSet(void * origData, size_t size):size(size) {data=new byte[size]; memcpy(data, origData, size);}
77 virtual ~DataSet() {delete [] data; data=NULL;}
78
79 // Internal variables
80 byte * data;
81 size_t size;
82 };
83
84public:
85 static const uint SPECIES_COUNTS = 10;
86 static const uint FIRST_PASSAGE_TIMES = 11;
87 static const uint PARAMETER_VALUES = 12;
88 static const uint BYTE_LATTICE = 20;
89 static const uint INT_LATTICE = 21;
90 static const uint SITE_LATTICE = 22;
91 static const uint ARBITRARY_H5 = 23;
92 static const uint ARBITRARY_H5_READ = 24;
93
94public:
97 static void setInstance(DataOutputQueue * instance);
100 static DataOutputQueue * getInstance();
101
102private:
103 static DataOutputQueue * instance; // Singleton like "active" output queue
104
105public:
108 virtual ~DataOutputQueue();
109
116 virtual void pushDataSet(uint type, uint replicate, ::google::protobuf::Message * message, void * payload=NULL, size_t payloadSize=0, void (*payloadSerializer)(void *, void *, size_t)=NULL);
120 virtual void pushDataSet(void * data, size_t dataSize);
123 virtual void pushDataSet(DataSet * dataSet);
124
125 virtual void pushDataSet(const H5MetaData md, uint replicate, void * payload);
126protected:
127 pthread_mutex_t dataMutex; // A lock for multithreaded applications
128 queue<DataSet *> dataQueue; // Queue for data to be added to
129
130 pthread_mutex_t returnMutex;
131 std::list<DataSet *> returnList;
132 pthread_cond_t returnAvailable;
133
134public:
135
136 template <typename T>
137 void
138 queryH5(const H5Lookup::Mode mode, H5MetaData &hdr, std::vector<T> &payload, const uint replicate,
139 const std::string path, const std::string attr="")
140 {
141 Print::printf(Print::INFO, "in queryH5");
142 H5Lookup req = make_H5_lookup(mode, path, attr);
143 size_t buffer_sz = sizeof(req)+req.payloadSize;
145 DataSet* dataSet = new DataSet(buffer_sz);
146 H5Lookup *md_ptr = reinterpret_cast<H5Lookup *>(dataSet->data);
147 *md_ptr = req;
148 md_ptr->type = ARBITRARY_H5_READ;
149 md_ptr->replicate = replicate;
150 pushDataSet(dataSet);
151 payload.clear();
152
153 while (payload.size() == 0) {
155 Print::printf(Print::INFO, "pre returnMutex");
156 PTHREAD_EXCEPTION_CHECK(pthread_mutex_lock(&returnMutex));
157 Print::printf(Print::INFO, "pre cond_wait");
159 Print::printf(Print::INFO, "post cond_wait");
160 std::list<DataSet *>::iterator it=returnList.begin();
161 while (it != returnList.end()) {
162 hdr = *reinterpret_cast<H5MetaData *>((*it)->data);
163 if (hdr.replicate == replicate) {
164 T *ds = reinterpret_cast<T*>((*it)->data + sizeof(H5MetaData));
165 payload.resize(hdr.payloadSize/sizeof(T));
166 std::copy(ds, ds+hdr.payloadSize/sizeof(T), payload.begin());
167 returnList.erase(it);
168 PTHREAD_EXCEPTION_CHECK(pthread_mutex_unlock(&returnMutex));
169 return;
170 }
171 it++;
172 }
173 PTHREAD_EXCEPTION_CHECK(pthread_mutex_unlock(&returnMutex));
175 }
176 }
177
178 template <typename T>
179 T
180 queryH5attr(const uint replicate, const std::string path, const std::string attr)
181 {
182 std::vector<T> payload;
183 H5MetaData hdr;
184 queryH5(H5Lookup::ATTR, hdr, payload, replicate, path, attr);
185 if (hdr.ndim == 1 && hdr.shape[0] == 1) {
186 return payload[0];
187 }
188 else {
189 throw Exception("Got non-scalar from HDF5 attribute lookup");
190 }
191 }
192};
193
194}
195}
196
197
198#endif
hid_t get_h5_type_id()
H5Lookup make_H5_lookup(H5Lookup::Mode mode, const std::string path, const std::string attr="")
Definition ArbitraryH5.h:132
#define PTHREAD_EXCEPTION_CHECK(pthread_call)
Exception wrapping for the pthread api.
Definition Thread.h:100
unsigned int uint
Definition Types.h:52
Base class for exceptions.
Definition Exceptions.h:55
static const int INFO
Definition Print.h:56
static void printf(int level, const char *fmt,...)
Prints to the console at varying levels of verbosity or "Severity".
Definition Print.cpp:70
A set of data in the form of bytes to be written to disk.
Definition DataOutputQueue.h:68
DataSet()
Create an empty DataSet object.
Definition DataOutputQueue.h:71
size_t size
Definition DataOutputQueue.h:81
DataSet(void *origData, size_t size)
Create a DataSet object with a set of data.
Definition DataOutputQueue.h:76
byte * data
Definition DataOutputQueue.h:80
virtual ~DataSet()
Definition DataOutputQueue.h:77
DataSet(size_t size)
Definition DataOutputQueue.h:72
pthread_mutex_t returnMutex
Definition DataOutputQueue.h:130
static const uint SITE_LATTICE
Definition DataOutputQueue.h:90
static const uint SPECIES_COUNTS
Definition DataOutputQueue.h:85
static const uint PARAMETER_VALUES
Definition DataOutputQueue.h:87
DataOutputQueue()
Create a DataOutputQueue.
Definition DataOutputQueue.cpp:62
pthread_mutex_t dataMutex
Definition DataOutputQueue.h:127
virtual ~DataOutputQueue()
Definition DataOutputQueue.cpp:69
static const uint ARBITRARY_H5
Definition DataOutputQueue.h:91
static const uint FIRST_PASSAGE_TIMES
Definition DataOutputQueue.h:86
T queryH5attr(const uint replicate, const std::string path, const std::string attr)
Definition DataOutputQueue.h:180
static const uint ARBITRARY_H5_READ
Definition DataOutputQueue.h:92
queue< DataSet * > dataQueue
Definition DataOutputQueue.h:128
static void setInstance(DataOutputQueue *instance)
Sets the current DataOutputQueue that is active.
Definition DataOutputQueue.cpp:52
void queryH5(const H5Lookup::Mode mode, H5MetaData &hdr, std::vector< T > &payload, const uint replicate, const std::string path, const std::string attr="")
Definition DataOutputQueue.h:138
static const uint INT_LATTICE
Definition DataOutputQueue.h:89
virtual void pushDataSet(uint type, uint replicate, ::google::protobuf::Message *message, void *payload=NULL, size_t payloadSize=0, void(*payloadSerializer)(void *, void *, size_t)=NULL)
Put some data on the queue to be output.
Definition DataOutputQueue.cpp:91
static const uint BYTE_LATTICE
Definition DataOutputQueue.h:88
pthread_cond_t returnAvailable
Definition DataOutputQueue.h:132
static DataOutputQueue * getInstance()
Get the current DataOuputQueue tht is active.
Definition DataOutputQueue.cpp:57
std::list< DataSet * > returnList
Definition DataOutputQueue.h:131
An Exception class for handling pthread exceptions.
Definition Thread.h:53
Definition CheckpointSignaler.cpp:57
Definition SimulationParameters.h:51
Definition Capsule.cpp:46
Definition ArbitraryH5.h:56
Mode
Definition ArbitraryH5.h:57
@ ATTR
Definition ArbitraryH5.h:59
hid_t h5type
Definition ArbitraryH5.h:67
unsigned int replicate
Definition ArbitraryH5.h:62
size_t payloadSize
Definition ArbitraryH5.h:68
unsigned int type
Definition ArbitraryH5.h:61
Definition ArbitraryH5.h:72
size_t payloadSize
Definition ArbitraryH5.h:86
size_t ndim
Definition ArbitraryH5.h:83
size_t shape[H5S_MAX_RANK]
Definition ArbitraryH5.h:84
unsigned int replicate
Definition ArbitraryH5.h:79