1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2018 The Android Open Source Project
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar *****************************************************************************
18*c83a76b0SSuyog Pawar * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*c83a76b0SSuyog Pawar */
20*c83a76b0SSuyog Pawar
21*c83a76b0SSuyog Pawar /*****************************************************************************/
22*c83a76b0SSuyog Pawar /* */
23*c83a76b0SSuyog Pawar /* File Name : osal_thread.c */
24*c83a76b0SSuyog Pawar /* */
25*c83a76b0SSuyog Pawar /* Description : This file contains Thread API's implemented for */
26*c83a76b0SSuyog Pawar /* different platforms. */
27*c83a76b0SSuyog Pawar /* */
28*c83a76b0SSuyog Pawar /* List of Functions : osal_thread_create */
29*c83a76b0SSuyog Pawar /* osal_thread_destroy */
30*c83a76b0SSuyog Pawar /* osal_func */
31*c83a76b0SSuyog Pawar /* osal_set_thread_priority */
32*c83a76b0SSuyog Pawar /* osal_set_thread_core_affinity */
33*c83a76b0SSuyog Pawar /* osal_thread_sleep */
34*c83a76b0SSuyog Pawar /* osal_thread_yield */
35*c83a76b0SSuyog Pawar /* osal_thread_suspend */
36*c83a76b0SSuyog Pawar /* osal_thread_resume */
37*c83a76b0SSuyog Pawar /* osal_thread_wait */
38*c83a76b0SSuyog Pawar /* osal_get_thread_handle */
39*c83a76b0SSuyog Pawar /* osal_get_time */
40*c83a76b0SSuyog Pawar /* osal_get_time_usec */
41*c83a76b0SSuyog Pawar /* osal_get_last_error */
42*c83a76b0SSuyog Pawar /* osal_print_last_error */
43*c83a76b0SSuyog Pawar /* */
44*c83a76b0SSuyog Pawar /* Issues / Problems : None */
45*c83a76b0SSuyog Pawar /* */
46*c83a76b0SSuyog Pawar /* Revision History : */
47*c83a76b0SSuyog Pawar /* */
48*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
49*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
50*c83a76b0SSuyog Pawar /* */
51*c83a76b0SSuyog Pawar /*****************************************************************************/
52*c83a76b0SSuyog Pawar
53*c83a76b0SSuyog Pawar /*****************************************************************************/
54*c83a76b0SSuyog Pawar /* File Includes */
55*c83a76b0SSuyog Pawar /*****************************************************************************/
56*c83a76b0SSuyog Pawar
57*c83a76b0SSuyog Pawar /* System include files */
58*c83a76b0SSuyog Pawar #include <stdio.h>
59*c83a76b0SSuyog Pawar
60*c83a76b0SSuyog Pawar #include <semaphore.h>
61*c83a76b0SSuyog Pawar #include <pthread.h>
62*c83a76b0SSuyog Pawar #include <errno.h>
63*c83a76b0SSuyog Pawar #include <sys/time.h>
64*c83a76b0SSuyog Pawar #include <sys/resource.h>
65*c83a76b0SSuyog Pawar
66*c83a76b0SSuyog Pawar #include <unistd.h>
67*c83a76b0SSuyog Pawar #include <math.h>
68*c83a76b0SSuyog Pawar #include <sched.h> /*for CPU_SET, etc.. */
69*c83a76b0SSuyog Pawar #include <linux/unistd.h>
70*c83a76b0SSuyog Pawar #include <sys/syscall.h>
71*c83a76b0SSuyog Pawar
72*c83a76b0SSuyog Pawar /* User include files */
73*c83a76b0SSuyog Pawar #include "cast_types.h"
74*c83a76b0SSuyog Pawar #include "osal.h"
75*c83a76b0SSuyog Pawar #include "osal_handle.h"
76*c83a76b0SSuyog Pawar #include "osal_thread.h"
77*c83a76b0SSuyog Pawar #include "osal_errno.h"
78*c83a76b0SSuyog Pawar
79*c83a76b0SSuyog Pawar /*****************************************************************************/
80*c83a76b0SSuyog Pawar /* Static Function Declarations */
81*c83a76b0SSuyog Pawar /*****************************************************************************/
82*c83a76b0SSuyog Pawar
83*c83a76b0SSuyog Pawar static void osal_func(void *param);
84*c83a76b0SSuyog Pawar
85*c83a76b0SSuyog Pawar /*****************************************************************************/
86*c83a76b0SSuyog Pawar /* */
87*c83a76b0SSuyog Pawar /* Function Name : osal_thread_create */
88*c83a76b0SSuyog Pawar /* */
89*c83a76b0SSuyog Pawar /* Description : This function create a new thread. */
90*c83a76b0SSuyog Pawar /* */
91*c83a76b0SSuyog Pawar /* Inputs : OSAL handle */
92*c83a76b0SSuyog Pawar /* Memory Manager Handle */
93*c83a76b0SSuyog Pawar /* Thread creation attributes */
94*c83a76b0SSuyog Pawar /* */
95*c83a76b0SSuyog Pawar /* Globals : None */
96*c83a76b0SSuyog Pawar /* */
97*c83a76b0SSuyog Pawar /* Processing : This function calls OS specific thread create API's and */
98*c83a76b0SSuyog Pawar /* creates a new thread with specified attributes. */
99*c83a76b0SSuyog Pawar /* */
100*c83a76b0SSuyog Pawar /* Outputs : Status of thread creation */
101*c83a76b0SSuyog Pawar /* */
102*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
103*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
104*c83a76b0SSuyog Pawar /* */
105*c83a76b0SSuyog Pawar /* Issues : Only supports creating threads with default attributes */
106*c83a76b0SSuyog Pawar /* */
107*c83a76b0SSuyog Pawar /* Revision History: */
108*c83a76b0SSuyog Pawar /* */
109*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
110*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
111*c83a76b0SSuyog Pawar /* */
112*c83a76b0SSuyog Pawar /*****************************************************************************/
113*c83a76b0SSuyog Pawar
osal_thread_create(IN void * osal_handle,IN osal_thread_attr_t * attr)114*c83a76b0SSuyog Pawar void *osal_thread_create(IN void *osal_handle, IN osal_thread_attr_t *attr)
115*c83a76b0SSuyog Pawar {
116*c83a76b0SSuyog Pawar osal_t *handle = (osal_t *)osal_handle;
117*c83a76b0SSuyog Pawar WORD32 priority = 0;
118*c83a76b0SSuyog Pawar void *mmr_handle = 0;
119*c83a76b0SSuyog Pawar
120*c83a76b0SSuyog Pawar /* If Handle or attributes are not valid, return ERRORED. */
121*c83a76b0SSuyog Pawar if(0 == attr)
122*c83a76b0SSuyog Pawar return 0;
123*c83a76b0SSuyog Pawar
124*c83a76b0SSuyog Pawar if(0 == handle || 0 == handle->alloc || 0 == handle->free)
125*c83a76b0SSuyog Pawar return 0;
126*c83a76b0SSuyog Pawar
127*c83a76b0SSuyog Pawar /* Initialize MMR handle */
128*c83a76b0SSuyog Pawar mmr_handle = handle->mmr_handle;
129*c83a76b0SSuyog Pawar
130*c83a76b0SSuyog Pawar {
131*c83a76b0SSuyog Pawar pthread_attr_t tattr;
132*c83a76b0SSuyog Pawar thread_handle_t *hdl = 0;
133*c83a76b0SSuyog Pawar
134*c83a76b0SSuyog Pawar attr->sched_policy = OSAL_SCHED_RR;
135*c83a76b0SSuyog Pawar
136*c83a76b0SSuyog Pawar /* Allocate memory for thread handle */
137*c83a76b0SSuyog Pawar hdl = handle->alloc(mmr_handle, sizeof(thread_handle_t));
138*c83a76b0SSuyog Pawar if(0 == hdl)
139*c83a76b0SSuyog Pawar return 0;
140*c83a76b0SSuyog Pawar
141*c83a76b0SSuyog Pawar /* Initialize thread handle parameters */
142*c83a76b0SSuyog Pawar hdl->mmr_handle = mmr_handle;
143*c83a76b0SSuyog Pawar hdl->hdl = handle;
144*c83a76b0SSuyog Pawar hdl->exit_code = attr->exit_code;
145*c83a76b0SSuyog Pawar hdl->priority = priority;
146*c83a76b0SSuyog Pawar hdl->thread_func = attr->thread_func;
147*c83a76b0SSuyog Pawar hdl->thread_param = attr->thread_param;
148*c83a76b0SSuyog Pawar
149*c83a76b0SSuyog Pawar /* initialized with default attributes */
150*c83a76b0SSuyog Pawar if(0 != pthread_attr_init(&tattr))
151*c83a76b0SSuyog Pawar {
152*c83a76b0SSuyog Pawar handle->free(hdl->mmr_handle, hdl);
153*c83a76b0SSuyog Pawar return 0;
154*c83a76b0SSuyog Pawar }
155*c83a76b0SSuyog Pawar
156*c83a76b0SSuyog Pawar /* Create the thread */
157*c83a76b0SSuyog Pawar hdl->thread_id = pthread_create(
158*c83a76b0SSuyog Pawar &(hdl->thread_handle), /* Thread Handle */
159*c83a76b0SSuyog Pawar &tattr, /* Attributes */
160*c83a76b0SSuyog Pawar (void *(*)(void *))osal_func,
161*c83a76b0SSuyog Pawar hdl); /* Parameters */
162*c83a76b0SSuyog Pawar
163*c83a76b0SSuyog Pawar /* In case of error in thread creationn, Free the handle memory and */
164*c83a76b0SSuyog Pawar /* return error. */
165*c83a76b0SSuyog Pawar if(0 != hdl->thread_id)
166*c83a76b0SSuyog Pawar {
167*c83a76b0SSuyog Pawar handle->free(hdl->mmr_handle, hdl);
168*c83a76b0SSuyog Pawar return 0;
169*c83a76b0SSuyog Pawar }
170*c83a76b0SSuyog Pawar
171*c83a76b0SSuyog Pawar pthread_attr_destroy(&tattr);
172*c83a76b0SSuyog Pawar
173*c83a76b0SSuyog Pawar return hdl;
174*c83a76b0SSuyog Pawar }
175*c83a76b0SSuyog Pawar }
176*c83a76b0SSuyog Pawar
177*c83a76b0SSuyog Pawar /*****************************************************************************/
178*c83a76b0SSuyog Pawar /* */
179*c83a76b0SSuyog Pawar /* Function Name : osal_thread_destroy */
180*c83a76b0SSuyog Pawar /* */
181*c83a76b0SSuyog Pawar /* Description : This function calls OS specific API's to close a thread */
182*c83a76b0SSuyog Pawar /* which is represented by specified handle. */
183*c83a76b0SSuyog Pawar /* */
184*c83a76b0SSuyog Pawar /* Inputs : Initialized thread handle */
185*c83a76b0SSuyog Pawar /* */
186*c83a76b0SSuyog Pawar /* Globals : None */
187*c83a76b0SSuyog Pawar /* */
188*c83a76b0SSuyog Pawar /* Processing : Closing other threads is supported only in windows. So, */
189*c83a76b0SSuyog Pawar /* only windows platform supports this API. */
190*c83a76b0SSuyog Pawar /* */
191*c83a76b0SSuyog Pawar /* Outputs : Status of thread close */
192*c83a76b0SSuyog Pawar /* */
193*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
194*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
195*c83a76b0SSuyog Pawar /* */
196*c83a76b0SSuyog Pawar /* Issues : None */
197*c83a76b0SSuyog Pawar /* */
198*c83a76b0SSuyog Pawar /* Revision History: */
199*c83a76b0SSuyog Pawar /* */
200*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
201*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
202*c83a76b0SSuyog Pawar /* */
203*c83a76b0SSuyog Pawar /*****************************************************************************/
204*c83a76b0SSuyog Pawar
osal_thread_destroy(IN void * thread_handle)205*c83a76b0SSuyog Pawar WORD32 osal_thread_destroy(IN void *thread_handle)
206*c83a76b0SSuyog Pawar {
207*c83a76b0SSuyog Pawar /* If thread handle is not valid, return error */
208*c83a76b0SSuyog Pawar if(0 == thread_handle)
209*c83a76b0SSuyog Pawar return OSAL_ERROR;
210*c83a76b0SSuyog Pawar
211*c83a76b0SSuyog Pawar {
212*c83a76b0SSuyog Pawar thread_handle_t *hdl = (thread_handle_t *)thread_handle;
213*c83a76b0SSuyog Pawar
214*c83a76b0SSuyog Pawar /* Free memory allocated for Thread handle */
215*c83a76b0SSuyog Pawar ((osal_t *)hdl->hdl)->free(hdl->mmr_handle, hdl);
216*c83a76b0SSuyog Pawar
217*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
218*c83a76b0SSuyog Pawar }
219*c83a76b0SSuyog Pawar }
220*c83a76b0SSuyog Pawar
221*c83a76b0SSuyog Pawar /*****************************************************************************/
222*c83a76b0SSuyog Pawar /* */
223*c83a76b0SSuyog Pawar /* Function Name : osal_func */
224*c83a76b0SSuyog Pawar /* */
225*c83a76b0SSuyog Pawar /* Description : This function calls the registered threads calling */
226*c83a76b0SSuyog Pawar /* function */
227*c83a76b0SSuyog Pawar /* */
228*c83a76b0SSuyog Pawar /* Inputs : Thread Handle */
229*c83a76b0SSuyog Pawar /* */
230*c83a76b0SSuyog Pawar /* Globals : None */
231*c83a76b0SSuyog Pawar /* */
232*c83a76b0SSuyog Pawar /* Processing : Calls each registered thread function */
233*c83a76b0SSuyog Pawar /* */
234*c83a76b0SSuyog Pawar /* Outputs : None */
235*c83a76b0SSuyog Pawar /* Returns : None */
236*c83a76b0SSuyog Pawar /* */
237*c83a76b0SSuyog Pawar /* Issues : None */
238*c83a76b0SSuyog Pawar /* */
239*c83a76b0SSuyog Pawar /* Revision History: */
240*c83a76b0SSuyog Pawar /* */
241*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
242*c83a76b0SSuyog Pawar /* 10 05 2006 Ittiam Draft */
243*c83a76b0SSuyog Pawar /* */
244*c83a76b0SSuyog Pawar /*****************************************************************************/
245*c83a76b0SSuyog Pawar
osal_func(IN void * param)246*c83a76b0SSuyog Pawar void osal_func(IN void *param)
247*c83a76b0SSuyog Pawar {
248*c83a76b0SSuyog Pawar thread_handle_t *hdl = (thread_handle_t *)param;
249*c83a76b0SSuyog Pawar
250*c83a76b0SSuyog Pawar while(1)
251*c83a76b0SSuyog Pawar {
252*c83a76b0SSuyog Pawar /* Untill thread returns exit code, invoke the thread function */
253*c83a76b0SSuyog Pawar if(hdl->exit_code == hdl->thread_func(hdl->thread_param))
254*c83a76b0SSuyog Pawar break;
255*c83a76b0SSuyog Pawar }
256*c83a76b0SSuyog Pawar
257*c83a76b0SSuyog Pawar /* On Linux platforms call pthread_exit() to release all the resources */
258*c83a76b0SSuyog Pawar /* allocated. */
259*c83a76b0SSuyog Pawar pthread_exit(NULL);
260*c83a76b0SSuyog Pawar }
261*c83a76b0SSuyog Pawar
262*c83a76b0SSuyog Pawar /*****************************************************************************/
263*c83a76b0SSuyog Pawar /* */
264*c83a76b0SSuyog Pawar /* Function Name : osal_thread_sleep */
265*c83a76b0SSuyog Pawar /* */
266*c83a76b0SSuyog Pawar /* Description : This function calls OS specific API and makes thread */
267*c83a76b0SSuyog Pawar /* sleep for specified number of milli seconds. */
268*c83a76b0SSuyog Pawar /* */
269*c83a76b0SSuyog Pawar /* Inputs : Initialized thread handle */
270*c83a76b0SSuyog Pawar /* Time to sleep in millisceonds */
271*c83a76b0SSuyog Pawar /* */
272*c83a76b0SSuyog Pawar /* Globals : None */
273*c83a76b0SSuyog Pawar /* */
274*c83a76b0SSuyog Pawar /* Processing : Calls API to sleep for specified number of milli seconds */
275*c83a76b0SSuyog Pawar /* */
276*c83a76b0SSuyog Pawar /* Outputs : Status of sleep */
277*c83a76b0SSuyog Pawar /* */
278*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
279*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
280*c83a76b0SSuyog Pawar /* */
281*c83a76b0SSuyog Pawar /* Issues : None */
282*c83a76b0SSuyog Pawar /* */
283*c83a76b0SSuyog Pawar /* Revision History: */
284*c83a76b0SSuyog Pawar /* */
285*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
286*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
287*c83a76b0SSuyog Pawar /* */
288*c83a76b0SSuyog Pawar /*****************************************************************************/
289*c83a76b0SSuyog Pawar
osal_thread_sleep(IN UWORD32 milli_seconds)290*c83a76b0SSuyog Pawar WORD32 osal_thread_sleep(IN UWORD32 milli_seconds)
291*c83a76b0SSuyog Pawar {
292*c83a76b0SSuyog Pawar {
293*c83a76b0SSuyog Pawar struct timespec timer;
294*c83a76b0SSuyog Pawar
295*c83a76b0SSuyog Pawar /* Convert time in milliseconds into seconds and nano seconds */
296*c83a76b0SSuyog Pawar timer.tv_sec = milli_seconds / 1000;
297*c83a76b0SSuyog Pawar milli_seconds -= (timer.tv_sec * 1000);
298*c83a76b0SSuyog Pawar timer.tv_nsec = milli_seconds * MEGA_CONST;
299*c83a76b0SSuyog Pawar
300*c83a76b0SSuyog Pawar /* Using Monotonic clock to sleep, also flag is set to 0 for relative */
301*c83a76b0SSuyog Pawar /* time to current clock time */
302*c83a76b0SSuyog Pawar if(0 == clock_nanosleep(CLOCK_MONOTONIC, 0, &timer, NULL))
303*c83a76b0SSuyog Pawar {
304*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
305*c83a76b0SSuyog Pawar }
306*c83a76b0SSuyog Pawar
307*c83a76b0SSuyog Pawar return OSAL_ERROR;
308*c83a76b0SSuyog Pawar }
309*c83a76b0SSuyog Pawar }
310*c83a76b0SSuyog Pawar
311*c83a76b0SSuyog Pawar /*****************************************************************************/
312*c83a76b0SSuyog Pawar /* */
313*c83a76b0SSuyog Pawar /* Function Name : osal_thread_yield */
314*c83a76b0SSuyog Pawar /* */
315*c83a76b0SSuyog Pawar /* Description : This function causes the yield its execution. */
316*c83a76b0SSuyog Pawar /* */
317*c83a76b0SSuyog Pawar /* Inputs : Thread Handle */
318*c83a76b0SSuyog Pawar /* */
319*c83a76b0SSuyog Pawar /* Globals : None */
320*c83a76b0SSuyog Pawar /* */
321*c83a76b0SSuyog Pawar /* Processing : Calls OS specific yield calls. */
322*c83a76b0SSuyog Pawar /* */
323*c83a76b0SSuyog Pawar /* Outputs : Status of Thread Yield */
324*c83a76b0SSuyog Pawar /* */
325*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
326*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
327*c83a76b0SSuyog Pawar /* */
328*c83a76b0SSuyog Pawar /* Issues : Yield in WIN32 (whihc is a 16 - bit API) is still present*/
329*c83a76b0SSuyog Pawar /* only to maintian backward compatibility. Can get */
330*c83a76b0SSuyog Pawar /* deprecated in future. */
331*c83a76b0SSuyog Pawar /* */
332*c83a76b0SSuyog Pawar /* Revision History: */
333*c83a76b0SSuyog Pawar /* */
334*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
335*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
336*c83a76b0SSuyog Pawar /* */
337*c83a76b0SSuyog Pawar /*****************************************************************************/
338*c83a76b0SSuyog Pawar
osal_thread_yield()339*c83a76b0SSuyog Pawar WORD32 osal_thread_yield()
340*c83a76b0SSuyog Pawar {
341*c83a76b0SSuyog Pawar if(0 == sched_yield())
342*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
343*c83a76b0SSuyog Pawar
344*c83a76b0SSuyog Pawar return OSAL_ERROR;
345*c83a76b0SSuyog Pawar }
346*c83a76b0SSuyog Pawar
347*c83a76b0SSuyog Pawar /*****************************************************************************/
348*c83a76b0SSuyog Pawar /* */
349*c83a76b0SSuyog Pawar /* Function Name : osal_thread_suspend */
350*c83a76b0SSuyog Pawar /* */
351*c83a76b0SSuyog Pawar /* Description : This function causes the suspension its execution. */
352*c83a76b0SSuyog Pawar /* */
353*c83a76b0SSuyog Pawar /* Inputs : Thread Handle */
354*c83a76b0SSuyog Pawar /* */
355*c83a76b0SSuyog Pawar /* Globals : None */
356*c83a76b0SSuyog Pawar /* */
357*c83a76b0SSuyog Pawar /* Processing : Calls OS specific suspend calls. */
358*c83a76b0SSuyog Pawar /* */
359*c83a76b0SSuyog Pawar /* Outputs : Status of Thread Suspend */
360*c83a76b0SSuyog Pawar /* */
361*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
362*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
363*c83a76b0SSuyog Pawar /* */
364*c83a76b0SSuyog Pawar /* Issues : API not supported in Redhat Linux. Refer Redhat */
365*c83a76b0SSuyog Pawar /* documentation in: */
366*c83a76b0SSuyog Pawar /* http://www.redhat.com/docs/wp/solaris_port/c1347.html */
367*c83a76b0SSuyog Pawar /* */
368*c83a76b0SSuyog Pawar /* Revision History: */
369*c83a76b0SSuyog Pawar /* */
370*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
371*c83a76b0SSuyog Pawar /* 30 03 2006 Ittiam Draft */
372*c83a76b0SSuyog Pawar /* */
373*c83a76b0SSuyog Pawar /*****************************************************************************/
374*c83a76b0SSuyog Pawar
osal_thread_suspend(IN void * thread_handle)375*c83a76b0SSuyog Pawar WORD32 osal_thread_suspend(IN void *thread_handle)
376*c83a76b0SSuyog Pawar {
377*c83a76b0SSuyog Pawar /* If thread handle is not valid, return error */
378*c83a76b0SSuyog Pawar if(0 == thread_handle)
379*c83a76b0SSuyog Pawar return OSAL_ERROR;
380*c83a76b0SSuyog Pawar
381*c83a76b0SSuyog Pawar {
382*c83a76b0SSuyog Pawar /* Thread suspend are not supported in Redhat Linux. Refer link */
383*c83a76b0SSuyog Pawar /* http://www.redhat.com/docs/wp/solaris_port/c1347.html */
384*c83a76b0SSuyog Pawar
385*c83a76b0SSuyog Pawar return OSAL_NOT_SUPPORTED;
386*c83a76b0SSuyog Pawar }
387*c83a76b0SSuyog Pawar }
388*c83a76b0SSuyog Pawar
389*c83a76b0SSuyog Pawar /*****************************************************************************/
390*c83a76b0SSuyog Pawar /* */
391*c83a76b0SSuyog Pawar /* Function Name : osal_thread_resume */
392*c83a76b0SSuyog Pawar /* */
393*c83a76b0SSuyog Pawar /* Description : This function causes the resumption its execution. */
394*c83a76b0SSuyog Pawar /* */
395*c83a76b0SSuyog Pawar /* Inputs : Thread Handle */
396*c83a76b0SSuyog Pawar /* */
397*c83a76b0SSuyog Pawar /* Globals : None */
398*c83a76b0SSuyog Pawar /* */
399*c83a76b0SSuyog Pawar /* Processing : Calls OS specific resume calls. */
400*c83a76b0SSuyog Pawar /* */
401*c83a76b0SSuyog Pawar /* Outputs : Status of Thread Suspend */
402*c83a76b0SSuyog Pawar /* */
403*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
404*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
405*c83a76b0SSuyog Pawar /* */
406*c83a76b0SSuyog Pawar /* Issues : API not supported in Redhat Linux. Refer Redhat */
407*c83a76b0SSuyog Pawar /* documentation in: */
408*c83a76b0SSuyog Pawar /* http://www.redhat.com/docs/wp/solaris_port/c1347.html */
409*c83a76b0SSuyog Pawar /* */
410*c83a76b0SSuyog Pawar /* Revision History: */
411*c83a76b0SSuyog Pawar /* */
412*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
413*c83a76b0SSuyog Pawar /* 30 03 2006 Ittiam Draft */
414*c83a76b0SSuyog Pawar /* */
415*c83a76b0SSuyog Pawar /*****************************************************************************/
416*c83a76b0SSuyog Pawar
osal_thread_resume(IN void * thread_handle)417*c83a76b0SSuyog Pawar WORD32 osal_thread_resume(IN void *thread_handle)
418*c83a76b0SSuyog Pawar {
419*c83a76b0SSuyog Pawar /* If thread handle is not valid, return error */
420*c83a76b0SSuyog Pawar if(0 == thread_handle)
421*c83a76b0SSuyog Pawar return OSAL_ERROR;
422*c83a76b0SSuyog Pawar
423*c83a76b0SSuyog Pawar {
424*c83a76b0SSuyog Pawar /* Thread suspend are not supported in Redhat Linux. Refer link */
425*c83a76b0SSuyog Pawar /* http://www.redhat.com/docs/wp/solaris_port/c1347.html */
426*c83a76b0SSuyog Pawar
427*c83a76b0SSuyog Pawar return OSAL_NOT_SUPPORTED;
428*c83a76b0SSuyog Pawar }
429*c83a76b0SSuyog Pawar }
430*c83a76b0SSuyog Pawar
431*c83a76b0SSuyog Pawar /*****************************************************************************/
432*c83a76b0SSuyog Pawar /* */
433*c83a76b0SSuyog Pawar /* Function Name : osal_thread_wait */
434*c83a76b0SSuyog Pawar /* */
435*c83a76b0SSuyog Pawar /* Description : This function causes the wait untill called thread */
436*c83a76b0SSuyog Pawar /* finishes execution */
437*c83a76b0SSuyog Pawar /* */
438*c83a76b0SSuyog Pawar /* Inputs : Thread Handle */
439*c83a76b0SSuyog Pawar /* */
440*c83a76b0SSuyog Pawar /* Globals : None */
441*c83a76b0SSuyog Pawar /* */
442*c83a76b0SSuyog Pawar /* Processing : Calls OS specific wait call for wait on another thread */
443*c83a76b0SSuyog Pawar /* */
444*c83a76b0SSuyog Pawar /* Outputs : Status of Thread wait */
445*c83a76b0SSuyog Pawar /* */
446*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - 0 */
447*c83a76b0SSuyog Pawar /* On FAILURE - -1 */
448*c83a76b0SSuyog Pawar /* */
449*c83a76b0SSuyog Pawar /* Issues : None */
450*c83a76b0SSuyog Pawar /* */
451*c83a76b0SSuyog Pawar /* Revision History: */
452*c83a76b0SSuyog Pawar /* */
453*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
454*c83a76b0SSuyog Pawar /* 30 03 2006 Ittiam Draft */
455*c83a76b0SSuyog Pawar /* */
456*c83a76b0SSuyog Pawar /*****************************************************************************/
457*c83a76b0SSuyog Pawar
osal_thread_wait(IN void * thread_handle)458*c83a76b0SSuyog Pawar WORD32 osal_thread_wait(IN void *thread_handle)
459*c83a76b0SSuyog Pawar {
460*c83a76b0SSuyog Pawar if(0 == thread_handle)
461*c83a76b0SSuyog Pawar return OSAL_ERROR;
462*c83a76b0SSuyog Pawar
463*c83a76b0SSuyog Pawar {
464*c83a76b0SSuyog Pawar WORD32 result = 0;
465*c83a76b0SSuyog Pawar void *status = 0;
466*c83a76b0SSuyog Pawar
467*c83a76b0SSuyog Pawar thread_handle_t *hdl = (thread_handle_t *)thread_handle;
468*c83a76b0SSuyog Pawar
469*c83a76b0SSuyog Pawar /* Join the thread to wait for thread to complete execution */
470*c83a76b0SSuyog Pawar result = pthread_join(hdl->thread_handle, (void **)&status);
471*c83a76b0SSuyog Pawar
472*c83a76b0SSuyog Pawar return result;
473*c83a76b0SSuyog Pawar }
474*c83a76b0SSuyog Pawar }
475*c83a76b0SSuyog Pawar
476*c83a76b0SSuyog Pawar /*****************************************************************************/
477*c83a76b0SSuyog Pawar /* */
478*c83a76b0SSuyog Pawar /* Function Name : osal_get_thread_handle */
479*c83a76b0SSuyog Pawar /* */
480*c83a76b0SSuyog Pawar /* Description : This function gets current thread handle. Currently not */
481*c83a76b0SSuyog Pawar /* supported */
482*c83a76b0SSuyog Pawar /* */
483*c83a76b0SSuyog Pawar /* Inputs : OSAL handle. */
484*c83a76b0SSuyog Pawar /* */
485*c83a76b0SSuyog Pawar /* Globals : None */
486*c83a76b0SSuyog Pawar /* */
487*c83a76b0SSuyog Pawar /* Processing : Gets all the thread properities and constructs a new */
488*c83a76b0SSuyog Pawar /* thread handle . */
489*c83a76b0SSuyog Pawar /* */
490*c83a76b0SSuyog Pawar /* Outputs : Thread handle to current thread. */
491*c83a76b0SSuyog Pawar /* */
492*c83a76b0SSuyog Pawar /* Returns : On SUCCESS - Current thread handle */
493*c83a76b0SSuyog Pawar /* On FAILURE - NULL */
494*c83a76b0SSuyog Pawar /* */
495*c83a76b0SSuyog Pawar /* Issues : Not supported on Linux and BIOS platforms. */
496*c83a76b0SSuyog Pawar /* */
497*c83a76b0SSuyog Pawar /* Revision History: */
498*c83a76b0SSuyog Pawar /* */
499*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
500*c83a76b0SSuyog Pawar /* 10 05 2006 Ittiam Draft */
501*c83a76b0SSuyog Pawar /* */
502*c83a76b0SSuyog Pawar /*****************************************************************************/
503*c83a76b0SSuyog Pawar
osal_get_thread_handle(IN void * osal_handle)504*c83a76b0SSuyog Pawar void *osal_get_thread_handle(IN void *osal_handle)
505*c83a76b0SSuyog Pawar {
506*c83a76b0SSuyog Pawar osal_t *handle = (osal_t *)osal_handle;
507*c83a76b0SSuyog Pawar
508*c83a76b0SSuyog Pawar if(0 == osal_handle)
509*c83a76b0SSuyog Pawar return 0;
510*c83a76b0SSuyog Pawar
511*c83a76b0SSuyog Pawar {
512*c83a76b0SSuyog Pawar thread_handle_t *hdl = handle->alloc(handle->mmr_handle, sizeof(thread_handle_t));
513*c83a76b0SSuyog Pawar WORD32 schedpolicy;
514*c83a76b0SSuyog Pawar struct sched_param schedparam;
515*c83a76b0SSuyog Pawar
516*c83a76b0SSuyog Pawar if(0 == hdl)
517*c83a76b0SSuyog Pawar return 0;
518*c83a76b0SSuyog Pawar
519*c83a76b0SSuyog Pawar hdl->mmr_handle = handle->mmr_handle;
520*c83a76b0SSuyog Pawar hdl->hdl = handle;
521*c83a76b0SSuyog Pawar hdl->exit_code = 0;
522*c83a76b0SSuyog Pawar hdl->thread_func = 0;
523*c83a76b0SSuyog Pawar hdl->thread_param = 0;
524*c83a76b0SSuyog Pawar hdl->thread_handle = pthread_self();
525*c83a76b0SSuyog Pawar hdl->thread_id = 0;
526*c83a76b0SSuyog Pawar hdl->priority = schedparam.sched_priority;
527*c83a76b0SSuyog Pawar
528*c83a76b0SSuyog Pawar /* Get thread priority from scheduling parameters */
529*c83a76b0SSuyog Pawar if(0 != pthread_getschedparam(hdl->thread_handle, &schedpolicy, &schedparam))
530*c83a76b0SSuyog Pawar {
531*c83a76b0SSuyog Pawar return 0;
532*c83a76b0SSuyog Pawar }
533*c83a76b0SSuyog Pawar
534*c83a76b0SSuyog Pawar return hdl;
535*c83a76b0SSuyog Pawar }
536*c83a76b0SSuyog Pawar }
537*c83a76b0SSuyog Pawar
538*c83a76b0SSuyog Pawar /*****************************************************************************/
539*c83a76b0SSuyog Pawar /* */
540*c83a76b0SSuyog Pawar /* Function Name : osal_get_time */
541*c83a76b0SSuyog Pawar /* */
542*c83a76b0SSuyog Pawar /* Description : This function returns absolute time in milli seconds */
543*c83a76b0SSuyog Pawar /* */
544*c83a76b0SSuyog Pawar /* Inputs : None */
545*c83a76b0SSuyog Pawar /* Globals : None */
546*c83a76b0SSuyog Pawar /* */
547*c83a76b0SSuyog Pawar /* Processing : Gets the absolute time by calling OS specific API's. */
548*c83a76b0SSuyog Pawar /* */
549*c83a76b0SSuyog Pawar /* Outputs : Absolute time in milli seconds. */
550*c83a76b0SSuyog Pawar /* */
551*c83a76b0SSuyog Pawar /* Returns : +ve 32 bit value */
552*c83a76b0SSuyog Pawar /* */
553*c83a76b0SSuyog Pawar /* Issues : None */
554*c83a76b0SSuyog Pawar /* */
555*c83a76b0SSuyog Pawar /* Revision History: */
556*c83a76b0SSuyog Pawar /* */
557*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
558*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
559*c83a76b0SSuyog Pawar /* */
560*c83a76b0SSuyog Pawar /*****************************************************************************/
561*c83a76b0SSuyog Pawar
osal_get_time()562*c83a76b0SSuyog Pawar UWORD32 osal_get_time()
563*c83a76b0SSuyog Pawar {
564*c83a76b0SSuyog Pawar {
565*c83a76b0SSuyog Pawar struct timespec time_val;
566*c83a76b0SSuyog Pawar int cur_time;
567*c83a76b0SSuyog Pawar
568*c83a76b0SSuyog Pawar /* Get the Monotonic time */
569*c83a76b0SSuyog Pawar clock_gettime(CLOCK_MONOTONIC, &time_val);
570*c83a76b0SSuyog Pawar
571*c83a76b0SSuyog Pawar /* Convert time in seconds and micro seconds into milliseconds time */
572*c83a76b0SSuyog Pawar cur_time = time_val.tv_sec * 1000 + time_val.tv_nsec / 1000000;
573*c83a76b0SSuyog Pawar return cur_time;
574*c83a76b0SSuyog Pawar }
575*c83a76b0SSuyog Pawar }
576*c83a76b0SSuyog Pawar
577*c83a76b0SSuyog Pawar /*****************************************************************************/
578*c83a76b0SSuyog Pawar /* */
579*c83a76b0SSuyog Pawar /* Function Name : osal_get_time_usec */
580*c83a76b0SSuyog Pawar /* */
581*c83a76b0SSuyog Pawar /* Description : This function returns absolute time in micro seconds */
582*c83a76b0SSuyog Pawar /* */
583*c83a76b0SSuyog Pawar /* Inputs : None */
584*c83a76b0SSuyog Pawar /* Globals : None */
585*c83a76b0SSuyog Pawar /* */
586*c83a76b0SSuyog Pawar /* Processing : Gets the absolute time by calling OS specific API's. */
587*c83a76b0SSuyog Pawar /* */
588*c83a76b0SSuyog Pawar /* Outputs : Absolute time in micro seconds. */
589*c83a76b0SSuyog Pawar /* */
590*c83a76b0SSuyog Pawar /* Returns : +ve 32 bit value */
591*c83a76b0SSuyog Pawar /* */
592*c83a76b0SSuyog Pawar /* Issues : None */
593*c83a76b0SSuyog Pawar /* */
594*c83a76b0SSuyog Pawar /* Revision History: */
595*c83a76b0SSuyog Pawar /* */
596*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
597*c83a76b0SSuyog Pawar /* 06 03 2009 Ittiam Draft */
598*c83a76b0SSuyog Pawar /* */
599*c83a76b0SSuyog Pawar /*****************************************************************************/
600*c83a76b0SSuyog Pawar
osal_get_time_usec(UWORD32 * sec,UWORD32 * usec)601*c83a76b0SSuyog Pawar WORD32 osal_get_time_usec(UWORD32 *sec, UWORD32 *usec)
602*c83a76b0SSuyog Pawar {
603*c83a76b0SSuyog Pawar if((0 == sec) || (0 == usec))
604*c83a76b0SSuyog Pawar return OSAL_ERROR;
605*c83a76b0SSuyog Pawar
606*c83a76b0SSuyog Pawar {
607*c83a76b0SSuyog Pawar struct timespec time_val;
608*c83a76b0SSuyog Pawar
609*c83a76b0SSuyog Pawar /* Get the Monotonic time */
610*c83a76b0SSuyog Pawar clock_gettime(CLOCK_MONOTONIC, &time_val);
611*c83a76b0SSuyog Pawar
612*c83a76b0SSuyog Pawar /* Convert time in seconds and micro seconds into milliseconds time */
613*c83a76b0SSuyog Pawar *sec = time_val.tv_sec;
614*c83a76b0SSuyog Pawar *usec = time_val.tv_nsec / 1000;
615*c83a76b0SSuyog Pawar
616*c83a76b0SSuyog Pawar return OSAL_SUCCESS;
617*c83a76b0SSuyog Pawar }
618*c83a76b0SSuyog Pawar }
619*c83a76b0SSuyog Pawar
620*c83a76b0SSuyog Pawar /*****************************************************************************/
621*c83a76b0SSuyog Pawar /* */
622*c83a76b0SSuyog Pawar /* Function Name : osal_get_last_error */
623*c83a76b0SSuyog Pawar /* */
624*c83a76b0SSuyog Pawar /* Description : This function gets the last error code. */
625*c83a76b0SSuyog Pawar /* */
626*c83a76b0SSuyog Pawar /* Inputs : None */
627*c83a76b0SSuyog Pawar /* Globals : None */
628*c83a76b0SSuyog Pawar /* */
629*c83a76b0SSuyog Pawar /* Processing : Gets the last occured error code by calling OS specific */
630*c83a76b0SSuyog Pawar /* API call. */
631*c83a76b0SSuyog Pawar /* */
632*c83a76b0SSuyog Pawar /* Outputs : Error Number */
633*c83a76b0SSuyog Pawar /* */
634*c83a76b0SSuyog Pawar /* Returns : If no error - 0 */
635*c83a76b0SSuyog Pawar /* Else - +ve number */
636*c83a76b0SSuyog Pawar /* */
637*c83a76b0SSuyog Pawar /* Issues : None */
638*c83a76b0SSuyog Pawar /* */
639*c83a76b0SSuyog Pawar /* Revision History: */
640*c83a76b0SSuyog Pawar /* */
641*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
642*c83a76b0SSuyog Pawar /* 06 03 2006 Ittiam Draft */
643*c83a76b0SSuyog Pawar /* */
644*c83a76b0SSuyog Pawar /*****************************************************************************/
645*c83a76b0SSuyog Pawar
osal_get_last_error()646*c83a76b0SSuyog Pawar UWORD32 osal_get_last_error()
647*c83a76b0SSuyog Pawar {
648*c83a76b0SSuyog Pawar UWORD32 get_linux_error(void);
649*c83a76b0SSuyog Pawar return get_linux_error();
650*c83a76b0SSuyog Pawar }
651*c83a76b0SSuyog Pawar
652*c83a76b0SSuyog Pawar /*****************************************************************************/
653*c83a76b0SSuyog Pawar /* */
654*c83a76b0SSuyog Pawar /* Function Name : osal_print_last_error */
655*c83a76b0SSuyog Pawar /* */
656*c83a76b0SSuyog Pawar /* Description : This function prints the last error message. */
657*c83a76b0SSuyog Pawar /* */
658*c83a76b0SSuyog Pawar /* Inputs : None */
659*c83a76b0SSuyog Pawar /* Globals : None */
660*c83a76b0SSuyog Pawar /* */
661*c83a76b0SSuyog Pawar /* Processing : Gets the last occured error code by calling OS specific */
662*c83a76b0SSuyog Pawar /* API call. It prints argument string (if not NULL), */
663*c83a76b0SSuyog Pawar /* followed by ': ' then the error_string and <new_line>. */
664*c83a76b0SSuyog Pawar /* */
665*c83a76b0SSuyog Pawar /* Outputs : None */
666*c83a76b0SSuyog Pawar /* */
667*c83a76b0SSuyog Pawar /* Returns : None */
668*c83a76b0SSuyog Pawar /* */
669*c83a76b0SSuyog Pawar /* Issues : None */
670*c83a76b0SSuyog Pawar /* */
671*c83a76b0SSuyog Pawar /* Revision History: */
672*c83a76b0SSuyog Pawar /* */
673*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
674*c83a76b0SSuyog Pawar /* 10 03 2006 Ittiam Draft */
675*c83a76b0SSuyog Pawar /* */
676*c83a76b0SSuyog Pawar /*****************************************************************************/
677*c83a76b0SSuyog Pawar
osal_print_last_error(IN const STRWORD8 * string)678*c83a76b0SSuyog Pawar void osal_print_last_error(IN const STRWORD8 *string)
679*c83a76b0SSuyog Pawar {
680*c83a76b0SSuyog Pawar perror(string);
681*c83a76b0SSuyog Pawar }
682*c83a76b0SSuyog Pawar
683*c83a76b0SSuyog Pawar /*****************************************************************************/
684*c83a76b0SSuyog Pawar /* */
685*c83a76b0SSuyog Pawar /* Function Name : osal_get_current_tid */
686*c83a76b0SSuyog Pawar /* */
687*c83a76b0SSuyog Pawar /* Description : Gets the tid of the thread in whose context this call */
688*c83a76b0SSuyog Pawar /* was made */
689*c83a76b0SSuyog Pawar /* */
690*c83a76b0SSuyog Pawar /* Inputs : None */
691*c83a76b0SSuyog Pawar /* Globals : None */
692*c83a76b0SSuyog Pawar /* Processing : None */
693*c83a76b0SSuyog Pawar /* Outputs : None */
694*c83a76b0SSuyog Pawar /* Returns : Thread ID, as a WORD32 */
695*c83a76b0SSuyog Pawar /* Issues : None */
696*c83a76b0SSuyog Pawar /* */
697*c83a76b0SSuyog Pawar /* Revision History: */
698*c83a76b0SSuyog Pawar /* */
699*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes (Describe the changes made) */
700*c83a76b0SSuyog Pawar /* 07 05 2015 Ittiam Draft */
701*c83a76b0SSuyog Pawar /* */
702*c83a76b0SSuyog Pawar /*****************************************************************************/
703*c83a76b0SSuyog Pawar
osal_get_current_tid(void)704*c83a76b0SSuyog Pawar WORD32 osal_get_current_tid(void)
705*c83a76b0SSuyog Pawar {
706*c83a76b0SSuyog Pawar return syscall(__NR_gettid);
707*c83a76b0SSuyog Pawar }
708