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