make precision correct when calling conversion between LttTime and double
[lttv.git] / ltt / branches / poly / doc / developer / requests_servicing_schedulers.txt
CommitLineData
ca566f70 1Linux Trace Toolkit
2
3Requests Servicing Schedulers
4
5
6Mathieu Desnoyers, 07/06/2004
7
8
9In the LTT graphical interface, two main types of events requests may occur :
10
11- events requests made by a viewer concerning a traceset for a ad hoc
12 computation.
13- events requests made by a viewer concerning a trace for a precomputation.
14
15
16Ad Hoc Computation
17
18The ad hoc computation must be serviced immediately : they are directly
19responding to events requests that must be serviced to complete the graphical
20widgets'data. This kind of computation may lead to incomplete result as long as
21precomputation are not finished. Once precomputation is over, the widgets will
22be redrawn if they needed such information. A ad hoc computation is done on a
23traceset : the workspace of a tab.
24
25Precomputation
26
27Traces are global objects. Only one instance of a trace is opened for all the
28program. Precomputation will append data to the traces attributes (states,
29statistics). It must inform the widgets which asked for such states or
30statistics of their availability. Only one precomputation must be launched for
31each trace and no duplication of precomputation must be done.
32
33
34Schedulers
35
36There is one tracesetcontext per traceset. Each reference to a trace by a
37traceset also has its own tracecontext. Each trace, by itself, has its own
38tracecontext.
39
40Let's define a scheduler as a g_idle events request servicing function.
41
42There is one scheduler per traceset context (registered when there are requests
43to answer). There is also one scheduler per autonomous trace context (not
44related to any traceset context).
45
46A scheduler processes requests for a specific traceset or trace by combining
47time intervals of the requests. It is interruptible by any GTK event. A
48precomputation scheduler has a lower priority than a ad hoc computation
49scheduler. That means that no precomputation will be performed until there is
50no more ad hoc compuation pending. When a scheduler is interrupted, it makes no
51assumption about the presence or absence of the current requests in its pool
52when it starts back.
53
54
55Foreground Scheduler
56
57There can be one foreground scheduler per traceset (one traceset per tab). It
58simply calls the hooks given by the events requests of the viewers for the
59specified time intervals.
60
61
62Background Scheduler
63
493c473c 64Right now, to simplify the problem of the background scheduler, we assume that
65the module that loads the extended statistics hooks has been loaded before the
66data is requested and that it is not unloaded until the program stops. We will
67eventually have to deal with the requests removal based on module load/unload,
68but it complicates the problem quite a bit.
69
70A background scheduler adds hooks located under a global attributes path
71(specified by the viewer who makes the request) to the trace's traceset
72context (the trace is specified by the viewer). Then, it processes the whole
73trace with this context (and hooks).
74
75Typically, a module that extends statistics will register hooks in the global
78d73d05 76attributes tree under /computation/modulename/hook_name . A viewer
493c473c 77that needs these statistics for a set of traces does a background computation
78request through a call to the main window API function. It must specify all
79types of hooks that must be called for the specified trace.
80
81The background computation requests for a trace are queued. When the idle
82function kicks in to answer these requests, it add the hooks of all the requests
83toghether in the context and starts the read. It also keeps a list of the
84background requests currently serviced.
85
86The read is done from start to end of the trace, calling all the hooks present
87in the context. Only when the read is over, the after_request hooks of the
88currently serviced requests are called and the requests are destroyed.
89
90If there are requests in the waiting queue, they are all added to the current
91pool and processed. It is important to understand that, while a processing is in
92being done, no requests are added to the pool : they wait for their turn in the
93queue.
94
95Every hook that are added to the context by the scheduler comes from global
96attributes, i.e.
78d73d05 97/traces/#
98 in LttvTrace attributes : modulename/hook_name
493c473c 99
100They come with a flag telling either in_progress or ready. If the flag
101ready is set, a viewer knows that the data it needs is already ready and he
102doesn't have to make a request.
103
104If the flag in_progress is set, that means that the data it needs is currently
105being serviced, and it must wait for the current servicing to be finished. It
106tells the lttvwindow API to call a hook when the actual servicing is over (there
107is a special function for this, as it requires to modify the pool of requests
108actually being serviced : we must make sure that no new reading hooks are
109added!).
110
111
112
113
114
115New Global Attributes
116
78d73d05 117/traces/#
118 in LttvTrace attributes :
493c473c 119
120When a processing is fired, a variable
78d73d05 121 computation/modulename/in_progress is set.
493c473c 122
123When a processing finished, a variable
78d73d05 124 computation/modulename/in_progress is unset
125 computation/modulename/ready is set
493c473c 126
127
128
129
130
131Typical Use For a Viewer
132
133When a viewer wants extended information, it must first check if it is ready.
134if not :
78d73d05 135Before a viewer makes a request, it must check the in_progress status of the
493c473c 136hooks.
137
138If the in_progress is unset, it makes the request.
139
140If the in_progress is set, it makes a special request for being informed of the
141end of request.
142
ca566f70 143
144
145
146Hooks Lists
147
148In order to answer the problems of background processing, we need to add a
149reference counter for each hook of a hook list. If the same hook is added twice,
150it will be called only once, but it will need two "remove" to be really removed
151from the list. Two hooks are identical if they have the same function pointer
152and hook_data.
153
154
63b8a718 155
493c473c 156
157
158
63b8a718 159Implementation
160
161Ad Hoc Computation
162
163see lttvwindow_events_delivery.txt
164
165
166Hooks Lists
167
168need new ref_count field with each hook
169lttv_hook_add and lttv_hook_add_list must compare addition with present and
170increment ref counter if already present.
171
172lttv_hook_remove and remove_with_data must decrement ref_count is >1, or remove
173the element otherwise (==1).
174
175
176
177Background Scheduler
178
179Global traces
180
181Two global attributes per trace :
78d73d05 182traces/#
63b8a718 183 It is a pointer to the LttvTrace structure.
78d73d05 184 In the LttvTrace attributes :
185 state/
186 saved_states/
187 statistics/
188 modes/
189 cpu/
190 processes/
191 modulename1/
192 modulename2/
193 ...
194 computation/ /* Trace specific background computation hooks status */
195 state/
196 in_progress
197 ready
e6f3a759 198 stats/
78d73d05 199 in_progress
200 ready
201 modulename1/
202 in_progress
203 ready
204 requests_queue/ /* Background computation requests */
205 requests_current/ /* Type : BackgroundRequest */
206 notify_queue/
207 notify_current/
e6f3a759 208 computation_traceset/
209 computation_traceset_context/
210
78d73d05 211
212computation/ /* Global background computation hooks */
213 state/
214 before_chunk_traceset
215 before_chunk_trace
216 before_chunk_tracefile
217 after_...
218 before_request
219 after_request
220 event_hook
221 event_hook_by_id
e6f3a759 222 stats/
78d73d05 223 ...
224 modulename1/
225 ...
226
63b8a718 227
63b8a718 228Modify Traceset
78d73d05 229Points to the global traces. Main window must open a new one only when no
230instance of the pathname exists.
63b8a718 231
232Modify trace opening / close to make them create and destroy
78d73d05 233LttvBackgroundComputation (and call end requests hooks for servicing requests)
234and global trace info when references to the trace is zero.
235
236
63b8a718 237
ca566f70 238EventsRequest Structure
239
78d73d05 240This structure is the element of the events requests pools. The owner field is
241used as an ownership identifier. The viewer field is a pointer to the data
242structure upon which the action applies. Typically, both will be pointers to
243the viewer's data structure.
244
245In a ad hoc events request, a pointer to the EventsRequest structure is used as
246hook_data in the hook lists : it must have been added by the viewers.
247
248
249Modify module load/unload
ca566f70 250
78d73d05 251A module that registers global computation hooks in the global attributes upon
252load should unregister them when unloaded. Also, it must remove every background
e6f3a759 253computation request for each trace that has its own module_name as GQuark.
ca566f70 254
ca566f70 255
e6f3a759 256Give an API for calculation modules
257
258Must have an API for module which register calculation hooks. Unregistration
259must also remove all requests made for these hooks.
260
4f70505a 261
262Background Requests Servicing Algorithm (v1)
263
264
265list_in : currently serviced requests
266list_out : queue of requests waiting for processing
267
2d262115 268notification lists :
269notify_in : currently checked notifications
270notify_out : queue of notifications that comes along with next processing.
271
4f70505a 272
2731. Before processing
e6f3a759 274 - if list_in is empty
4f70505a 275 - Add all requests in list_out to list_in, empty list_out
276 - for each request in list_in
4f70505a 277 - set hooks'in_progress flag to TRUE
278 - seek trace to start
2d262115 279 - Move all notifications from notify_out to notify_in.
e6f3a759 280 - for each request in list_in
281 - Call before chunk hooks for list_in
282 - add hooks to context
4f70505a 283
2842. call process traceset middle for a chunk
285 (assert list_in is not empty! : should not even be called in that case)
286
2873. After the chunk
e6f3a759 288 3.1 call after_chunk hooks for list_in
289 - for each request in list_in
290 - Call after chunk hooks for list_in
291 - remove hooks from context
2d262115 292 3.2 for each notify_in
293 - if current time >= notify time, call notify and remove from notify_in
294 - if current position >= notify position, call notify and remove from
295 notify_in
e6f3a759 296 3.3 if end of trace reached
4f70505a 297 - for each request in list_in
298 - set hooks'in_progress flag to FALSE
299 - set hooks'ready flag to TRUE
4f70505a 300 - remove request
2d262115 301 - for each notifications in notify_in
302 - call notify and remove from notify_in
4f70505a 303 - return FALSE (scheduler stopped)
e6f3a759 304 3.4 else
4f70505a 305 - return TRUE (scheduler still registered)
306
This page took 0.038183 seconds and 4 git commands to generate.