11 #ifndef _UGCS_VSM_REQUEST_CONTAINER_H_
12 #define _UGCS_VSM_REQUEST_CONTAINER_H_
20 #include <condition_variable>
88 typedef std::unique_lock<std::mutex>
Locker;
100 Set_processing_handler(
const Handler &handler);
104 Set_processing_handler(Handler &&handler);
115 const Handler &handler);
138 Set_cancellation_handler(
const Handler &handler);
142 Set_cancellation_handler(Handler &&handler);
152 Set_done_handler(Handler &handler);
156 Set_done_handler(Handler &&handler);
162 Get_completion_context(Locker locker = Locker())
const;
174 Process(
bool process_request);
199 Cancel(Locker locker = Locker());
212 Abort(Locker locker = Locker());
224 Lock(
bool acquire =
true)
const;
237 return status >= Status::RESULT_CODES;
247 return !Is_completed() && Get_status() != Status::ABORT_PENDING;
254 return status == Status::ABORTED || status == Status::ABORT_PENDING;
261 return status == Status::PROCESSING;
268 return completion_delivered;
277 return completion_processed && !completion_handler;
286 return Is_completion_delivered() || Is_aborted();
301 Wait_done(
bool process_ctx =
true,
302 std::chrono::milliseconds timeout = std::chrono::milliseconds::zero());
325 Is_completion_handler_present();
329 Handler processing_handler;
331 Handler completion_handler;
335 Handler cancellation_handler;
339 Handler done_handler;
346 bool timed_out =
false;
347 std::atomic<Status> status = { Status::PENDING };
349 std::atomic_bool completion_processed = {
false },
351 completion_delivered = {
false };
353 mutable std::mutex mutex;
355 std::condition_variable cond_var;
403 std::chrono::milliseconds timeout = std::chrono::milliseconds::zero(),
404 int requests_limit = 0, Predicate predicate = Predicate());
421 std::chrono::milliseconds timeout = std::chrono::milliseconds::zero(),
422 int requests_limit = 0, Predicate predicate = Predicate());
433 std::condition_variable cond_var;
438 template <class Container_list>
440 Wait_and_process_impl(const Container_list &containers,
441 std::chrono::milliseconds timeout,
442 int requests_limit, Predicate ext_predicate);
452 COMPLETION_CONTEXT = 0x2,
454 ANY = PROCESSOR | COMPLETION_CONTEXT,
458 TEMP_COMPLETION_CONTEXT = COMPLETION_CONTEXT | TEMPORAL
463 const std::string& name,
480 return static_cast<int>(
Get_type()) & static_cast<int>(mask);
516 Process_requests(std::unique_lock<std::mutex> &lock,
int requests_limit = 0);
622 std::atomic_bool is_enabled = {
false };
625 std::atomic_bool disable_ongoing = {
false };
631 std::atomic_bool abort_ongoing = {
false };
634 const std::string name;
637 std::list<Request::Ptr> aborted_request_queue;
659 Locker(
const Locker &) =
delete;
void Submit_request_locked(Request::Ptr request, Request_waiter::Locker locker)
The same as Submit_request, but with previously acquired lock of the associated waiter.
virtual void Notify()
Notify all listeners about request submission.
bool Is_completion_delivering_started() const
Check if the request completion handler already invoked (but might not be returned yet...
Definition: request_container.h:275
Generic request for implementing inter-threads communications and asynchronous operations.
Definition: request_container.h:37
void Set_disabled()
Disable the container and notify its waiter.
None type used in base class.
std::list< Request::Ptr > request_queue
Queue of pending requests, i.e.
Definition: request_container.h:568
void Disable()
Disable the container.
virtual Type Get_type() const
Get this container type.
Definition: request_container.h:471
Request_waiter::Ptr waiter
Waiter associated with this container.
Definition: request_container.h:564
bool & Timed_out()
Access timed_out member.
Definition: request_container.h:306
virtual void Process_request(Request::Ptr request)=0
Process request.
virtual void On_enable()
Called when the container is enabled.
virtual void On_wait_and_process()
Called when default processing loop want to wait for work and process it.
Request_container::Request_waiter Request_waiter
Request waiter type for convenient usage.
Definition: request_container.h:641
Callback_base< void >::Ptr<> Handler
Callback denoting a handler of the request.
Definition: request_container.h:86
Callback which can be executed.
Definition: callback.h:86
Locker Lock_notify()
Acquire lock for request submission.
Generic callback which can be used to define and create an instance of an abstract callable operation...
bool Is_request_processing_needed() const
Return true only if the request processing (i.e.
Definition: request_container.h:244
Request_waiter::Ptr Get_waiter() const
Get request waiter associated with this container.
Definition: request_container.h:527
Various common utilities.
std::shared_ptr< Request > Ptr
Pointer type.
Definition: request_container.h:38
Helper class for RAII-based locking and notifying Request_waiter objects.
Definition: request_container.h:646
Operation completed successfully.
static Ptr Create(Args &&...args)
Create an instance.
Definition: request_container.h:362
void Processing_loop()
Request processing loop implementation.
std::shared_ptr< Request_waiter > Ptr
Pointer type.
Definition: request_container.h:362
Request_container(const std::string &name, Request_waiter::Ptr waiter=Request_waiter::Create())
Create container with default associated waiter.
bool Is_aborted() const
Check if request is aborted.
Definition: request_container.h:252
Pointer class type.
Definition: callback.h:93
int Process_requests(int requests_limit=0)
Process all currently queued requests.
Status
Request processing status which is returned by the handler or set internally.
Definition: request_container.h:44
bool Check_type(Type mask)
Check if the container type conforms the specified characteristic mask.
Definition: request_container.h:478
Status Get_status() const
Get request current status.
Definition: request_container.h:228
bool Is_completion_delivered() const
Check if the request completion notification is delivered.
Definition: request_container.h:266
std::shared_ptr< Request_container > Ptr
Pointer type.
Definition: request_container.h:31
bool Is_done() const
Check if request is fully processed, i.e.
Definition: request_container.h:284
Generic container for queued requests.
Definition: request_container.h:30
Type
Container type.
Definition: request_container.h:446
virtual void On_disable()
Called when the container is terminated.
int Wait_and_process(const std::initializer_list< Request_container::Ptr > &containers, std::chrono::milliseconds timeout=std::chrono::milliseconds::zero(), int requests_limit=0, Predicate predicate=Predicate())
Wait for request submission.
void Set_waiter(Request_waiter::Ptr waiter)
Set request waiter associated with this container.
std::unique_lock< std::mutex > Locker
Smart lock object for request external locking.
Definition: request_container.h:88
bool Is_completed() const
Check if request is completed.
Definition: request_container.h:235
const std::string & Get_name()
Get the name of the container.
Definition: request_container.h:534
void Submit_request(Request::Ptr request)
Submit request to this container for further processing or notification handlers invocation.
bool Is_enabled() const
Check if the container is currently enabled.
bool Is_processing() const
Check if request is still processing.
Definition: request_container.h:259
#define DEFINE_COMMON_CLASS(__class_name,...)
Use this macro to define some common attributes for a class.
Definition: utils.h:25
Request_container::Request Request
Request type for convenient usage.
Definition: request_container.h:694
Locker Lock()
Acquire lock for request getting.
void Enable()
Enable the container.
Represents request synchronization entity which is used for request queues protected access...
Definition: request_container.h:361