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