/** * @file * @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) * @copyright Simplified BSD * * @cond * This program is free software: you can redistribute it and/or modify * it under the terms of the FreeBSD license as published by the FreeBSD * project. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the FreeBSD license along with this * program. If not, see . * @endcond */ #include "BasicEventQueue.h" #include // for evutil_socket_t #include #include //#include #include "uscxml/interpreter/Logging.h" namespace uscxml { BasicEventQueue::BasicEventQueue() { } BasicEventQueue::~BasicEventQueue() { } Event BasicEventQueue::dequeue(size_t blockMs) { std::lock_guard lock(_mutex); if (blockMs > 0) { // block for given milliseconds or until queue is non-empty auto endTime = std::chrono::system_clock::now() + std::chrono::milliseconds(blockMs); // std::time_t ttp = std::chrono::system_clock::to_time_t(endTime); // std::cout << "End: " << ttp << std::endl; // std::cout << "Now: " << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl; while (endTime > std::chrono::system_clock::now() && _queue.empty()) { _cond.wait_until(_mutex, endTime); // std::cout << "Aft: " << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl; // std::cout << blockMs << "."; } } if (_queue.size() > 0) { Event event = _queue.front(); _queue.pop_front(); // LOG(USCXML_ERROR) << event.name; return event; } return Event(); } void BasicEventQueue::enqueue(const Event& event) { std::lock_guard lock(_mutex); _queue.push_back(event); _cond.notify_all(); } void BasicEventQueue::reset() { std::lock_guard lock(_mutex); _queue.clear(); } std::shared_ptr BasicEventQueue::create() { return std::shared_ptr(new BasicEventQueue()); } }