1e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 234ee09551764b045fdc02df754157473125edf60Kevin Tang * 334ee09551764b045fdc02df754157473125edf60Kevin Tang * Redistribution and use in source and binary forms, with or without 434ee09551764b045fdc02df754157473125edf60Kevin Tang * modification, are permitted provided that the following conditions are 534ee09551764b045fdc02df754157473125edf60Kevin Tang * met: 634ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions of source code must retain the above copyright 734ee09551764b045fdc02df754157473125edf60Kevin Tang * notice, this list of conditions and the following disclaimer. 834ee09551764b045fdc02df754157473125edf60Kevin Tang * * Redistributions in binary form must reproduce the above 934ee09551764b045fdc02df754157473125edf60Kevin Tang * copyright notice, this list of conditions and the following 1034ee09551764b045fdc02df754157473125edf60Kevin Tang * disclaimer in the documentation and/or other materials provided 1134ee09551764b045fdc02df754157473125edf60Kevin Tang * with the distribution. 12e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo * * Neither the name of The Linux Foundation nor the names of its 1334ee09551764b045fdc02df754157473125edf60Kevin Tang * contributors may be used to endorse or promote products derived 1434ee09551764b045fdc02df754157473125edf60Kevin Tang * from this software without specific prior written permission. 1534ee09551764b045fdc02df754157473125edf60Kevin Tang * 1634ee09551764b045fdc02df754157473125edf60Kevin Tang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1734ee09551764b045fdc02df754157473125edf60Kevin Tang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1834ee09551764b045fdc02df754157473125edf60Kevin Tang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1934ee09551764b045fdc02df754157473125edf60Kevin Tang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2034ee09551764b045fdc02df754157473125edf60Kevin Tang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2134ee09551764b045fdc02df754157473125edf60Kevin Tang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2234ee09551764b045fdc02df754157473125edf60Kevin Tang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2334ee09551764b045fdc02df754157473125edf60Kevin Tang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2434ee09551764b045fdc02df754157473125edf60Kevin Tang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2534ee09551764b045fdc02df754157473125edf60Kevin Tang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2634ee09551764b045fdc02df754157473125edf60Kevin Tang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2734ee09551764b045fdc02df754157473125edf60Kevin Tang * 2834ee09551764b045fdc02df754157473125edf60Kevin Tang */ 2934ee09551764b045fdc02df754157473125edf60Kevin Tang#include <stdio.h> 3034ee09551764b045fdc02df754157473125edf60Kevin Tang 3134ee09551764b045fdc02df754157473125edf60Kevin Tang#include "log_util.h" 32e14a6c846df2ce4bb1847e4250991f7c52fd793dDante Russo#include "platform_lib_includes.h" 3334ee09551764b045fdc02df754157473125edf60Kevin Tang#include "loc_eng_dmn_conn_thread_helper.h" 3434ee09551764b045fdc02df754157473125edf60Kevin Tang 3534ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 3634ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION thelper_signal_init 3734ee09551764b045fdc02df754157473125edf60Kevin Tang 3834ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 3934ee09551764b045fdc02df754157473125edf60Kevin Tang This function will initialize the conditional variable resources. 4034ee09551764b045fdc02df754157473125edf60Kevin Tang 4134ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - thelper instance 4234ee09551764b045fdc02df754157473125edf60Kevin Tang 4334ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 4434ee09551764b045fdc02df754157473125edf60Kevin Tang None 4534ee09551764b045fdc02df754157473125edf60Kevin Tang 4634ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 4734ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 4834ee09551764b045fdc02df754157473125edf60Kevin Tang 4934ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 5034ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 5134ee09551764b045fdc02df754157473125edf60Kevin Tang 5234ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 5334ee09551764b045fdc02df754157473125edf60Kevin Tangint thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper) 5434ee09551764b045fdc02df754157473125edf60Kevin Tang{ 5534ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 5634ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_exit = 0; 5734ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_ready = 0; 5834ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_cond_init( &thelper->thread_cond, NULL); 5934ee09551764b045fdc02df754157473125edf60Kevin Tang if (result) { 6034ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 6134ee09551764b045fdc02df754157473125edf60Kevin Tang } 6234ee09551764b045fdc02df754157473125edf60Kevin Tang 6334ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_mutex_init(&thelper->thread_mutex, NULL); 6434ee09551764b045fdc02df754157473125edf60Kevin Tang if (result) { 6534ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_cond_destroy(&thelper->thread_cond); 6634ee09551764b045fdc02df754157473125edf60Kevin Tang } 6734ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 6834ee09551764b045fdc02df754157473125edf60Kevin Tang} 6934ee09551764b045fdc02df754157473125edf60Kevin Tang 7034ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 7134ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION 7234ee09551764b045fdc02df754157473125edf60Kevin Tang 7334ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 7434ee09551764b045fdc02df754157473125edf60Kevin Tang This function will destroy the conditional variable resources 7534ee09551764b045fdc02df754157473125edf60Kevin Tang 7634ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 7734ee09551764b045fdc02df754157473125edf60Kevin Tang 7834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 7934ee09551764b045fdc02df754157473125edf60Kevin Tang None 8034ee09551764b045fdc02df754157473125edf60Kevin Tang 8134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 8234ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 8334ee09551764b045fdc02df754157473125edf60Kevin Tang 8434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 8534ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 8634ee09551764b045fdc02df754157473125edf60Kevin Tang 8734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 8834ee09551764b045fdc02df754157473125edf60Kevin Tangint thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper) 8934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 9034ee09551764b045fdc02df754157473125edf60Kevin Tang int result, ret_result = 0; 9134ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_cond_destroy( &thelper->thread_cond); 9234ee09551764b045fdc02df754157473125edf60Kevin Tang if (result) { 9334ee09551764b045fdc02df754157473125edf60Kevin Tang ret_result = result; 9434ee09551764b045fdc02df754157473125edf60Kevin Tang } 9534ee09551764b045fdc02df754157473125edf60Kevin Tang 9634ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_mutex_destroy(&thelper->thread_mutex); 9734ee09551764b045fdc02df754157473125edf60Kevin Tang if (result) { 9834ee09551764b045fdc02df754157473125edf60Kevin Tang ret_result = result; 9934ee09551764b045fdc02df754157473125edf60Kevin Tang } 10034ee09551764b045fdc02df754157473125edf60Kevin Tang 10134ee09551764b045fdc02df754157473125edf60Kevin Tang return ret_result; 10234ee09551764b045fdc02df754157473125edf60Kevin Tang} 10334ee09551764b045fdc02df754157473125edf60Kevin Tang 10434ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 10534ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION thelper_signal_wait 10634ee09551764b045fdc02df754157473125edf60Kevin Tang 10734ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 10834ee09551764b045fdc02df754157473125edf60Kevin Tang This function will be blocked on the conditional variable until thelper_signal_ready 10934ee09551764b045fdc02df754157473125edf60Kevin Tang is called 11034ee09551764b045fdc02df754157473125edf60Kevin Tang 11134ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 11234ee09551764b045fdc02df754157473125edf60Kevin Tang 11334ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 11434ee09551764b045fdc02df754157473125edf60Kevin Tang None 11534ee09551764b045fdc02df754157473125edf60Kevin Tang 11634ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 11734ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 11834ee09551764b045fdc02df754157473125edf60Kevin Tang 11934ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 12034ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 12134ee09551764b045fdc02df754157473125edf60Kevin Tang 12234ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 12334ee09551764b045fdc02df754157473125edf60Kevin Tangint thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper) 12434ee09551764b045fdc02df754157473125edf60Kevin Tang{ 12534ee09551764b045fdc02df754157473125edf60Kevin Tang int result = 0; 12634ee09551764b045fdc02df754157473125edf60Kevin Tang 12734ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_lock(&thelper->thread_mutex); 12834ee09551764b045fdc02df754157473125edf60Kevin Tang if (!thelper->thread_ready && !thelper->thread_exit) { 12934ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_cond_wait(&thelper->thread_cond, &thelper->thread_mutex); 13034ee09551764b045fdc02df754157473125edf60Kevin Tang } 13134ee09551764b045fdc02df754157473125edf60Kevin Tang 13234ee09551764b045fdc02df754157473125edf60Kevin Tang if (thelper->thread_exit) { 13334ee09551764b045fdc02df754157473125edf60Kevin Tang result = -1; 13434ee09551764b045fdc02df754157473125edf60Kevin Tang } 13534ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_unlock(&thelper->thread_mutex); 13634ee09551764b045fdc02df754157473125edf60Kevin Tang 13734ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 13834ee09551764b045fdc02df754157473125edf60Kevin Tang} 13934ee09551764b045fdc02df754157473125edf60Kevin Tang 14034ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 14134ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION thelper_signal_ready 14234ee09551764b045fdc02df754157473125edf60Kevin Tang 14334ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 14434ee09551764b045fdc02df754157473125edf60Kevin Tang This function will wake up the conditional variable 14534ee09551764b045fdc02df754157473125edf60Kevin Tang 14634ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 14734ee09551764b045fdc02df754157473125edf60Kevin Tang 14834ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 14934ee09551764b045fdc02df754157473125edf60Kevin Tang None 15034ee09551764b045fdc02df754157473125edf60Kevin Tang 15134ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 15234ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 15334ee09551764b045fdc02df754157473125edf60Kevin Tang 15434ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 15534ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 15634ee09551764b045fdc02df754157473125edf60Kevin Tang 15734ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 15834ee09551764b045fdc02df754157473125edf60Kevin Tangint thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper) 15934ee09551764b045fdc02df754157473125edf60Kevin Tang{ 16034ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 16134ee09551764b045fdc02df754157473125edf60Kevin Tang 16234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 16334ee09551764b045fdc02df754157473125edf60Kevin Tang 16434ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_lock(&thelper->thread_mutex); 16534ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_ready = 1; 16634ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_cond_signal(&thelper->thread_cond); 16734ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_unlock(&thelper->thread_mutex); 16834ee09551764b045fdc02df754157473125edf60Kevin Tang 16934ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 17034ee09551764b045fdc02df754157473125edf60Kevin Tang} 17134ee09551764b045fdc02df754157473125edf60Kevin Tang 17234ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 17334ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION thelper_signal_block 17434ee09551764b045fdc02df754157473125edf60Kevin Tang 17534ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 17634ee09551764b045fdc02df754157473125edf60Kevin Tang This function will set the thread ready to 0 to block the thelper_signal_wait 17734ee09551764b045fdc02df754157473125edf60Kevin Tang 17834ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 17934ee09551764b045fdc02df754157473125edf60Kevin Tang 18034ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 18134ee09551764b045fdc02df754157473125edf60Kevin Tang None 18234ee09551764b045fdc02df754157473125edf60Kevin Tang 18334ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 18434ee09551764b045fdc02df754157473125edf60Kevin Tang if thread_ready is set 18534ee09551764b045fdc02df754157473125edf60Kevin Tang 18634ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 18734ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 18834ee09551764b045fdc02df754157473125edf60Kevin Tang 18934ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 19034ee09551764b045fdc02df754157473125edf60Kevin Tangint thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper) 19134ee09551764b045fdc02df754157473125edf60Kevin Tang{ 19234ee09551764b045fdc02df754157473125edf60Kevin Tang int result = thelper->thread_ready; 19334ee09551764b045fdc02df754157473125edf60Kevin Tang 19434ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 19534ee09551764b045fdc02df754157473125edf60Kevin Tang 19634ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_lock(&thelper->thread_mutex); 19734ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_ready = 0; 19834ee09551764b045fdc02df754157473125edf60Kevin Tang pthread_mutex_unlock(&thelper->thread_mutex); 19934ee09551764b045fdc02df754157473125edf60Kevin Tang 20034ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 20134ee09551764b045fdc02df754157473125edf60Kevin Tang} 20234ee09551764b045fdc02df754157473125edf60Kevin Tang 20334ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 20434ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION thelper_main 20534ee09551764b045fdc02df754157473125edf60Kevin Tang 20634ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 20734ee09551764b045fdc02df754157473125edf60Kevin Tang This function is the main thread. It will be launched as a child thread 20834ee09551764b045fdc02df754157473125edf60Kevin Tang 20934ee09551764b045fdc02df754157473125edf60Kevin Tang data - pointer to the instance 21034ee09551764b045fdc02df754157473125edf60Kevin Tang 21134ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 21234ee09551764b045fdc02df754157473125edf60Kevin Tang None 21334ee09551764b045fdc02df754157473125edf60Kevin Tang 21434ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 21534ee09551764b045fdc02df754157473125edf60Kevin Tang NULL 21634ee09551764b045fdc02df754157473125edf60Kevin Tang 21734ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 21834ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 21934ee09551764b045fdc02df754157473125edf60Kevin Tang 22034ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 22134ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void * thelper_main(void *data) 22234ee09551764b045fdc02df754157473125edf60Kevin Tang{ 22334ee09551764b045fdc02df754157473125edf60Kevin Tang int result = 0; 22434ee09551764b045fdc02df754157473125edf60Kevin Tang struct loc_eng_dmn_conn_thelper * thelper = (struct loc_eng_dmn_conn_thelper *) data; 22534ee09551764b045fdc02df754157473125edf60Kevin Tang 22634ee09551764b045fdc02df754157473125edf60Kevin Tang if (thelper->thread_proc_init) { 22734ee09551764b045fdc02df754157473125edf60Kevin Tang result = thelper->thread_proc_init(thelper->thread_context); 22834ee09551764b045fdc02df754157473125edf60Kevin Tang if (result < 0) { 22934ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_exit = 1; 23034ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_signal_ready(thelper); 23134ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 23234ee09551764b045fdc02df754157473125edf60Kevin Tang return NULL; 23334ee09551764b045fdc02df754157473125edf60Kevin Tang } 23434ee09551764b045fdc02df754157473125edf60Kevin Tang } 23534ee09551764b045fdc02df754157473125edf60Kevin Tang 23634ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_signal_ready(thelper); 23734ee09551764b045fdc02df754157473125edf60Kevin Tang 23834ee09551764b045fdc02df754157473125edf60Kevin Tang if (thelper->thread_proc_pre) { 23934ee09551764b045fdc02df754157473125edf60Kevin Tang result = thelper->thread_proc_pre(thelper->thread_context); 24034ee09551764b045fdc02df754157473125edf60Kevin Tang if (result < 0) { 24134ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_exit = 1; 24234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 24334ee09551764b045fdc02df754157473125edf60Kevin Tang return NULL; 24434ee09551764b045fdc02df754157473125edf60Kevin Tang } 24534ee09551764b045fdc02df754157473125edf60Kevin Tang } 24634ee09551764b045fdc02df754157473125edf60Kevin Tang 24734ee09551764b045fdc02df754157473125edf60Kevin Tang do { 24834ee09551764b045fdc02df754157473125edf60Kevin Tang if (thelper->thread_proc) { 24934ee09551764b045fdc02df754157473125edf60Kevin Tang result = thelper->thread_proc(thelper->thread_context); 25034ee09551764b045fdc02df754157473125edf60Kevin Tang if (result < 0) { 25134ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_exit = 1; 25234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 25334ee09551764b045fdc02df754157473125edf60Kevin Tang } 25434ee09551764b045fdc02df754157473125edf60Kevin Tang } 25534ee09551764b045fdc02df754157473125edf60Kevin Tang } while (thelper->thread_exit == 0); 25634ee09551764b045fdc02df754157473125edf60Kevin Tang 25734ee09551764b045fdc02df754157473125edf60Kevin Tang if (thelper->thread_proc_post) { 25834ee09551764b045fdc02df754157473125edf60Kevin Tang result = thelper->thread_proc_post(thelper->thread_context); 25934ee09551764b045fdc02df754157473125edf60Kevin Tang } 26034ee09551764b045fdc02df754157473125edf60Kevin Tang 26134ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != 0) { 26234ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 26334ee09551764b045fdc02df754157473125edf60Kevin Tang } 26434ee09551764b045fdc02df754157473125edf60Kevin Tang return NULL; 26534ee09551764b045fdc02df754157473125edf60Kevin Tang} 26634ee09551764b045fdc02df754157473125edf60Kevin Tang 26734ee09551764b045fdc02df754157473125edf60Kevin Tangstatic void thelper_main_2(void *data) 26834ee09551764b045fdc02df754157473125edf60Kevin Tang{ 26934ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_main(data); 27034ee09551764b045fdc02df754157473125edf60Kevin Tang return; 27134ee09551764b045fdc02df754157473125edf60Kevin Tang} 27234ee09551764b045fdc02df754157473125edf60Kevin Tang 27334ee09551764b045fdc02df754157473125edf60Kevin Tang 27434ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 27534ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_launch_thelper 27634ee09551764b045fdc02df754157473125edf60Kevin Tang 27734ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 27834ee09551764b045fdc02df754157473125edf60Kevin Tang This function will initialize the thread context and launch the thelper_main 27934ee09551764b045fdc02df754157473125edf60Kevin Tang 28034ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 28134ee09551764b045fdc02df754157473125edf60Kevin Tang thread_proc_init - The initialization function pointer 28234ee09551764b045fdc02df754157473125edf60Kevin Tang thread_proc_pre - The function to call before task loop and after initialization 28334ee09551764b045fdc02df754157473125edf60Kevin Tang thread_proc - The task loop 28434ee09551764b045fdc02df754157473125edf60Kevin Tang thread_proc_post - The function to call after the task loop 28534ee09551764b045fdc02df754157473125edf60Kevin Tang context - the context for the above four functions 28634ee09551764b045fdc02df754157473125edf60Kevin Tang 28734ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 28834ee09551764b045fdc02df754157473125edf60Kevin Tang None 28934ee09551764b045fdc02df754157473125edf60Kevin Tang 29034ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 29134ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 29234ee09551764b045fdc02df754157473125edf60Kevin Tang 29334ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 29434ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 29534ee09551764b045fdc02df754157473125edf60Kevin Tang 29634ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 29734ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper, 29834ee09551764b045fdc02df754157473125edf60Kevin Tang int (*thread_proc_init) (void * context), 29934ee09551764b045fdc02df754157473125edf60Kevin Tang int (*thread_proc_pre) (void * context), 30034ee09551764b045fdc02df754157473125edf60Kevin Tang int (*thread_proc) (void * context), 30134ee09551764b045fdc02df754157473125edf60Kevin Tang int (*thread_proc_post) (void * context), 30234ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_create_thread create_thread_cb, 30334ee09551764b045fdc02df754157473125edf60Kevin Tang void * context) 30434ee09551764b045fdc02df754157473125edf60Kevin Tang{ 30534ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 30634ee09551764b045fdc02df754157473125edf60Kevin Tang 30734ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_signal_init(thelper); 30834ee09551764b045fdc02df754157473125edf60Kevin Tang 30934ee09551764b045fdc02df754157473125edf60Kevin Tang if (context) { 31034ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_context = context; 31134ee09551764b045fdc02df754157473125edf60Kevin Tang } 31234ee09551764b045fdc02df754157473125edf60Kevin Tang 31334ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_proc_init = thread_proc_init; 31434ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_proc_pre = thread_proc_pre; 31534ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_proc = thread_proc; 31634ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_proc_post = thread_proc_post; 31734ee09551764b045fdc02df754157473125edf60Kevin Tang 31834ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx call pthread_create\n", __func__, __LINE__, (long) thelper); 31934ee09551764b045fdc02df754157473125edf60Kevin Tang if (create_thread_cb) { 32034ee09551764b045fdc02df754157473125edf60Kevin Tang result = 0; 32134ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_id = create_thread_cb("loc_eng_dmn_conn", 32234ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_main_2, (void *)thelper); 32334ee09551764b045fdc02df754157473125edf60Kevin Tang } else { 32434ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_create(&thelper->thread_id, NULL, 32534ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_main, (void *)thelper); 32634ee09551764b045fdc02df754157473125edf60Kevin Tang } 32734ee09551764b045fdc02df754157473125edf60Kevin Tang 32834ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != 0) { 32934ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 33034ee09551764b045fdc02df754157473125edf60Kevin Tang return -1; 33134ee09551764b045fdc02df754157473125edf60Kevin Tang } 33234ee09551764b045fdc02df754157473125edf60Kevin Tang 33334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx pthread_create done\n", __func__, __LINE__, (long) thelper); 33434ee09551764b045fdc02df754157473125edf60Kevin Tang 33534ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_signal_wait(thelper); 33634ee09551764b045fdc02df754157473125edf60Kevin Tang 33734ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx pthread ready\n", __func__, __LINE__, (long) thelper); 33834ee09551764b045fdc02df754157473125edf60Kevin Tang return thelper->thread_exit; 33934ee09551764b045fdc02df754157473125edf60Kevin Tang} 34034ee09551764b045fdc02df754157473125edf60Kevin Tang 34134ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 34234ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_unblock_thelper 34334ee09551764b045fdc02df754157473125edf60Kevin Tang 34434ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 34534ee09551764b045fdc02df754157473125edf60Kevin Tang This function unblocks thelper_main to release the thread 34634ee09551764b045fdc02df754157473125edf60Kevin Tang 34734ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 34834ee09551764b045fdc02df754157473125edf60Kevin Tang 34934ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 35034ee09551764b045fdc02df754157473125edf60Kevin Tang None 35134ee09551764b045fdc02df754157473125edf60Kevin Tang 35234ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 35334ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success 35434ee09551764b045fdc02df754157473125edf60Kevin Tang 35534ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 35634ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 35734ee09551764b045fdc02df754157473125edf60Kevin Tang 35834ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 35934ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper) 36034ee09551764b045fdc02df754157473125edf60Kevin Tang{ 36134ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 36234ee09551764b045fdc02df754157473125edf60Kevin Tang thelper->thread_exit = 1; 36334ee09551764b045fdc02df754157473125edf60Kevin Tang return 0; 36434ee09551764b045fdc02df754157473125edf60Kevin Tang} 36534ee09551764b045fdc02df754157473125edf60Kevin Tang 36634ee09551764b045fdc02df754157473125edf60Kevin Tang/*=========================================================================== 36734ee09551764b045fdc02df754157473125edf60Kevin TangFUNCTION loc_eng_dmn_conn_join_thelper 36834ee09551764b045fdc02df754157473125edf60Kevin Tang 36934ee09551764b045fdc02df754157473125edf60Kevin Tang thelper - pointer to thelper instance 37034ee09551764b045fdc02df754157473125edf60Kevin Tang 37134ee09551764b045fdc02df754157473125edf60Kevin TangDESCRIPTION 37234ee09551764b045fdc02df754157473125edf60Kevin Tang This function will wait for the thread of thelper_main to finish 37334ee09551764b045fdc02df754157473125edf60Kevin Tang 37434ee09551764b045fdc02df754157473125edf60Kevin TangDEPENDENCIES 37534ee09551764b045fdc02df754157473125edf60Kevin Tang None 37634ee09551764b045fdc02df754157473125edf60Kevin Tang 37734ee09551764b045fdc02df754157473125edf60Kevin TangRETURN VALUE 37834ee09551764b045fdc02df754157473125edf60Kevin Tang 0: success or negative value for failure 37934ee09551764b045fdc02df754157473125edf60Kevin Tang 38034ee09551764b045fdc02df754157473125edf60Kevin TangSIDE EFFECTS 38134ee09551764b045fdc02df754157473125edf60Kevin Tang N/A 38234ee09551764b045fdc02df754157473125edf60Kevin Tang 38334ee09551764b045fdc02df754157473125edf60Kevin Tang===========================================================================*/ 38434ee09551764b045fdc02df754157473125edf60Kevin Tangint loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper) 38534ee09551764b045fdc02df754157473125edf60Kevin Tang{ 38634ee09551764b045fdc02df754157473125edf60Kevin Tang int result; 38734ee09551764b045fdc02df754157473125edf60Kevin Tang 38834ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 38934ee09551764b045fdc02df754157473125edf60Kevin Tang result = pthread_join(thelper->thread_id, NULL); 39034ee09551764b045fdc02df754157473125edf60Kevin Tang if (result != 0) { 39134ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 39234ee09551764b045fdc02df754157473125edf60Kevin Tang } 39334ee09551764b045fdc02df754157473125edf60Kevin Tang LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 39434ee09551764b045fdc02df754157473125edf60Kevin Tang 39534ee09551764b045fdc02df754157473125edf60Kevin Tang thelper_signal_destroy(thelper); 39634ee09551764b045fdc02df754157473125edf60Kevin Tang 39734ee09551764b045fdc02df754157473125edf60Kevin Tang return result; 39834ee09551764b045fdc02df754157473125edf60Kevin Tang} 39934ee09551764b045fdc02df754157473125edf60Kevin Tang 400