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