summaryrefslogtreecommitdiff
path: root/ipacm/src/IPACM_CmdQueue.cpp
diff options
context:
space:
mode:
authorSkylar Chang <chiaweic@codeaurora.org>2016-01-29 16:51:56 -0800
committerSkylar Chang <chiaweic@codeaurora.org>2016-04-11 14:56:47 -0700
commit00cdfd1e51849e9a966edd4ad585af107e86db5e (patch)
treedfdf5006255e48c44604245b4d17d51068b44866 /ipacm/src/IPACM_CmdQueue.cpp
parentc7ca219e83ca5e8bd810d02de86e0a5e7cf648f3 (diff)
downloadipacfg-mgr-00cdfd1e51849e9a966edd4ad585af107e86db5e.tar.gz
IPACM: add structure of two message queues
Add the structure of two messsage queues in IPACM, one for external events, one for internal events. Internal event queue always has priority over external event queue. Change-Id: I99878b0ce1f112cc72acde3e38d716cb2542303c
Diffstat (limited to 'ipacm/src/IPACM_CmdQueue.cpp')
-rw-r--r--ipacm/src/IPACM_CmdQueue.cpp66
1 files changed, 53 insertions, 13 deletions
diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp
index 7e48546..a17fb08 100644
--- a/ipacm/src/IPACM_CmdQueue.cpp
+++ b/ipacm/src/IPACM_CmdQueue.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2013, The Linux Foundation. All rights reserved.
+Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
@@ -40,24 +40,42 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string.h>
#include "IPACM_CmdQueue.h"
#include "IPACM_Log.h"
+#include "IPACM_Iface.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
-MessageQueue* MessageQueue::inst = NULL;
-MessageQueue* MessageQueue::getInstance()
+MessageQueue* MessageQueue::inst_internal = NULL;
+MessageQueue* MessageQueue::inst_external = NULL;
+
+MessageQueue* MessageQueue::getInstanceInternal()
{
- if(inst == NULL)
+ if(inst_internal == NULL)
{
- inst = new MessageQueue();
- if(inst == NULL)
+ inst_internal = new MessageQueue();
+ if(inst_internal == NULL)
{
- IPACMERR("unable to create Message Queue instance\n");
+ IPACMERR("unable to create internal Message Queue instance\n");
return NULL;
}
}
- return inst;
+ return inst_internal;
+}
+
+MessageQueue* MessageQueue::getInstanceExternal()
+{
+ if(inst_external == NULL)
+ {
+ inst_external = new MessageQueue();
+ if(inst_external == NULL)
+ {
+ IPACMERR("unable to create external Message Queue instance\n");
+ return NULL;
+ }
+ }
+
+ return inst_external;
}
void MessageQueue::enqueue(Message *item)
@@ -101,14 +119,22 @@ Message* MessageQueue::dequeue(void)
void* MessageQueue::Process(void *param)
{
- MessageQueue *MsgQueue = NULL;
+ MessageQueue *MsgQueueInternal = NULL;
+ MessageQueue *MsgQueueExternal = NULL;
Message *item = NULL;
IPACMDBG("MessageQueue::Process()\n");
- MsgQueue = MessageQueue::getInstance();
- if(MsgQueue == NULL)
+ MsgQueueInternal = MessageQueue::getInstanceInternal();
+ if(MsgQueueInternal == NULL)
+ {
+ IPACMERR("unable to start internal cmd queue process\n");
+ return NULL;
+ }
+
+ MsgQueueExternal = MessageQueue::getInstanceExternal();
+ if(MsgQueueExternal == NULL)
{
- IPACMERR("unable to start cmd queue process\n");
+ IPACMERR("unable to start external cmd queue process\n");
return NULL;
}
@@ -120,7 +146,21 @@ void* MessageQueue::Process(void *param)
return NULL;
}
- item = MsgQueue->dequeue();
+ item = MsgQueueInternal->dequeue();
+ if(item == NULL)
+ {
+ item = MsgQueueExternal->dequeue();
+ if(item)
+ {
+ IPACMDBG("Get event %s from external queue.\n",
+ IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event));
+ }
+ }
+ else
+ {
+ IPACMDBG("Get event %s from internal queue.\n",
+ IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event));
+ }
if(item == NULL)
{