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