14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 24035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 34035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * Redistribution and use in source and binary forms, with or without 44035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * modification, are permitted provided that the following conditions are 54035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * met: 64035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions of source code must retain the above copyright 74035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * notice, this list of conditions and the following disclaimer. 84035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Redistributions in binary form must reproduce the above 94035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * copyright notice, this list of conditions and the following 104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * disclaimer in the documentation and/or other materials provided 114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * with the distribution. 124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * * Neither the name of The Linux Foundation nor the names of its 134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * contributors may be used to endorse or promote products derived 144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * from this software without specific prior written permission. 154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin * 284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin */ 294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <stdio.h> 304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "log_util.h" 324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "platform_lib_includes.h" 334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include "loc_eng_dmn_conn_thread_helper.h" 344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 364035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION thelper_signal_init 374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 384035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will initialize the conditional variable resources. 404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - thelper instance 424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 434035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 464035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 494035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper) 544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result; 564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_exit = 0; 574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_ready = 0; 584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_cond_init( &thelper->thread_cond, NULL); 594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result) { 604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_mutex_init(&thelper->thread_mutex, NULL); 644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result) { 654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_cond_destroy(&thelper->thread_cond); 664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 714035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION 724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 734035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will destroy the conditional variable resources 754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 784035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 814035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 844035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper) 894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result, ret_result = 0; 914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_cond_destroy( &thelper->thread_cond); 924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result) { 934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_result = result; 944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_mutex_destroy(&thelper->thread_mutex); 974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result) { 984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin ret_result = result; 994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return ret_result; 1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1054035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION thelper_signal_wait 1064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1074035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will be blocked on the conditional variable until thelper_signal_ready 1094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin is called 1104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 1124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1134035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 1154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1164035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 1184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1194035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper) 1244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result = 0; 1264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_lock(&thelper->thread_mutex); 1284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (!thelper->thread_ready && !thelper->thread_exit) { 1294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_cond_wait(&thelper->thread_cond, &thelper->thread_mutex); 1304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (thelper->thread_exit) { 1334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = -1; 1344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 1354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_unlock(&thelper->thread_mutex); 1364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 1384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1414035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION thelper_signal_ready 1424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1434035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will wake up the conditional variable 1454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 1474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1484035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 1504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1514035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 1534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1544035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper) 1594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result; 1614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 1634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_lock(&thelper->thread_mutex); 1654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_ready = 1; 1664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_cond_signal(&thelper->thread_cond); 1674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_unlock(&thelper->thread_mutex); 1684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 1704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 1714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 1734035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION thelper_signal_block 1744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1754035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 1764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will set the thread ready to 0 to block the thelper_signal_wait 1774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 1794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1804035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 1814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 1824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1834035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 1844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if thread_ready is set 1854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1864035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 1874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 1884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 1904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper) 1914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 1924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result = thelper->thread_ready; 1934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 1954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 1964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_lock(&thelper->thread_mutex); 1974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_ready = 0; 1984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin pthread_mutex_unlock(&thelper->thread_mutex); 1994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 2014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 2044035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION thelper_main 2054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2064035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 2074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function is the main thread. It will be launched as a child thread 2084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin data - pointer to the instance 2104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2114035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 2124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 2134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2144035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 2154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin NULL 2164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2174035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 2184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 2194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 2214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic void * thelper_main(void *data) 2224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result = 0; 2244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin struct loc_eng_dmn_conn_thelper * thelper = (struct loc_eng_dmn_conn_thelper *) data; 2254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (thelper->thread_proc_init) { 2274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = thelper->thread_proc_init(thelper->thread_context); 2284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result < 0) { 2294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_exit = 1; 2304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_signal_ready(thelper); 2314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 2324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return NULL; 2334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_signal_ready(thelper); 2374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (thelper->thread_proc_pre) { 2394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = thelper->thread_proc_pre(thelper->thread_context); 2404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result < 0) { 2414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_exit = 1; 2424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 2434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return NULL; 2444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin do { 2484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (thelper->thread_proc) { 2494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = thelper->thread_proc(thelper->thread_context); 2504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result < 0) { 2514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_exit = 1; 2524035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 2534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } while (thelper->thread_exit == 0); 2564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (thelper->thread_proc_post) { 2584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = thelper->thread_proc_post(thelper->thread_context); 2594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result != 0) { 2624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 2634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 2644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return NULL; 2654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic void thelper_main_2(void *data) 2684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 2694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_main(data); 2704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return; 2714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 2724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 2754035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_dmn_conn_launch_thelper 2764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2774035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 2784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will initialize the thread context and launch the thelper_main 2794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 2814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thread_proc_init - The initialization function pointer 2824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thread_proc_pre - The function to call before task loop and after initialization 2834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thread_proc - The task loop 2844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thread_proc_post - The function to call after the task loop 2854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin context - the context for the above four functions 2864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2874035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 2884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 2894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2904035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 2914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 2924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2934035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 2944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 2954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 2964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 2974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper, 2984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int (*thread_proc_init) (void * context), 2994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int (*thread_proc_pre) (void * context), 3004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int (*thread_proc) (void * context), 3014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int (*thread_proc_post) (void * context), 3024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_create_thread create_thread_cb, 3034035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin void * context) 3044035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 3054035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result; 3064035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3074035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_signal_init(thelper); 3084035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3094035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (context) { 3104035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_context = context; 3114035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3124035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3134035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_proc_init = thread_proc_init; 3144035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_proc_pre = thread_proc_pre; 3154035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_proc = thread_proc; 3164035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_proc_post = thread_proc_post; 3174035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3184035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx call pthread_create\n", __func__, __LINE__, (long) thelper); 3194035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (create_thread_cb) { 3204035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = 0; 3214035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_id = create_thread_cb("loc_eng_dmn_conn", 3224035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_main_2, (void *)thelper); 3234035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } else { 3244035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_create(&thelper->thread_id, NULL, 3254035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_main, (void *)thelper); 3264035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3274035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3284035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result != 0) { 3294035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 3304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return -1; 3314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx pthread_create done\n", __func__, __LINE__, (long) thelper); 3344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_signal_wait(thelper); 3364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx pthread ready\n", __func__, __LINE__, (long) thelper); 3384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return thelper->thread_exit; 3394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 3424035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_dmn_conn_unblock_thelper 3434035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3444035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 3454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function unblocks thelper_main to release the thread 3464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 3484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3494035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 3504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 3514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3524035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 3534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success 3544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3554035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 3564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 3574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 3594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper) 3604035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 3614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 3624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper->thread_exit = 1; 3634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return 0; 3644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3664035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/*=========================================================================== 3674035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinFUNCTION loc_eng_dmn_conn_join_thelper 3684035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper - pointer to thelper instance 3704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3714035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDESCRIPTION 3724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin This function will wait for the thread of thelper_main to finish 3734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3744035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinDEPENDENCIES 3754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin None 3764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3774035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinRETURN VALUE 3784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 0: success or negative value for failure 3794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3804035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinSIDE EFFECTS 3814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin N/A 3824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin===========================================================================*/ 3844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinint loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper) 3854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin{ 3864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin int result; 3874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 3894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin result = pthread_join(thelper->thread_id, NULL); 3904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin if (result != 0) { 3914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 3924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin } 3934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 3944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin thelper_signal_destroy(thelper); 3964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 3974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin return result; 3984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin} 3994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin 400