14035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin/* Copyright (c) 2011-2013,2015 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#define LOG_NDDEBUG 0
304035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#define LOG_TAG "LocSvc_MsgTask"
314035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
324035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <cutils/sched_policy.h>
334035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <unistd.h>
344035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <MsgTask.h>
354035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <msg_q.h>
364035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <log_util.h>
374035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin#include <loc_log.h>
384035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
394035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinstatic void LocMsgDestroy(void* msg) {
404035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    delete (LocMsg*)msg;
414035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
424035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
434035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinMsgTask::MsgTask(LocThread::tCreate tCreator,
444035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 const char* threadName, bool joinable) :
454035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mQ(msg_q_init2()), mThread(new LocThread()) {
464035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (!mThread->start(tCreator, threadName, this, joinable)) {
474035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        delete mThread;
484035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        mThread = NULL;
494035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
504035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
514035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
524035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinMsgTask::MsgTask(const char* threadName, bool joinable) :
534035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    mQ(msg_q_init2()), mThread(new LocThread()) {
544035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (!mThread->start(threadName, this, joinable)) {
554035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        delete mThread;
564035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        mThread = NULL;
574035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
584035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
594035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
604035be28a255eaa5605dbd9abeb2340db584249cPatrick TjinMsgTask::~MsgTask() {
614035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg_q_flush((void*)mQ);
624035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg_q_destroy((void**)&mQ);
634035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
644035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
654035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid MsgTask::destroy() {
664eda8e1eabead3a9115bdd9cedd7e336ed431dbeDante Russo    LocThread* thread = mThread;
674035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg_q_unblock((void*)mQ);
684eda8e1eabead3a9115bdd9cedd7e336ed431dbeDante Russo    if (thread) {
694035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        mThread = NULL;
704035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        delete thread;
714035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    } else {
724035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        delete this;
734035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
744035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
754035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
764035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid MsgTask::sendMsg(const LocMsg* msg) const {
774035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg_q_snd((void*)mQ, (void*)msg, LocMsgDestroy);
784035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
794035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
804035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinvoid MsgTask::prerun() {
814035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // make sure we do not run in background scheduling group
824035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    set_sched_policy(gettid(), SP_FOREGROUND);
834035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
844035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
854035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjinbool MsgTask::run() {
864035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LOC_LOGV("MsgTask::loop() listening ...\n");
874035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    LocMsg* msg;
884035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msq_q_err_type result = msg_q_rcv((void*)mQ, (void **)&msg);
894035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    if (eMSG_Q_SUCCESS != result) {
904035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        LOC_LOGE("%s:%d] fail receiving msg: %s\n", __func__, __LINE__,
914035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin                 loc_get_msg_q_status(result));
924035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin        return false;
934035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    }
944035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
954035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg->log();
964035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    // there is where each individual msg handling is invoked
974035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    msg->proc();
984035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
994035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    delete msg;
1004035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin
1014035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin    return true;
1024035be28a255eaa5605dbd9abeb2340db584249cPatrick Tjin}
103