| 194 | } |
| 195 | |
| 196 | void Manager::shutdown() |
| 197 | { |
| 198 | if (m_shutdown) |
| 199 | return; |
| 200 | |
| 201 | m_shutdown = true; |
| 202 | |
| 203 | m_workingSemaphore.release(); |
| 204 | m_cleanupSemaphore.enter(); |
| 205 | |
| 206 | MutexLockGuard guard(m_queueMutex, FB_FUNCTION); |
| 207 | |
| 208 | // Clear the processing queue |
| 209 | |
| 210 | for (auto buffer : m_queue) |
| 211 | { |
| 212 | if (buffer) |
| 213 | releaseBuffer(buffer); |
| 214 | } |
| 215 | |
| 216 | m_queue.clear(); |
| 217 | |
| 218 | // Detach from synchronous replicas |
| 219 | |
| 220 | for (auto iter : m_replicas) |
| 221 | { |
| 222 | iter->replicator->release(); |
| 223 | iter->attachment->release(); |
| 224 | delete iter; |
| 225 | } |
| 226 | |
| 227 | m_replicas.clear(); |
| 228 | } |
| 229 | |
| 230 | UCharBuffer* Manager::getBuffer() |
| 231 | { |