M4OSA_Thread.c revision 855ec7c4be7ad642721909d5837a8d25a117c22f
1855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*
2855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Copyright (C) 2004-2011 NXP Software
3855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project
4855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
5855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License");
6855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * you may not use this file except in compliance with the License.
7855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * You may obtain a copy of the License at
8855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
9855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *      http://www.apache.org/licenses/LICENSE-2.0
10855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *
11855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * Unless required by applicable law or agreed to in writing, software
12855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS,
13855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * See the License for the specific language governing permissions and
15855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * limitations under the License.
16855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi */
17855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
18855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
19855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
20855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @file         M4OSA_Thread.c
21855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @ingroup      OSAL
22855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief        Implements and manipulate threads
23855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note         This file implements functions to manipulate threads
24855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
25855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
26855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
27855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <sched.h>
28855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <time.h>
29855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <pthread.h>
30855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <errno.h>
31855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
32855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include <utils/threads.h>
33855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Debug.h"
34855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Memory.h"
35855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Thread.h"
36855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Thread_priv.h"
37855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Mutex.h"
38855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_Semaphore.h"
39855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#include "M4OSA_CharStar.h"
40855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
41855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
42855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargivoid* M4OSA_threadSyncForEverDo(void *context)
43855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
44855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
45855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_Bool auto_kill = M4OSA_FALSE;
46855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
47855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*
48855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       M4OSA_Void* userData;
49855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    */
50855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
51855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_1("M4OSA_threadSyncForEverDo\t\tLPVOID 0x%x", context);
52855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
53855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    /*
54855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi       userData = threadContext->userData;
55855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi    */
56855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
57855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
58855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
59855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   /*if(threadContext->startCallBack != M4OSA_NULL)
60855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
61855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      threadContext->startCallBack(threadContext, userData);
62855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }*/
63855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
64855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadRunning;
65855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
66855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_semaphorePost(threadContext->semStartStop);
67855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
68855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   while(threadContext->state == M4OSA_kThreadRunning)
69855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
70855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexUnlock(threadContext->stateMutex);
71855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
72855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      if((threadContext->func(threadContext->param)) != M4NO_ERROR)
73855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
74855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
75855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
76855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         if(threadContext->state == M4OSA_kThreadRunning)
77855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         {
78855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
79855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            //PR 2354 - ACO : Suppress stopping state and don't
80855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            //         unlock mutex before closing the thread
81855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            threadContext->state = M4OSA_kThreadOpened;
82855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            M4OSA_mutexUnlock(threadContext->stateMutex);
83855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            return 0;
84855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         }
85855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
86855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_mutexUnlock(threadContext->stateMutex);
87855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
88855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
89855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
90855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
91855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
92855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
93855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_semaphorePost(threadContext->semStartStop);
94855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
95855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
96855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
97855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
98855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
99855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return 0;
100855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
101855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
102855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
103855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
104855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
105855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
106855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
107855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
108855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi  * @brief      This method creates a new thread. After this call the thread is
109855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             identified by its "context". The thread function is provided by
110855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             the "func" parameter. This function creates & allocates a unique
111855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             context. It's the OSAL real time responsibility for managing its
112855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             context. It must be freed by the M4OSA_threadSyncClose function.
113855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             The context parameter will be sent back to any OSAL core thread
114855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             functions to allow retrieving data associated to the opened
115855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             thread.
116855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This function creates the thread, but the thread is not running.
117855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       Once the thread is created, the state is M4OSA_kThreadOpened.
118855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(OUT) Context of the created thread
119855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      func:(IN) "doIt" function pointer to run
120855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
121855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
122855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_ALLOC: there is no more available memory
123855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_CONTEXT_FAILED: the context creation failed
124855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi  ************************************************************************
125855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
126855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncOpen(M4OSA_Context* context,
127855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                               M4OSA_ThreadDoIt func)
128855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
129855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = M4OSA_NULL;
130855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ERR err_code;
131855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
132855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_2("M4OSA_threadSyncOpen\t\tM4OSA_Context* 0x%x\t"
133855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_ThreadDoIt 0x%x", context, func);
134855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
135855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
136855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncOpen");
137855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
138855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(func == M4OSA_NULL,
139855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    M4ERR_PARAMETER, "M4OSA_threadSyncOpen");
140855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
141855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   *context = M4OSA_NULL;
142855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
143855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext =
144855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      (M4OSA_ThreadContext*)M4OSA_malloc(sizeof(M4OSA_ThreadContext),
145855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_THREAD, (M4OSA_Char*)"M4OSA_threadSyncOpen: thread context");
146855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
147855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext == M4OSA_NULL)
148855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
149855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_threadSyncOpen");
150855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
151855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_ALLOC;
152855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
153855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
154855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->func = func;
155855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->stackSize = 64 * 1024;
156855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->name = M4OSA_NULL;
157855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->threadID = 0;
158855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->coreID = M4OSA_THREAD;
159855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*
160855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->userData = M4OSA_NULL;
161855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->stopCallBack = M4OSA_NULL;
162855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->startCallBack = M4OSA_NULL;
163855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
164855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadOpened;
165855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->priority = M4OSA_kThreadNormalPriority ;
166855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
167855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   err_code = M4OSA_mutexOpen(&(threadContext->stateMutex));
168855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
169855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(M4OSA_ERR_IS_ERROR(err_code))
170855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
171855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(err_code, "M4OSA_threadSyncOpen: M4OSA_mutexOpen");
172855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
173855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return err_code;
174855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
175855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
176855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   err_code = M4OSA_semaphoreOpen(&(threadContext->semStartStop), 0);
177855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
178855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(M4OSA_ERR_IS_ERROR(err_code))
179855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
180855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(err_code, "M4OSA_threadSyncOpen: M4OSA_semaphoreOpen");
181855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
182855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return err_code;
183855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
184855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
185855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   *context = threadContext;
186855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
187855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
188855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
189855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
190855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
191855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
192855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
193855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
194855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
195855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
196855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method runs a specified thread. The "param" parameter
197855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             allows the application to set a specific parameter to the
198855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             created thread. This parameter will be used as the second one of
199855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             the "M4OSA_ThreadDoIt" function.
200855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This method is a blocking up to the thread is running.
201855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Before calling this method, the state is M4OSA_kThreadOpened.
202855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Once the method is called, the state is M4OSA_kThreadStarting.
203855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Once the thread is running, the state is M4OSA_kThreadRunning.
204855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This method returns immediately. If the "threadStarted" optionID
205855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             is not NULL, the thread will call it before running the doIt
206855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             function.
207855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the thread
208855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      param:(IN) Application data thread parameter
209855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
210855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
211855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
212855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_STATE: this function cannot be called now
213855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_THREAD_NOT_STARTED: the thread did not start
214855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
215855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
216855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncStart(M4OSA_Context context,
217855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                M4OSA_Void* param)
218855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
219855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext =  (M4OSA_ThreadContext*)context;
220855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   pthread_attr_t     attribute = { 0, 0, 0, 0, 0, 0 };
221855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   int                min       = 0;
222855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   int                max       = 0;
223855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   int                priority  = 0;
224855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   struct sched_param sched     = { 0 };
225855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
226855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_2("M4OSA_threadSyncStart\t\tM4OSA_Context 0x%x\tM4OSA_Void* "
227855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "0x%x", context, param);
228855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
229855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
230855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncStart");
231855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
232855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
233855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncStart");
234855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
235855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
236855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
237855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->state != M4OSA_kThreadOpened)
238855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
239855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexUnlock(threadContext->stateMutex);
240855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
241855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_STATE, "M4OSA_threadSyncStart");
242855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
243855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_STATE;
244855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
245855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
246855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadStarting;
247855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
248855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
249855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->param = param;
250855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
251855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if ( 0 == pthread_attr_init( &attribute ) )
252855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
253855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      if ( 0 == pthread_attr_setdetachstate( &attribute, PTHREAD_CREATE_DETACHED ) )
254855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
255855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         if ( 0 == pthread_attr_setstacksize( &attribute, (size_t)threadContext->stackSize ) )
256855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         {
257855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            if ( 0 == pthread_attr_setschedpolicy( &attribute, SCHED_OTHER ) )
258855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            {
259855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if 0
260855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                min = sched_get_priority_min( SCHED_OTHER );
261855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                max = sched_get_priority_max( SCHED_OTHER );
262855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
263855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                switch(threadContext->priority)
264855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                {
265855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadLowestPriority:
266855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = min;
267855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
268855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadLowPriority:
269855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = min + ( max - min ) / 4;
270855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
271855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadNormalPriority:
272855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = min + ( max - min ) / 2;
273855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
274855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadHighPriority:
275855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = max - ( max - min ) / 4;
276855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
277855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadHighestPriority:
278855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = max;
279855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
280855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                }
281855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#else
282855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* Tentative patches to handle priorities in a better way : */
283855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* Use Android's predefined priorities (range +19..-20)
284855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                 *rather than Linux ones (0..99)*/
285855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
286855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* Get min and max priorities */
287855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                min = sched_get_priority_min( SCHED_FIFO );
288855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                max = sched_get_priority_max( SCHED_FIFO );
289855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
290855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                M4OSA_TRACE1_2("M4OSA_threadSyncStart MAX=%d MIN=%d", max, min);
291855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
292855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* tentative modification of the priorities */
293855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* Set the priority based on default android priorities */
294855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* This probably requires some more tuning,
295855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                 * outcome of this priority settings are not yet satisfactory */
296855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                /* Implementing thread handling based on Android's thread creation
297855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                 * helpers might bring some improvement (see threads.h) */
298855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                switch(threadContext->priority)
299855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                {
300855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadLowestPriority:
301855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = ANDROID_PRIORITY_NORMAL;
302855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
303855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadLowPriority:
304855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = ANDROID_PRIORITY_DISPLAY;
305855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
306855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadNormalPriority:
307855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = ANDROID_PRIORITY_URGENT_DISPLAY;
308855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
309855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadHighPriority:
310855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = ANDROID_PRIORITY_AUDIO;
311855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
312855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                case M4OSA_kThreadHighestPriority:
313855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    priority = ANDROID_PRIORITY_URGENT_AUDIO;
314855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    break;
315855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                }
316855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif
317855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                sched.sched_priority = priority;
318855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
319855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                if ( 0 == pthread_attr_setschedparam( &attribute, &sched ) )
320855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                {
321855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    if ( 0 == pthread_create( &threadContext->threadID,
322855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                              &attribute,
323855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                              &M4OSA_threadSyncForEverDo,
324855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                              (void *)threadContext ) )
325855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    {
326855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        if ( M4OSA_FALSE == M4OSA_ERR_IS_ERROR( M4OSA_semaphoreWait(
327855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                                    threadContext->semStartStop,
328855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                                                    M4OSA_WAIT_FOREVER ) ) )
329855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        {
330855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                            return M4NO_ERROR;
331855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                        }
332855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                    }
333855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                }
334855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi            }
335855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         }
336855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
337855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      pthread_attr_destroy( &attribute );
338855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
339855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
340855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
341855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
342855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadOpened;
343855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
344855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
345855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
346855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG(M4ERR_THREAD_NOT_STARTED, "M4OSA_threadSyncStart");
347855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
348855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4ERR_THREAD_NOT_STARTED;
349855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
350855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
351855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
352855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
353855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
354855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
355855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
356855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method stops a specified thread.
357855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This call is a blocking one up to the "M4OSA_ThreadDoIt"
358855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             function has returned.
359855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Before the method is called, the state is M4OSA_kThreadRunning.
360855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Once the method is called, the state is M4OSA_kThreadStopping.
361855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Once the thread is stopped, the state is M4OSA_kThreadOpened.
362855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This method returns once the thread has been stopped. If the
363855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             "threadStopped" optionID is not NULL, the thread will call it
364855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             before dying.
365855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the thread
366855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
367855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
368855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_STATE: this function cannot be called now
369855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
370855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
371855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
372855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncStop(M4OSA_Context context)
373855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
374855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
375855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
376855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_1("M4OSA_threadSyncStop\t\tM4OSA_Context 0x%x", context);
377855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
378855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
379855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncStop");
380855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
381855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
382855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncStop");
383855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
384855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
385855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
386855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->state != M4OSA_kThreadRunning)
387855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
388855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexUnlock(threadContext->stateMutex);
389855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
390855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_STATE, "M4OSA_threadSyncStop");
391855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
392855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_STATE;
393855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
394855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
395855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadStopping;
396855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
397855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
398855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
399855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_semaphoreWait(threadContext->semStartStop, M4OSA_WAIT_FOREVER);
400855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
401855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
402855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
403855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadOpened;
404855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
405855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
406855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
407855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
408855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
409855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
410855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
411855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
412855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
413855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
414855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
415855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method deletes a thread (identified by its context). After
416855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             this call the thread and its context are no more useable. This
417855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             function frees all the memory related to this thread.
418855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       Before the method is called, the state is M4OSA_kThreadOpened.
419855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             Once the method is called, the state is M4OSA_kThreadClosed.
420855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the thread
421855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
422855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
423855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_STATE: this function cannot be called now
424855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
425855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
426855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
427855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncClose(M4OSA_Context context)
428855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
429855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
430855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ERR err_code;
431855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
432855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_1("M4OSA_threadSyncClose\t\tM4OSA_Context 0x%x", context);
433855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
434855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
435855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncClose");
436855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
437855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
438855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncClose");
439855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
440855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->state == M4OSA_kThreadClosed,
441855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncClose");
442855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
443855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
444855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
445855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->state != M4OSA_kThreadOpened)
446855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
447855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexUnlock(threadContext->stateMutex);
448855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
449855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_STATE, "M4OSA_threadSyncClose");
450855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
451855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_STATE;
452855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
453855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
454855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->state = M4OSA_kThreadClosed;
455855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
456855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
457855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
458855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   err_code = M4OSA_mutexClose(threadContext->stateMutex);
459855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
460855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(M4OSA_ERR_IS_ERROR(err_code))
461855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
462855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(err_code, "M4OSA_threadSyncClose: M4OSA_mutexClose");
463855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
464855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return err_code;
465855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
466855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
467855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   err_code = M4OSA_semaphoreClose(threadContext->semStartStop);
468855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
469855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(M4OSA_ERR_IS_ERROR(err_code))
470855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
471855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(err_code, "M4OSA_threadSyncClose: M4OSA_semaphoreClose");
472855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
473855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return err_code;
474855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
475855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
476855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->name != M4OSA_NULL)
477855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
478855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_free((M4OSA_MemAddr32)threadContext->name);
479855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
480855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
481855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_free((M4OSA_MemAddr32)threadContext);
482855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
483855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
484855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
485855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
486855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
487855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
488855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
489855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
490855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
491855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method asks the thread to return its state.
492855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       The caller is responsible for allocating/deallocating the state
493855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             field.
494855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN) Context of the thread
495855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      state:(OUT) Thread state
496855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
497855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
498855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
499855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
500855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
501855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncGetState(M4OSA_Context context,
502855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                   M4OSA_ThreadState* state)
503855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
504855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
505855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
506855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_2("M4OSA_threadSyncGetState\t\tM4OSA_Context 0x%x\t"
507855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_ThreadState* 0x%x", context, state);
508855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
509855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
510855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncGetState");
511855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
512855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(state == M4OSA_NULL,
513855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncGetState");
514855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
515855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
516855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncGetState");
517855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
518855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   *state = threadContext->state;
519855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
520855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
521855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
522855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
523855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
524855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
525855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
526855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
527855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
528855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method asks the calling thread to sleep during "timeSleep"
529855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             milliseconds.
530855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       This function does not have any context.
531855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      time:(IN) Time to sleep in milliseconds
532855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
533855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
534855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
535855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSleep(M4OSA_UInt32 time)
536855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
537855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   struct timespec rqtp = { 0, 0 };
538855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   struct timespec rmtp = { 0, 0 };
539855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
540855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_1("M4OSA_threadSleep\t\tM4OSA_UInt32 %d", time);
541855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
542855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   rqtp.tv_sec = (time_t)time/1000;
543855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   rqtp.tv_nsec = (time%1000) * 1000000;
544855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   nanosleep(&rqtp, &rmtp);
545855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
546855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
547855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
548855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
549855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
550855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
551855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
552855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STARTED == M4OSA_TRUE)
553855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
554855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*M4OSA_ERR M4OSA_SetThreadSyncStarted(M4OSA_Context context,
555855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                 M4OSA_DataOption optionValue)
556855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
557855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context ;
558855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
559855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncStarted\t\tM4OSA_Context 0x%x\t"
560855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
561855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
562855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->startCallBack = (M4OSA_ThreadCallBack)optionValue;
563855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
564855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
565855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}*/
566855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
567855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STARTED*/
568855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
569855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
570855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
571855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
572855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STOPPED == M4OSA_TRUE)
573855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
574855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*M4OSA_ERR M4OSA_SetThreadSyncStopped(M4OSA_Context context,
575855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                 M4OSA_DataOption optionValue)
576855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
577855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
578855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
579855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncStopped\t\tM4OSA_Context 0x%x\t"
580855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
581855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
582855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->stopCallBack = (M4OSA_ThreadCallBack)optionValue;
583855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
584855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
585855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}*/
586855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
587855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STOPPED*/
588855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
589855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
590855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
591855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_PRIORITY == M4OSA_TRUE)
592855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
593855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_SetThreadSyncPriority(M4OSA_Context context,
594855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4OSA_DataOption optionValue)
595855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
596855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
597855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadPriorityLevel priority
598855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                 = (M4OSA_ThreadPriorityLevel)(optionValue);
599855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
600855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncPriority\t\tM4OSA_Context 0x%x\t"
601855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
602855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
603855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if((M4OSA_UInt32)optionValue>M4OSA_kThreadLowestPriority)
604855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
605855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_PARAMETER;
606855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
607855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
608855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->priority = priority;
609855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
610855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
611855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
612855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
613855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_PRIORITY*/
614855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
615855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
616855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
617855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
618855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_NAME == M4OSA_TRUE)
619855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
620855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_SetThreadSyncName(M4OSA_Context context,
621855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                              M4OSA_DataOption optionValue)
622855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
623855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
624855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_Char* name = (M4OSA_Char*)optionValue;
625855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_UInt32 nameSize ;
626855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
627855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncName\t\tM4OSA_Context 0x%x\t"
628855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
629855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
630855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->name != NULL)
631855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
632855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_free((M4OSA_MemAddr32)threadContext->name);
633855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      threadContext->name = M4OSA_NULL;
634855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
635855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
636855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(optionValue != M4OSA_NULL)
637855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
638855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      nameSize = M4OSA_chrLength(name)+1;
639855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
640855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      threadContext->name =
641855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         (M4OSA_Char*)M4OSA_malloc(nameSize, M4OSA_THREAD,
642855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         (M4OSA_Char*)"M4OSA_SetThreadSyncName: thread name");
643855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
644855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      if(threadContext == M4OSA_NULL)
645855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
646855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4ERR_ALLOC;
647855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
648855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
649855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_memcpy((M4OSA_MemAddr8)threadContext->name, (M4OSA_MemAddr8)name,
650855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   nameSize);
651855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
652855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
653855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
654855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
655855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
656855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_NAME*/
657855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
658855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
659855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STACK_SIZE == M4OSA_TRUE)
660855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
661855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_SetThreadSyncStackSize(M4OSA_Context context,
662855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                   M4OSA_DataOption optionValue)
663855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
664855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
665855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
666855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncStackSize\t\tM4OSA_Context 0x%x\t"
667855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
668855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
669855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->stackSize = (M4OSA_UInt32)optionValue;
670855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
671855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
672855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
673855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
674855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STACK_SIZE*/
675855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
676855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
677855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
678855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_USER_DATA == M4OSA_TRUE)
679855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
680855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/*M4OSA_ERR M4OSA_SetThreadSyncUserData(M4OSA_Context context,
681855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                  M4OSA_DataOption optionValue)
682855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
683855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
684855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
685855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE2_2("M4OSA_SetThreadSyncUserData\t\tM4OSA_Context 0x%x\t"
686855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_DataOption 0x%x", context, optionValue);
687855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
688855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   threadContext->userData = (M4OSA_Void*)optionValue;
689855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
690855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4NO_ERROR;
691855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}*/
692855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
693855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_USER_DATA*/
694855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
695855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
696855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
697855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
698855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
699855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
700855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
701855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method asks the core OSAL-Thread component to set the value
702855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             associated with the optionID. The caller is responsible for
703855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             allocating/deallocating the memory of the value field.
704855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       As the caller is responsible of allocating/de-allocating the
705855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             "value" field, the callee must copy this field to its internal
706855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             variable.
707855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN/OUT) Context of the thread
708855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      optionID:(IN) ID of the option
709855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      optionValue:(IN) Value of the option
710855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
711855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
712855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
713855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
714855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_STATE: this option is not available now
715855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_READ_ONLY: this option is a read only one
716855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
717855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
718855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
719855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncSetOption(M4OSA_Context context,
720855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    M4OSA_ThreadOptionID optionID,
721855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    M4OSA_DataOption optionValue)
722855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
723855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
724855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ERR err_code;
725855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
726855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_3("M4OSA_threadSyncSetOption\t\tM4OSA_Context 0x%x\t"
727855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_OptionID %d\tM4OSA_DataOption 0x%x",
728855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  context, optionID, optionValue);
729855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
730855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
731855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncSetOption");
732855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
733855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(optionID == M4OSA_NULL,
734855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncSetOption");
735855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
736855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
737855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncSetOption");
738855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
739855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_THREAD),
740855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_OPTION_ID, "M4OSA_threadSyncSetOption");
741855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
742855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_WRITABLE(optionID),
743855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_READ_ONLY, "M4OSA_threadSyncSetOption");
744855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
745855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
746855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexLock(threadContext->stateMutex, M4OSA_WAIT_FOREVER);
747855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
748855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   if(threadContext->state != M4OSA_kThreadOpened)
749855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
750855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_mutexUnlock(threadContext->stateMutex);
751855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
752855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      M4OSA_DEBUG(M4ERR_STATE, "M4OSA_threadSyncSetOption");
753855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
754855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      return M4ERR_STATE;
755855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
756855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
757855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   switch(optionID)
758855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
759855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STARTED == M4OSA_TRUE)
760855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadStarted:
761855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
762855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncStarted(context, optionValue);
763855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
764855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
765855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
766855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STARTED*/
767855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
768855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STOPPED == M4OSA_TRUE)
769855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadStopped:
770855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
771855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncStopped(context, optionValue);
772855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
773855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
774855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
775855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STOPPED*/
776855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
777855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_USER_DATA == M4OSA_TRUE)
778855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadUserData:
779855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
780855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncUserData(context, optionValue);
781855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
782855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
783855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
784855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_USER_DATA*/
785855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
786855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_PRIORITY == M4OSA_TRUE)
787855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadPriority:
788855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
789855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncPriority(context, optionValue);
790855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
791855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
792855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
793855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_PRIORITY*/
794855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
795855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_NAME == M4OSA_TRUE)
796855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadName:
797855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
798855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncName(context, optionValue);
799855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
800855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
801855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
802855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_NAME*/
803855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
804855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STACK_SIZE == M4OSA_TRUE)
805855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadStackSize:
806855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
807855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4OSA_SetThreadSyncStackSize(context, optionValue);
808855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
809855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         break;
810855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
811855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STACK_SIZE*/
812855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
813855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      default:
814855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
815855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_DEBUG(M4ERR_NOT_IMPLEMENTED, "M4OSA_threadSyncSetOption");
816855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
817855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         err_code = M4ERR_NOT_IMPLEMENTED;
818855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
819855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
820855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
821855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_mutexUnlock(threadContext->stateMutex);
822855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
823855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return err_code;
824855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
825855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
826855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
827855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
828855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi/**
829855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
830855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @brief      This method asks the OSAL-Thread to return the value associated
831855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             with the optionID. The caller is responsible for
832855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             allocating/deallocating the memory of the value field.
833855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       "optionValue" must be cast according to the type related to the
834855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             optionID.
835855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @note       As the caller is responsible for de-allocating the "value"
836855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             field, the core OSAL-Thread component must perform a copy of its
837855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi *             internal value to the value field.
838855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      context:(IN) Context of the thread
839855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      optionID:(IN) ID of the option
840855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @param      optionValue:(OUT) Value of the option
841855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4NO_ERROR: there is no error
842855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_PARAMETER: at least one parameter is NULL
843855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_CONTEXT: provided context is not a valid one
844855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_BAD_OPTION_ID: the optionID is not a valid one
845855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_WRITE_ONLY: this option is a write only one
846855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi * @return     M4ERR_NOT_IMPLEMENTED: this option is not implemented
847855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi ************************************************************************
848855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi*/
849855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray KundargiM4OSA_ERR M4OSA_threadSyncGetOption(M4OSA_Context context,
850855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    M4OSA_ThreadOptionID optionID,
851855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    M4OSA_DataOption* optionValue)
852855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi{
853855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_ThreadContext* threadContext = (M4OSA_ThreadContext*)context;
854855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
855855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_TRACE1_3("M4OSA_threadSyncGetOption\t\tM4OSA_Context 0x%x\t"
856855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  "M4OSA_OptionID %d\tM4OSA_DataOption* 0x%x",
857855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                  context, optionID, optionValue);
858855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
859855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(context == M4OSA_NULL,
860855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncGetOption");
861855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
862855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(optionID == M4OSA_NULL,
863855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncGetOption");
864855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
865855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(optionValue == M4OSA_NULL,
866855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_PARAMETER, "M4OSA_threadSyncGetOption");
867855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
868855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(threadContext->coreID != M4OSA_THREAD,
869855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_CONTEXT, "M4OSA_threadSyncGetOption");
870855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
871855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_COREID(optionID, M4OSA_THREAD),
872855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_BAD_OPTION_ID, "M4OSA_threadSyncGetOption");
873855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
874855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG_IF2(!M4OSA_OPTION_ID_IS_READABLE(optionID),
875855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                   M4ERR_WRITE_ONLY, "M4OSA_threadSyncGetOption");
876855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
877855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   switch(optionID)
878855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   {
879855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STARTED == M4OSA_TRUE)
880855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadStarted:
881855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
882855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_ThreadCallBack* startCallBack = (M4OSA_ThreadCallBack*)optionValue;
883855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
884855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *startCallBack = threadContext->startCallBack;
885855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
886855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
887855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
888855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STARTED*/
889855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
890855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STOPPED == M4OSA_TRUE)
891855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadStopped:
892855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
893855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_ThreadCallBack* stopCallBack = (M4OSA_ThreadCallBack*)optionValue;
894855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
895855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *stopCallBack = threadContext->stopCallBack;
896855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
897855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
898855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
899855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STOPPED*/
900855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
901855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_USER_DATA == M4OSA_TRUE)
902855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      /*case M4OSA_ThreadUserData:
903855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
904855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_Void** userData = (M4OSA_Void**)optionValue;
905855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
906855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *userData = threadContext->userData;
907855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
908855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
909855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }*/
910855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_USER_DATA*/
911855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
912855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_PRIORITY == M4OSA_TRUE)
913855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadPriority:
914855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
915855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_ThreadPriorityLevel* priority =
916855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi                                    (M4OSA_ThreadPriorityLevel*)optionValue;
917855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
918855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *priority = threadContext->priority;
919855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
920855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
921855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
922855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_PRIORITY*/
923855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
924855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_NAME == M4OSA_TRUE)
925855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadName:
926855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
927855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_Char** name = (M4OSA_Char**)optionValue;
928855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
929855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *name = threadContext->name;
930855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
931855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
932855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
933855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_NAME*/
934855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
935855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#if(M4OSA_OPTIONID_THREAD_STACK_SIZE == M4OSA_TRUE)
936855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      case M4OSA_ThreadStackSize:
937855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      {
938855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         M4OSA_UInt32* stackSize = (M4OSA_UInt32*)optionValue;
939855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
940855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         *stackSize = threadContext->stackSize;
941855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
942855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi         return M4NO_ERROR;
943855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      }
944855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi#endif /*M4OSA_OPTIONID_THREAD_STACK_SIZE*/
945855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
946855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi      default:
947855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi        break;
948855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   }
949855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
950855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   M4OSA_DEBUG(M4ERR_NOT_IMPLEMENTED, "M4OSA_threadSyncGetOption");
951855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
952855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi   return M4ERR_NOT_IMPLEMENTED;
953855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi}
954855ec7c4be7ad642721909d5837a8d25a117c22fDharmaray Kundargi
955