1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
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 /*****************************************************************************/
19*c83a76b0SSuyog Pawar /* */
20*c83a76b0SSuyog Pawar /* File Name : ithread.c */
21*c83a76b0SSuyog Pawar /* */
22*c83a76b0SSuyog Pawar /* Description : Contains abstraction for threads, mutex and semaphores*/
23*c83a76b0SSuyog Pawar /* */
24*c83a76b0SSuyog Pawar /* List of Functions : */
25*c83a76b0SSuyog Pawar /* */
26*c83a76b0SSuyog Pawar /* Issues / Problems : None */
27*c83a76b0SSuyog Pawar /* */
28*c83a76b0SSuyog Pawar /* Revision History : */
29*c83a76b0SSuyog Pawar /* */
30*c83a76b0SSuyog Pawar /* DD MM YYYY Author(s) Changes */
31*c83a76b0SSuyog Pawar /* 07 09 2012 Harish Initial Version */
32*c83a76b0SSuyog Pawar /*****************************************************************************/
33*c83a76b0SSuyog Pawar /*****************************************************************************/
34*c83a76b0SSuyog Pawar /* File Includes */
35*c83a76b0SSuyog Pawar /*****************************************************************************/
36*c83a76b0SSuyog Pawar #include <string.h>
37*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
38*c83a76b0SSuyog Pawar #include "ithread.h"
39*c83a76b0SSuyog Pawar #include <sys/types.h>
40*c83a76b0SSuyog Pawar
41*c83a76b0SSuyog Pawar //#define PTHREAD_AFFINITY
42*c83a76b0SSuyog Pawar //#define SYSCALL_AFFINITY
43*c83a76b0SSuyog Pawar
44*c83a76b0SSuyog Pawar #ifdef PTHREAD_AFFINITY
45*c83a76b0SSuyog Pawar #define _GNU_SOURCE
46*c83a76b0SSuyog Pawar #define __USE_GNU
47*c83a76b0SSuyog Pawar #endif
48*c83a76b0SSuyog Pawar
49*c83a76b0SSuyog Pawar #include <pthread.h>
50*c83a76b0SSuyog Pawar #include <sched.h>
51*c83a76b0SSuyog Pawar #include <semaphore.h>
52*c83a76b0SSuyog Pawar #include <unistd.h>
53*c83a76b0SSuyog Pawar
ithread_get_handle_size(void)54*c83a76b0SSuyog Pawar UWORD32 ithread_get_handle_size(void)
55*c83a76b0SSuyog Pawar {
56*c83a76b0SSuyog Pawar return sizeof(pthread_t);
57*c83a76b0SSuyog Pawar }
58*c83a76b0SSuyog Pawar
ithread_get_mutex_lock_size(void)59*c83a76b0SSuyog Pawar UWORD32 ithread_get_mutex_lock_size(void)
60*c83a76b0SSuyog Pawar {
61*c83a76b0SSuyog Pawar return sizeof(pthread_mutex_t);
62*c83a76b0SSuyog Pawar }
63*c83a76b0SSuyog Pawar
ithread_create(void * thread_handle,void * attribute,void * strt,void * argument)64*c83a76b0SSuyog Pawar WORD32 ithread_create(void *thread_handle, void *attribute, void *strt, void *argument)
65*c83a76b0SSuyog Pawar {
66*c83a76b0SSuyog Pawar return pthread_create((pthread_t *)thread_handle, attribute, (void * (*)(void *))strt, argument);
67*c83a76b0SSuyog Pawar }
68*c83a76b0SSuyog Pawar
ithread_join(void * thread_handle,void ** val_ptr)69*c83a76b0SSuyog Pawar WORD32 ithread_join(void *thread_handle, void **val_ptr)
70*c83a76b0SSuyog Pawar {
71*c83a76b0SSuyog Pawar pthread_t *pthread_handle = (pthread_t *)thread_handle;
72*c83a76b0SSuyog Pawar return pthread_join(*pthread_handle, val_ptr);
73*c83a76b0SSuyog Pawar }
74*c83a76b0SSuyog Pawar
ithread_exit(void * val_ptr)75*c83a76b0SSuyog Pawar void ithread_exit(void *val_ptr)
76*c83a76b0SSuyog Pawar {
77*c83a76b0SSuyog Pawar return pthread_exit(val_ptr);
78*c83a76b0SSuyog Pawar }
79*c83a76b0SSuyog Pawar
ithread_get_mutex_struct_size(void)80*c83a76b0SSuyog Pawar WORD32 ithread_get_mutex_struct_size(void)
81*c83a76b0SSuyog Pawar {
82*c83a76b0SSuyog Pawar return (sizeof(pthread_mutex_t));
83*c83a76b0SSuyog Pawar }
ithread_mutex_init(void * mutex)84*c83a76b0SSuyog Pawar WORD32 ithread_mutex_init(void *mutex)
85*c83a76b0SSuyog Pawar {
86*c83a76b0SSuyog Pawar return pthread_mutex_init((pthread_mutex_t *)mutex, NULL);
87*c83a76b0SSuyog Pawar }
88*c83a76b0SSuyog Pawar
ithread_mutex_destroy(void * mutex)89*c83a76b0SSuyog Pawar WORD32 ithread_mutex_destroy(void *mutex)
90*c83a76b0SSuyog Pawar {
91*c83a76b0SSuyog Pawar return pthread_mutex_destroy((pthread_mutex_t *)mutex);
92*c83a76b0SSuyog Pawar }
93*c83a76b0SSuyog Pawar
ithread_mutex_lock(void * mutex)94*c83a76b0SSuyog Pawar WORD32 ithread_mutex_lock(void *mutex)
95*c83a76b0SSuyog Pawar {
96*c83a76b0SSuyog Pawar return pthread_mutex_lock((pthread_mutex_t *)mutex);
97*c83a76b0SSuyog Pawar }
98*c83a76b0SSuyog Pawar
ithread_mutex_unlock(void * mutex)99*c83a76b0SSuyog Pawar WORD32 ithread_mutex_unlock(void *mutex)
100*c83a76b0SSuyog Pawar {
101*c83a76b0SSuyog Pawar return pthread_mutex_unlock((pthread_mutex_t *)mutex);
102*c83a76b0SSuyog Pawar }
103*c83a76b0SSuyog Pawar
ithread_yield(void)104*c83a76b0SSuyog Pawar void ithread_yield(void)
105*c83a76b0SSuyog Pawar {
106*c83a76b0SSuyog Pawar sched_yield();
107*c83a76b0SSuyog Pawar }
108*c83a76b0SSuyog Pawar
ithread_sleep(UWORD32 u4_time)109*c83a76b0SSuyog Pawar void ithread_sleep(UWORD32 u4_time)
110*c83a76b0SSuyog Pawar {
111*c83a76b0SSuyog Pawar usleep(u4_time * 1000 * 1000);
112*c83a76b0SSuyog Pawar }
113*c83a76b0SSuyog Pawar
ithread_msleep(UWORD32 u4_time_ms)114*c83a76b0SSuyog Pawar void ithread_msleep(UWORD32 u4_time_ms)
115*c83a76b0SSuyog Pawar {
116*c83a76b0SSuyog Pawar usleep(u4_time_ms * 1000);
117*c83a76b0SSuyog Pawar }
118*c83a76b0SSuyog Pawar
ithread_usleep(UWORD32 u4_time_us)119*c83a76b0SSuyog Pawar void ithread_usleep(UWORD32 u4_time_us)
120*c83a76b0SSuyog Pawar {
121*c83a76b0SSuyog Pawar usleep(u4_time_us);
122*c83a76b0SSuyog Pawar }
123*c83a76b0SSuyog Pawar
ithread_get_sem_struct_size(void)124*c83a76b0SSuyog Pawar UWORD32 ithread_get_sem_struct_size(void)
125*c83a76b0SSuyog Pawar {
126*c83a76b0SSuyog Pawar return (sizeof(sem_t));
127*c83a76b0SSuyog Pawar }
128*c83a76b0SSuyog Pawar
ithread_sem_init(void * sem,WORD32 pshared,UWORD32 value)129*c83a76b0SSuyog Pawar WORD32 ithread_sem_init(void *sem, WORD32 pshared, UWORD32 value)
130*c83a76b0SSuyog Pawar {
131*c83a76b0SSuyog Pawar return sem_init((sem_t *)sem, pshared, value);
132*c83a76b0SSuyog Pawar }
133*c83a76b0SSuyog Pawar
ithread_sem_post(void * sem)134*c83a76b0SSuyog Pawar WORD32 ithread_sem_post(void *sem)
135*c83a76b0SSuyog Pawar {
136*c83a76b0SSuyog Pawar return sem_post((sem_t *)sem);
137*c83a76b0SSuyog Pawar }
138*c83a76b0SSuyog Pawar
ithread_sem_wait(void * sem)139*c83a76b0SSuyog Pawar WORD32 ithread_sem_wait(void *sem)
140*c83a76b0SSuyog Pawar {
141*c83a76b0SSuyog Pawar return sem_wait((sem_t *)sem);
142*c83a76b0SSuyog Pawar }
143*c83a76b0SSuyog Pawar
ithread_sem_destroy(void * sem)144*c83a76b0SSuyog Pawar WORD32 ithread_sem_destroy(void *sem)
145*c83a76b0SSuyog Pawar {
146*c83a76b0SSuyog Pawar return sem_destroy((sem_t *)sem);
147*c83a76b0SSuyog Pawar }
148*c83a76b0SSuyog Pawar
ithread_set_affinity(WORD32 core_id)149*c83a76b0SSuyog Pawar WORD32 ithread_set_affinity(WORD32 core_id)
150*c83a76b0SSuyog Pawar {
151*c83a76b0SSuyog Pawar
152*c83a76b0SSuyog Pawar #ifdef PTHREAD_AFFINITY
153*c83a76b0SSuyog Pawar cpu_set_t cpuset;
154*c83a76b0SSuyog Pawar int num_cores = sysconf(_SC_NPROCESSORS_ONLN);
155*c83a76b0SSuyog Pawar pthread_t cur_thread = pthread_self();
156*c83a76b0SSuyog Pawar
157*c83a76b0SSuyog Pawar if(core_id >= num_cores)
158*c83a76b0SSuyog Pawar return -1;
159*c83a76b0SSuyog Pawar
160*c83a76b0SSuyog Pawar CPU_ZERO(&cpuset);
161*c83a76b0SSuyog Pawar CPU_SET(core_id, &cpuset);
162*c83a76b0SSuyog Pawar
163*c83a76b0SSuyog Pawar return pthread_setaffinity_np(cur_thread, sizeof(cpu_set_t), &cpuset);
164*c83a76b0SSuyog Pawar
165*c83a76b0SSuyog Pawar #elif SYSCALL_AFFINITY
166*c83a76b0SSuyog Pawar WORD32 i4_sys_res;
167*c83a76b0SSuyog Pawar
168*c83a76b0SSuyog Pawar pid_t pid = gettid();
169*c83a76b0SSuyog Pawar
170*c83a76b0SSuyog Pawar
171*c83a76b0SSuyog Pawar i4_sys_res = syscall(__NR_sched_setaffinity, pid, sizeof(i4_mask), &i4_mask);
172*c83a76b0SSuyog Pawar if(i4_sys_res)
173*c83a76b0SSuyog Pawar {
174*c83a76b0SSuyog Pawar //WORD32 err;
175*c83a76b0SSuyog Pawar //err = errno;
176*c83a76b0SSuyog Pawar //perror("Error in setaffinity syscall PERROR : ");
177*c83a76b0SSuyog Pawar //LOG_ERROR("Error in the syscall setaffinity: mask=0x%x err=0x%x", i4_mask, i4_sys_res);
178*c83a76b0SSuyog Pawar return -1;
179*c83a76b0SSuyog Pawar }
180*c83a76b0SSuyog Pawar #endif
181*c83a76b0SSuyog Pawar
182*c83a76b0SSuyog Pawar return core_id;
183*c83a76b0SSuyog Pawar }
184*c83a76b0SSuyog Pawar
ithread_get_cond_struct_size(void)185*c83a76b0SSuyog Pawar WORD32 ithread_get_cond_struct_size(void)
186*c83a76b0SSuyog Pawar {
187*c83a76b0SSuyog Pawar return (sizeof(pthread_cond_t));
188*c83a76b0SSuyog Pawar }
189*c83a76b0SSuyog Pawar
ithread_cond_init(void * cond)190*c83a76b0SSuyog Pawar WORD32 ithread_cond_init(void *cond)
191*c83a76b0SSuyog Pawar {
192*c83a76b0SSuyog Pawar return pthread_cond_init((pthread_cond_t *)cond, NULL);
193*c83a76b0SSuyog Pawar }
194*c83a76b0SSuyog Pawar
ithread_cond_destroy(void * cond)195*c83a76b0SSuyog Pawar WORD32 ithread_cond_destroy(void *cond)
196*c83a76b0SSuyog Pawar {
197*c83a76b0SSuyog Pawar return pthread_cond_destroy((pthread_cond_t *)cond);
198*c83a76b0SSuyog Pawar }
199*c83a76b0SSuyog Pawar
ithread_cond_wait(void * cond,void * mutex)200*c83a76b0SSuyog Pawar WORD32 ithread_cond_wait(void *cond, void *mutex)
201*c83a76b0SSuyog Pawar {
202*c83a76b0SSuyog Pawar return pthread_cond_wait((pthread_cond_t *)cond, (pthread_mutex_t *)mutex);
203*c83a76b0SSuyog Pawar }
204*c83a76b0SSuyog Pawar
ithread_cond_signal(void * cond)205*c83a76b0SSuyog Pawar WORD32 ithread_cond_signal(void *cond)
206*c83a76b0SSuyog Pawar {
207*c83a76b0SSuyog Pawar return pthread_cond_signal((pthread_cond_t *)cond);
208*c83a76b0SSuyog Pawar }
209