| helics 3.6.1

IpcBlockingPriorityQueueImpl.hpp
1 /*
2 Copyright (c) 2017-2018,
3 Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Sustainable
4 Energy, LLC All rights reserved. See LICENSE file and DISCLAIMER for more details.
5 */
6 #pragma once
7
8 #include "helics/external/optional.hpp"
9
10 #include <boost/interprocess/mapped_region.hpp>
11 #include <boost/interprocess/shared_memory_object.hpp>
12 #include <boost/interprocess/sync/interprocess_condition.hpp>
13 #include <boost/interprocess/sync/interprocess_mutex.hpp>
14 #include <chrono>
15 #include <utility>
16
17 namespace helics {
18 namespace ipc {
19 namespace detail {
20 struct dataIndex {
21 int32_t offset;
22 int32_t dataSize;
23 };
25 class dataBlock {
26 private:
27 unsigned char* origin = nullptr;
28 unsigned char* next = nullptr;
29 size_t totalSize = 0;
30 dataIndex* next = nullptr;
31 int dataCount = 0;
32
33 public:
34 dataBlock(unsigned char* newBlock, size_t blockSize);
35
36 void swap(dataBlock& other) noexcept;
37
38 int getCurrentCount() const { return dataCount; }
39 bool isSpaceAvaialble(int sz) const;
40 bool empty() const { return (dataCount == 0); }
41
42 bool push(const unsigned char* block, int blockSize);
43
44 int next_data_size() const;
45
46 int pop(unsigned char* block);
47
49 void reverse();
51 void clear();
52 };
58 class IpcBlockingPriorityQueueImpl {
59 private:
60 mutable boost::interprocess::interprocess_mutex
61 m_pushLock;
62 dataBlock pushData;
63 mutable boost::interprocess::interprocess_mutex
64 m_pullLock;
65 dataBlock pullData;
66 mutable boost::interprocess::interprocess_mutex
67 m_conditionLock;
68 bool queueEmptyFlag{true};
69 bool queueFullFlag{false};
70 // the condition variable should be keyed of the conditionLock
71 boost::interprocess::interprocess_condition
72 condition_empty;
73 boost::interprocess::interprocess_condition
74 condition_full;
75 unsigned char* data1 = nullptr;
76 unsigned char* data2 = nullptr;
77 size_t data1Size = 0;
78 size_t data2Size = 0;
79 unsigned char* dataPriority = nullptr;
80 size_t dataPrioritySize = 0;
81
82 public:
84 IpcBlockingPriorityQueueImpl(void* dataBlock, size_t blockSize);
85
87 void clear();
88
90 IpcBlockingPriorityQueueImpl(const IpcBlockingPriorityQueueImpl&) = delete;
91 IpcBlockingPriorityQueueImpl& operator=(const IpcBlockingPriorityQueueImpl&) = delete;
92
96 void push(const unsigned char* data, size_t size);
100 void pushPriority(const unsigned char* data, size_t size);
104 bool try_push(const unsigned char* data, size_t size);
105
109 bool try_pushPriority(const unsigned char* data, size_t size);
110
115 stx::optional<std::pair<unsigned char*, int>> try_peek() const;
116
121 bool try_pop(unsigned char* data, int maxSize);
122
123 int pop(unsigned char* data, int maxSize);
124
126 void pop(std::chrono::milliseconds timeout, unsigned char* data, int maxSize);
127
132 bool empty() const;
133 };
134
135 } // namespace detail
136 } // namespace ipc
137 } // namespace helics
helics::ipc::detail::IpcBlockingPriorityQueueImpl
Definition: IpcBlockingPriorityQueueImpl.hpp:58
helics::ipc::detail::IpcBlockingPriorityQueueImpl::IpcBlockingPriorityQueueImpl
IpcBlockingPriorityQueueImpl(void *dataBlock, size_t blockSize)
Definition: IpcBlockingPriorityQueueImpl.cpp:35
helics::ipc::detail::IpcBlockingPriorityQueueImpl::IpcBlockingPriorityQueueImpl
IpcBlockingPriorityQueueImpl(const IpcBlockingPriorityQueueImpl &)=delete
helics::ipc::detail::IpcBlockingPriorityQueueImpl::try_peek
stx::optional< std::pair< unsigned char *, int > > try_peek() const
helics::ipc::detail::IpcBlockingPriorityQueueImpl::clear
void clear()
Definition: IpcBlockingPriorityQueueImpl.cpp:41
helics::ipc::detail::IpcBlockingPriorityQueueImpl::pushPriority
void pushPriority(const unsigned char *data, size_t size)
helics::ipc::detail::IpcBlockingPriorityQueueImpl::try_push
bool try_push(const unsigned char *data, size_t size)
helics::ipc::detail::IpcBlockingPriorityQueueImpl::empty
bool empty() const
helics::ipc::detail::IpcBlockingPriorityQueueImpl::push
void push(const unsigned char *data, size_t size)
Definition: IpcBlockingPriorityQueueImpl.cpp:55
helics::ipc::detail::IpcBlockingPriorityQueueImpl::pop
void pop(std::chrono::milliseconds timeout, unsigned char *data, int maxSize)
helics::ipc::detail::IpcBlockingPriorityQueueImpl::try_pop
bool try_pop(unsigned char *data, int maxSize)
helics::ipc::detail::IpcBlockingPriorityQueueImpl::try_pushPriority
bool try_pushPriority(const unsigned char *data, size_t size)
helics::ipc::detail::dataBlock
Definition: IpcBlockingPriorityQueueImpl.hpp:25
helics::ipc::detail::dataBlock::reverse
void reverse()
Definition: IpcBlockingPriorityQueueImpl.cpp:30
helics::ipc::detail::dataBlock::clear
void clear()
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::ipc::detail::dataIndex
Definition: IpcBlockingPriorityQueueImpl.hpp:20