• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /*! \addtogroup osclproc OSCL Proc
19  *
20  * @{
21  */
22 
23 
24 /** \file oscl_scheduler_ao.h
25     \brief Oscl Scheduler user execution object classes.
26 */
27 
28 
29 #ifndef OSCL_SCHEDULER_AO_H_INCLUDED
30 #define OSCL_SCHEDULER_AO_H_INCLUDED
31 
32 #ifndef OSCL_SCHEDULER_TYPES_H_INCLUDED
33 #include "oscl_scheduler_types.h"
34 #endif
35 
36 #ifndef OSCL_SCHEDULER_AOBASE_H_INCLUDED
37 #include "oscl_scheduler_aobase.h"
38 #endif
39 
40 #ifndef OSCL_MEM_H_INCLUDED
41 #include "oscl_mem.h"
42 #endif
43 
44 /**
45  * User base class for execution objects.
46  * OsclActiveObject defines an execution object without any timer.
47  * This AO can be used across threads, i.e. the request
48  * can be activated in one thread and completed in another.
49  */
50 class OsclActiveObject:
51         public HeapBase,
52         public PVActiveBase
53 {
54     public:
55         /**
56          * Scheduling priorities.
57          */
58         enum OsclActivePriority
59         {
60             /**
61             A low priority, useful for execution objects representing
62             background processing.
63             */
64             EPriorityIdle = -100,
65             /**
66             A priority higher than EPriorityIdle but lower than EPriorityNominal.
67             */
68             EPriorityLow = -20,
69             /**
70             Most exec objects will have this priority.
71             */
72             EPriorityNominal = 0,
73             /**
74             A priority higher than EPriorityNominal; useful for execution objects
75             handling user input.
76             */
77             EPriorityHigh = 10,
78             /**
79             A priority higher than EPriorityHighest.
80             */
81             EPriorityHighest = 20,
82         };
83 
84         /**
85          * Constructor.
86          * @param aPriority (input param): scheduling priority
87          * @param name (inpup param): optional name for this AO.
88          */
89         OSCL_IMPORT_REF OsclActiveObject(int32 aPriority, const char name[]);
90 
91         /**
92          * Destructor.
93          */
94         OSCL_IMPORT_REF virtual ~OsclActiveObject();
95 
96 
97         /**
98          * Set object ready for this AO,
99          * additionally sets the request status to OSCL_REQUEST_PENDING.
100          * Will leave if the request is already readied,
101          * or the execution object is not added to any scheduler,
102          * or the calling thread context does not match
103          * the scheduler thread.
104          */
105         OSCL_IMPORT_REF void SetBusy();
106 
107         /**
108          * Return true if this AO is pending,
109          * false otherwise.
110          */
111         OSCL_IMPORT_REF bool IsBusy() const;
112 
113         /**
114          * Set request active for this AO and set the status to pending.
115          * PendForExec is identical to SetActive, but it
116          * additionally sets the request status to OSCL_REQUEST_PENDING.
117          */
118         OSCL_IMPORT_REF void PendForExec();
119 
120         /**
121          * Complete the active request for the AO.
122          * This API is thread-safe.
123          * If the request is not pending, this call will leave.
124          * @param aStatus: request completion status.
125          */
126         OSCL_IMPORT_REF void PendComplete(int32 aStatus);
127 
128         /**
129          * Add this exec object to the current thread's scheduler.
130          */
131         OSCL_IMPORT_REF void AddToScheduler();
132 
133         /**
134          * Remove this AO from its scheduler.
135          * Will leave if the calling thread context does
136          * not match the scheduling thread.
137          * Cancels any readied request before removing.
138          */
139         OSCL_IMPORT_REF void RemoveFromScheduler();
140 
141 
142         /**
143          * Complete this AO's request immediately.
144          * If the AO is already active, this will do nothing.
145          * Will leave if the AO is not added to any scheduler,
146          * or if the calling thread context does not match the
147          * scheduling thread.
148          */
149         OSCL_IMPORT_REF void RunIfNotReady();
150 
151         /**
152          * Cancel any pending request.
153          * If the request is readied, this will call the DoCancel
154          * routine, wait for the request to cancel, then set the
155          * request idle.  The AO will not run.
156          * If the request is not readied, it does nothing.
157          * Request must be canceled from the same thread
158          * in which it is scheduled.
159          */
160         OSCL_IMPORT_REF void Cancel();
161 
162 
163         /**
164         * Return scheduling priority of this exec object.
165         */
166         OSCL_IMPORT_REF int32 Priority() const;
167 
168         /**
169         * Request status access
170         */
171         OSCL_IMPORT_REF int32 Status()const;
172         OSCL_IMPORT_REF void SetStatus(int32);
173         OSCL_IMPORT_REF OsclAOStatus& StatusRef();
174 
175     protected:
176         /**
177          * Cancel request handler.
178          * This gets called by scheduler when the request
179          * is cancelled.  The default routine will complete
180          * the request.  If any additional action is needed,
181          * the derived class may override this.  If the derived class
182          * does override DoCancel, it must complete the request.
183          */
184         OSCL_IMPORT_REF virtual void DoCancel();
185 
186         /**
187         * Run Error handler.
188         * This gets called by scheduler when the Run routine leaves.
189         * The default implementation simply returns the leave code.
190         * If the derived class wants to handle errors from Run,
191         * it may override this.  The RunError should return OsclErrNone
192         * if it handles the error, otherwise it should return the
193         * input error code.
194         * @param aError: the leave code generated by the Run.
195         */
196         OSCL_IMPORT_REF virtual int32 RunError(int32 aError);
197 
198 };
199 
200 /**
201  * User base class for execution objects.
202  * OsclTimerObject defines an exec object with a timer.
203 
204  */
205 class OsclTimerObject: public HeapBase
206         , public PVActiveBase
207 {
208     public:
209         /**
210          * Constructor.
211          * @param aPriority (input param): scheduling priority
212          * @param name (input param): optional name for this AO.
213          */
214         OSCL_IMPORT_REF OsclTimerObject(int32 aPriority, const char name[]);
215 
216         /**
217          * Destructor.
218          */
219         OSCL_IMPORT_REF virtual ~OsclTimerObject();
220 
221         /**
222          * Add this AO to the current thread's scheduler.
223          */
224         OSCL_IMPORT_REF void AddToScheduler();
225 
226 
227         /**
228          * Remove this AO from its scheduler.
229          * Will leave if the calling thread context does
230          * not match the scheduling thread.
231          * Cancels any pending request before removing.
232          */
233         OSCL_IMPORT_REF void RemoveFromScheduler();
234 
235 
236         /**
237         * 'After' sets the request ready, with request status
238         * OSCL_REQUEST_STATUS_PENDING, and starts a timer.
239         * When the timer expires, the request will complete with
240         * status OSCL_REQUEST_ERR_NONE.
241         * Must be called from the same thread in which the
242         * active object is scheduled.
243         * Will leave if the request is already readied, the object
244         * is not added to any scheduler, or the calling thread
245         * does not match the scheduling thread.
246         * @param anInterval: timeout interval in microseconds.
247         */
248         OSCL_IMPORT_REF void After(int32 aDelayMicrosec);
249 
250         /**
251          * Complete the request after a time interval.
252          * RunIfNotReady is identical to After() except that it
253          * first checks the request status, and if it is already
254          * readied, it does nothing.
255          *
256          * @param aDelayMicrosec (input param): delay in microseconds.
257          */
258         OSCL_IMPORT_REF void RunIfNotReady(uint32 aDelayMicrosec = 0);
259 
260         /**
261          * Set request ready for this AO.
262          * Will leave if the request is already readied,
263          * or the exec object is not added to any scheduler,
264          * or the calling thread context does not match
265          * the scheduler thread.
266          */
267         OSCL_IMPORT_REF void SetBusy();
268 
269         /**
270          * Return true if this AO is active,
271          * false otherwise.
272          */
273         OSCL_IMPORT_REF bool IsBusy() const;
274 
275         /**
276          * Cancel any active request.
277          * If the request is pending, this will call the DoCancel
278          * routine, wait for the request to cancel, then set the
279          * request idle.  The AO will not run.
280          * If the request is not active, it does nothing.
281          * Request must be canceled from the same thread
282          * in which it is scheduled.
283          */
284         OSCL_IMPORT_REF void Cancel();
285 
286         /**
287         * Return scheduling priority of this exec object.
288         */
289         OSCL_IMPORT_REF int32 Priority() const;
290         /**
291         * Request status access
292         */
293         OSCL_IMPORT_REF int32 Status()const;
294         OSCL_IMPORT_REF void SetStatus(int32);
295         OSCL_IMPORT_REF OsclAOStatus& StatusRef();
296 
297     protected:
298         /**
299          * Cancel request handler.
300          * This gets called by scheduler when the request
301          * is cancelled.  The default routine will cancel
302          * the timer.  If any additional action is needed,
303          * the derived class may override this.  If the
304          * derived class does override this, it should explicitly
305          * call OsclTimerObject::DoCancel in its own DoCancel
306          * routine.
307          */
308         OSCL_IMPORT_REF virtual void DoCancel();
309 
310         /**
311         * Run Leave handler.
312         * This gets called by scheduler when the Run routine leaves.
313         * The default implementation simply returns the leave code.
314         * If the derived class wants to handle errors from Run,
315         * it may override this.  The ExecError should return OsclErrNone
316         * if it handles the error, otherwise it should return the
317         * input error code.
318         * @param aError: the leave code generated by the Run.
319         */
320         OSCL_IMPORT_REF virtual int32 RunError(int32 aError);
321 };
322 
323 
324 #endif
325 
326 /*! @} */
327