1bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/* Copyright (c) 2011, The Linux Foundation. All rights reserved. 2bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 3bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * Redistribution and use in source and binary forms, with or without 4bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * modification, are permitted provided that the following conditions are 5bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * met: 6bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions of source code must retain the above copyright 7bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * notice, this list of conditions and the following disclaimer. 8bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Redistributions in binary form must reproduce the above 9bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * copyright notice, this list of conditions and the following 10bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * disclaimer in the documentation and/or other materials provided 11bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * with the distribution. 12bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * * Neither the name of The Linux Foundation nor the names of its 13bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * contributors may be used to endorse or promote products derived 14bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * from this software without specific prior written permission. 15bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 16bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo * 28bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo */ 29bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include <stdio.h> 30bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 31bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "log_util.h" 32bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "platform_lib_includes.h" 33bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo#include "loc_eng_dmn_conn_thread_helper.h" 34bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 35bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 36bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION thelper_signal_init 37bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 38bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 39bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will initialize the conditional variable resources. 40bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 41bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - thelper instance 42bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 43bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 44bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 45bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 46bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 47bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 48bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 49bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 50bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 51bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 52bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 53bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper) 54bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 55bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 56bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_exit = 0; 57bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_ready = 0; 58bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_cond_init( &thelper->thread_cond, NULL); 59bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result) { 60bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 61bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 62bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 63bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_mutex_init(&thelper->thread_mutex, NULL); 64bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result) { 65bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_cond_destroy(&thelper->thread_cond); 66bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 67bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 68bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 69bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 70bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 71bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION 72bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 73bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 74bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will destroy the conditional variable resources 75bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 76bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 77bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 78bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 79bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 80bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 81bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 82bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 83bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 84bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 85bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 86bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 87bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 88bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper) 89bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 90bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result, ret_result = 0; 91bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_cond_destroy( &thelper->thread_cond); 92bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result) { 93bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_result = result; 94bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 95bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 96bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_mutex_destroy(&thelper->thread_mutex); 97bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result) { 98bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo ret_result = result; 99bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 100bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 101bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return ret_result; 102bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 103bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 104bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 105bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION thelper_signal_wait 106bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 107bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 108bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will be blocked on the conditional variable until thelper_signal_ready 109bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo is called 110bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 111bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 112bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 113bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 114bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 115bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 116bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 117bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 118bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 119bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 120bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 121bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 122bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 123bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper) 124bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 125bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result = 0; 126bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 127bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_lock(&thelper->thread_mutex); 128bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (!thelper->thread_ready && !thelper->thread_exit) { 129bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_cond_wait(&thelper->thread_cond, &thelper->thread_mutex); 130bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 131bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 132bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (thelper->thread_exit) { 133bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = -1; 134bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 135bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_unlock(&thelper->thread_mutex); 136bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 137bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 138bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 139bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 140bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 141bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION thelper_signal_ready 142bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 143bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 144bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will wake up the conditional variable 145bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 146bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 147bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 148bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 149bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 150bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 151bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 152bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 153bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 154bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 155bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 156bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 157bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 158bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper) 159bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 160bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 161bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 162bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 163bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 164bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_lock(&thelper->thread_mutex); 165bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_ready = 1; 166bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_cond_signal(&thelper->thread_cond); 167bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_unlock(&thelper->thread_mutex); 168bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 169bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 170bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 171bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 172bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 173bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION thelper_signal_block 174bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 175bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 176bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will set the thread ready to 0 to block the thelper_signal_wait 177bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 178bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 179bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 180bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 181bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 182bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 183bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 184bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if thread_ready is set 185bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 186bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 187bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 188bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 189bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 190bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper) 191bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 192bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result = thelper->thread_ready; 193bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 194bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 195bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 196bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_lock(&thelper->thread_mutex); 197bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_ready = 0; 198bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo pthread_mutex_unlock(&thelper->thread_mutex); 199bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 200bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 201bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 202bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 203bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 204bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION thelper_main 205bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 206bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 207bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function is the main thread. It will be launched as a child thread 208bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 209bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo data - pointer to the instance 210bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 211bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 212bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 213bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 214bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 215bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo NULL 216bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 217bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 218bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 219bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 220bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 221bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void * thelper_main(void *data) 222bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 223bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result = 0; 224bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo struct loc_eng_dmn_conn_thelper * thelper = (struct loc_eng_dmn_conn_thelper *) data; 225bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 226bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (thelper->thread_proc_init) { 227bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = thelper->thread_proc_init(thelper->thread_context); 228bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result < 0) { 229bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_exit = 1; 230bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_signal_ready(thelper); 231bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 232bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return NULL; 233bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 234bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 235bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 236bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_signal_ready(thelper); 237bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 238bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (thelper->thread_proc_pre) { 239bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = thelper->thread_proc_pre(thelper->thread_context); 240bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result < 0) { 241bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_exit = 1; 242bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 243bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return NULL; 244bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 245bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 246bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 247bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo do { 248bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (thelper->thread_proc) { 249bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = thelper->thread_proc(thelper->thread_context); 250bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result < 0) { 251bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_exit = 1; 252bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 253bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 254bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 255bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } while (thelper->thread_exit == 0); 256bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 257bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (thelper->thread_proc_post) { 258bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = thelper->thread_proc_post(thelper->thread_context); 259bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 260bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 261bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != 0) { 262bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper); 263bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 264bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return NULL; 265bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 266bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 267bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russostatic void thelper_main_2(void *data) 268bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 269bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_main(data); 270bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return; 271bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 272bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 273bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 274bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 275bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_launch_thelper 276bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 277bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 278bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will initialize the thread context and launch the thelper_main 279bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 280bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 281bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thread_proc_init - The initialization function pointer 282bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thread_proc_pre - The function to call before task loop and after initialization 283bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thread_proc - The task loop 284bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thread_proc_post - The function to call after the task loop 285bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo context - the context for the above four functions 286bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 287bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 288bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 289bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 290bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 291bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 292bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 293bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 294bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 295bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 296bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 297bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper, 298bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int (*thread_proc_init) (void * context), 299bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int (*thread_proc_pre) (void * context), 300bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int (*thread_proc) (void * context), 301bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int (*thread_proc_post) (void * context), 302bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_create_thread create_thread_cb, 303bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo void * context) 304bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 305bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 306bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 307bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_signal_init(thelper); 308bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 309bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (context) { 310bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_context = context; 311bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 312bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 313bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_proc_init = thread_proc_init; 314bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_proc_pre = thread_proc_pre; 315bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_proc = thread_proc; 316bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_proc_post = thread_proc_post; 317bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 318bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx call pthread_create\n", __func__, __LINE__, (long) thelper); 319bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (create_thread_cb) { 320bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = 0; 321bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_id = create_thread_cb("loc_eng_dmn_conn", 322bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_main_2, (void *)thelper); 323bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } else { 324bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_create(&thelper->thread_id, NULL, 325bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_main, (void *)thelper); 326bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 327bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 328bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != 0) { 329bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 330bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return -1; 331bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 332bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 333bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx pthread_create done\n", __func__, __LINE__, (long) thelper); 334bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 335bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_signal_wait(thelper); 336bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 337bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx pthread ready\n", __func__, __LINE__, (long) thelper); 338bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return thelper->thread_exit; 339bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 340bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 341bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 342bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_unblock_thelper 343bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 344bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 345bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function unblocks thelper_main to release the thread 346bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 347bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 348bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 349bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 350bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 351bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 352bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 353bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success 354bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 355bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 356bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 357bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 358bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 359bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper) 360bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 361bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 362bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper->thread_exit = 1; 363bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return 0; 364bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 365bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 366bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo/*=========================================================================== 367bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoFUNCTION loc_eng_dmn_conn_join_thelper 368bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 369bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper - pointer to thelper instance 370bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 371bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDESCRIPTION 372bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo This function will wait for the thread of thelper_main to finish 373bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 374bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoDEPENDENCIES 375bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo None 376bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 377bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoRETURN VALUE 378bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 0: success or negative value for failure 379bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 380bfff6343845ad9ff062c5fd97bb3b9be1053340eDante RussoSIDE EFFECTS 381bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo N/A 382bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 383bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo===========================================================================*/ 384bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russoint loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper) 385bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo{ 386bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo int result; 387bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 388bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 389bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo result = pthread_join(thelper->thread_id, NULL); 390bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo if (result != 0) { 391bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 392bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo } 393bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper); 394bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 395bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo thelper_signal_destroy(thelper); 396bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 397bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo return result; 398bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo} 399bfff6343845ad9ff062c5fd97bb3b9be1053340eDante Russo 400