Project
Loading...
Searching...
No Matches
AsyncQueue.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#ifndef O2_FRAMEWORK_ASYNCQUUE_H_
12#define O2_FRAMEWORK_ASYNCQUUE_H_
13
15#include <string>
16#include <vector>
17#include <atomic>
18
19typedef struct x9_inbox_internal x9_inbox;
20typedef struct x9_node_internal x9_node;
21
22namespace o2::framework
23{
24
28 int16_t value = -1;
29};
30
32struct AsyncTask {
33 // The timeslice after which this callback should be executed.
35 // Only the task with the highest debounce value will be executed
36 // The associated task spec. Notice that the context
37 // is stored separately so that we do not need to
38 // manage lifetimes of std::functions
39 AsyncTaskId id = {-1};
40 // Debounce value.
41 int8_t debounce = 0;
42 bool runnable = false;
43 // Some unuser integer
44 int32_t unused = 0;
45 // The callback to be executed. id can be used as unique
46 // id for the signpost in the async_queue stream.
47 // Context is provided by the userdata attached to the
48 // task the moment we post it.
49 // Notice that we do not store the task in the prototype
50 // because we do support at the moment coalescing two
51 // different callbaks with the same id.
52 void (*callback)(AsyncTask& task, size_t id);
53 // Some user data e.g. to decode what comes next
54 // This can either be used via the .data pointer
55 // or by asking a cast to the appropriate type via
56 // the user() method.
57 void* data[5] = {nullptr, nullptr, nullptr, nullptr, nullptr};
58
59 // Helper to return userdata
60 template <typename T>
61 T& user()
62 {
63 static_assert(sizeof(T) <= 5 * sizeof(void*), "User object does not fit user data");
64 return *(T*)data;
65 }
66
67 // Helper to set userdata
68 // @return a reference to this task modified. This is meant to be used like:
69 //
70 // AsyncQueueHelpers::post(queue, AsyncTask{.id = myTask}.user(Context{.contextValue}));
71 //
72 // Coupled with the other one:
73 //
74 // task.user<Context>().contextValue;
75 //
76 // it can be used to mimick capturing lambdas
77 template <typename T>
79 {
80 static_assert(sizeof(T) <= 5 * sizeof(void*), "User object does not fit user data");
81 new (&data[0])(T){value};
82 return *this;
83 }
84};
85
87 std::string name;
88 // Its priority compared to the other tasks
89 int score = 0;
90};
91
92struct AsyncQueue {
93 std::vector<AsyncTaskSpec> prototypes;
94 std::vector<AsyncTask> tasks;
95 size_t iteration = 0;
96
97 std::atomic<bool> first = true;
98
99 // Inbox for the message queue used to append
100 // tasks to this queue.
101 x9_inbox* inbox = nullptr;
102 AsyncQueue();
103};
104
106 static AsyncTaskId create(AsyncQueue& queue, AsyncTaskSpec spec);
107 // Schedule a task with @a taskId to be executed whenever the timeslice
108 // is past timeslice. If debounce is provided, only execute the task
109 static void post(AsyncQueue& queue, AsyncTask const& task);
115 static void run(AsyncQueue& queue, TimesliceId oldestPossibleTimeslice);
116
117 // Flush tasks which were posted but not yet committed to the queue
118 static void flushPending(AsyncQueue& queue);
120 static void reset(AsyncQueue& queue);
121};
122
123} // namespace o2::framework
124#endif // O2_FRAMEWORK_ASYNCQUEUE_H_
struct x9_node_internal x9_node
Definition AsyncQueue.h:20
struct x9_inbox_internal x9_inbox
Definition AsyncQueue.h:19
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLboolean * data
Definition glcorearb.h:298
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
Defining PrimaryVertex explicitly as messageable.
Definition TFIDInfo.h:20
static void flushPending(AsyncQueue &queue)
static AsyncTaskId create(AsyncQueue &queue, AsyncTaskSpec spec)
static void run(AsyncQueue &queue, TimesliceId oldestPossibleTimeslice)
static void post(AsyncQueue &queue, AsyncTask const &task)
static void reset(AsyncQueue &queue)
Reset the queue to its initial state.
std::vector< AsyncTaskSpec > prototypes
Definition AsyncQueue.h:93
std::vector< AsyncTask > tasks
Definition AsyncQueue.h:94
An actuatual task to be executed.
Definition AsyncQueue.h:32
void(* callback)(AsyncTask &task, size_t id)
Definition AsyncQueue.h:52
AsyncTask & user(T &&value)
Definition AsyncQueue.h:78
static constexpr uint64_t INVALID