osaf/libs/agents/saf/cpa/cpa_init.c     |   8 +----
 osaf/libs/agents/saf/cpa/cpa_proc.c     |   9 ++----
 osaf/services/saf/cpsv/cpnd/cpnd_init.c |  46 +++++++++++++++++++-------------
 3 files changed, 32 insertions(+), 31 deletions(-)


The select() function cannot handle file descriptors larger than 1023. To avoid
this limitation, we replace all usages of select() with poll().

diff --git a/osaf/libs/agents/saf/cpa/cpa_init.c 
b/osaf/libs/agents/saf/cpa/cpa_init.c
--- a/osaf/libs/agents/saf/cpa/cpa_init.c
+++ b/osaf/libs/agents/saf/cpa/cpa_init.c
@@ -29,6 +29,7 @@
 #include "cpa.h"
 #include <pthread.h>
 #include "osaf_utility.h"
+#include "osaf_poll.h"
 
 /*****************************************************************************
  global data used by CPA
@@ -87,9 +88,6 @@ uint32_t cpa_lib_req(NCS_LIB_REQ_INFO *r
 **********************************************************************/
 void cpa_sync_with_cpnd(CPA_CB *cb)
 {
-       NCS_SEL_OBJ_SET set;
-       uint32_t timeout = 3000;
-
        m_NCS_LOCK(&cb->cpnd_sync_lock, NCS_LOCK_WRITE);
 
        if (cb->is_cpnd_up) {
@@ -102,9 +100,7 @@ void cpa_sync_with_cpnd(CPA_CB *cb)
        m_NCS_UNLOCK(&cb->cpnd_sync_lock, NCS_LOCK_WRITE);
 
        /* Await indication from MDS saying CPND is up */
-       m_NCS_SEL_OBJ_ZERO(&set);
-       m_NCS_SEL_OBJ_SET(cb->cpnd_sync_sel, &set);
-       m_NCS_SEL_OBJ_SELECT(cb->cpnd_sync_sel, &set, 0, 0, &timeout);
+       osaf_poll_one_fd(m_GET_FD_FROM_SEL_OBJ(cb->cpnd_sync_sel), 30000);
 
        /* Destroy the sync - object */
        m_NCS_LOCK(&cb->cpnd_sync_lock, NCS_LOCK_WRITE);
diff --git a/osaf/libs/agents/saf/cpa/cpa_proc.c 
b/osaf/libs/agents/saf/cpa/cpa_proc.c
--- a/osaf/libs/agents/saf/cpa/cpa_proc.c
+++ b/osaf/libs/agents/saf/cpa/cpa_proc.c
@@ -29,6 +29,8 @@
 */
 
 #include "cpa.h"
+#include "osaf_poll.h"
+
 static void cpa_process_callback_info(CPA_CB *cb, CPA_CLIENT_NODE *cl_node, 
CPA_CALLBACK_INFO *callback);
 
 #define m_MMGR_FREE_CPSV_DEFAULT(p) m_NCS_MEM_FREE(p, \
@@ -1323,9 +1325,6 @@ uint32_t cpa_proc_check_iovector(CPA_CB 
 **********************************************************************/
 void cpa_sync_with_cpd_for_active_replica_set(CPA_GLOBAL_CKPT_NODE *gc_node)
 {
-       NCS_SEL_OBJ_SET set;
-       uint32_t timeout = 5000;
-
        TRACE_ENTER();
        m_NCS_LOCK(&gc_node->cpd_active_sync_lock, NCS_LOCK_WRITE);
        if (gc_node->is_active_bcast_came == true) {
@@ -1338,9 +1337,7 @@ void cpa_sync_with_cpd_for_active_replic
        m_NCS_SEL_OBJ_CREATE(&gc_node->cpd_active_sync_sel);
        m_NCS_UNLOCK(&gc_node->cpd_active_sync_lock, NCS_LOCK_WRITE);
 
-       m_NCS_SEL_OBJ_ZERO(&set);
-       m_NCS_SEL_OBJ_SET(gc_node->cpd_active_sync_sel, &set);
-       m_NCS_SEL_OBJ_SELECT(gc_node->cpd_active_sync_sel, &set, 0, 0, 
&timeout);
+       osaf_poll_one_fd(m_GET_FD_FROM_SEL_OBJ(gc_node->cpd_active_sync_sel), 
50000);
 
        /* Destroy the sync - object */
        m_NCS_LOCK(&gc_node->cpd_active_sync_lock, NCS_LOCK_WRITE);
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_init.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_init.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_init.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_init.c
@@ -28,6 +28,14 @@
 ******************************************************************************/
 
 #include "cpnd.h"
+#include "osaf_poll.h"
+
+enum {
+       FD_MBX,
+       FD_AMF,
+       FD_CLM,
+       NUMBER_OF_FDS
+};
 
 #define CPND_CLM_API_TIMEOUT 10000000000LL
 uint32_t gl_cpnd_cb_hdl = 0;
@@ -489,7 +497,6 @@ static bool cpnd_clear_mbx(NCSCONTEXT ar
  *****************************************************************************/
 void cpnd_main_process(CPND_CB *cb)
 {
-       NCS_SEL_OBJ_SET all_sel_obj;
        NCS_SEL_OBJ mbx_fd;
        SYSF_MBX mbx = cb->cpnd_mbx;
        CPSV_EVT *evt = NULL;
@@ -497,11 +504,11 @@ void cpnd_main_process(CPND_CB *cb)
        SaAmfHandleT amf_hdl;
        SaAisErrorT amf_error;
        SaAisErrorT clm_error;
-       NCS_SEL_OBJ amf_ncs_sel_obj, clm_ncs_sel_obj, highest_sel_obj;
+       struct pollfd sel[NUMBER_OF_FDS];
 
        mbx_fd = m_NCS_IPC_GET_SEL_OBJ(&cb->cpnd_mbx);
-       m_NCS_SEL_OBJ_ZERO(&all_sel_obj);
-       m_NCS_SEL_OBJ_SET(mbx_fd, &all_sel_obj);
+       sel[FD_MBX].fd = m_GET_FD_FROM_SEL_OBJ(mbx_fd);
+       sel[FD_MBX].events = POLLIN;
 
        amf_hdl = cb->amf_hdl;
        amf_error = saAmfSelectionObjectGet(amf_hdl, &amf_sel_obj);
@@ -511,18 +518,23 @@ void cpnd_main_process(CPND_CB *cb)
                TRACE_LEAVE();
                return;
        }
-       m_SET_FD_IN_SEL_OBJ((uint32_t)amf_sel_obj, amf_ncs_sel_obj);
-       m_NCS_SEL_OBJ_SET(amf_ncs_sel_obj, &all_sel_obj);
+       sel[FD_AMF].fd = amf_sel_obj;
+       sel[FD_AMF].events = POLLIN;
 
-       highest_sel_obj = m_GET_HIGHER_SEL_OBJ(amf_ncs_sel_obj, mbx_fd);
-
-       m_SET_FD_IN_SEL_OBJ((uint32_t)cb->clm_sel_obj, clm_ncs_sel_obj);
-       m_NCS_SEL_OBJ_SET(clm_ncs_sel_obj, &all_sel_obj);
-       highest_sel_obj = m_GET_HIGHER_SEL_OBJ(clm_ncs_sel_obj, 
highest_sel_obj);
-       while (m_NCS_SEL_OBJ_SELECT(highest_sel_obj, &all_sel_obj, 0, 0, 0) != 
-1) {
+       sel[FD_CLM].fd = cb->clm_sel_obj;
+       sel[FD_CLM].events = POLLIN;
+       for (;;) {
+               osaf_poll(sel, NUMBER_OF_FDS, -1);
+               if (((sel[FD_AMF].revents | sel[FD_CLM].revents | 
sel[FD_MBX].revents) &
+                       (POLLERR | POLLHUP | POLLNVAL)) != 0) {
+                       LOG_ER("cpnd poll() failure: %hd %hd %hd",
+                               sel[FD_AMF].revents, sel[FD_CLM].revents, 
sel[FD_MBX].revents);
+                       TRACE_LEAVE();
+                       return;
+               }
 
                /* process all the AMF messages */
-               if (m_NCS_SEL_OBJ_ISSET(amf_ncs_sel_obj, &all_sel_obj)) {
+               if (sel[FD_AMF].revents & POLLIN) {
                        /* dispatch all the AMF pending function */
                        amf_error = saAmfDispatch(amf_hdl, SA_DISPATCH_ALL);
                        if (amf_error != SA_AIS_OK) {
@@ -530,24 +542,20 @@ void cpnd_main_process(CPND_CB *cb)
                        }
                }
 
-               if (m_NCS_SEL_OBJ_ISSET(clm_ncs_sel_obj, &all_sel_obj)) {
+               if (sel[FD_CLM].revents & POLLIN) {
                        clm_error = saClmDispatch(cb->clm_hdl, SA_DISPATCH_ALL);
                        if (clm_error != SA_AIS_OK) {
                                LOG_ER("cpnd amf dispatch failure 
%u",clm_error);
                        }
                }
                /* process the CPND Mail box */
-               if (m_NCS_SEL_OBJ_ISSET(mbx_fd, &all_sel_obj)) {
+               if (sel[FD_MBX].revents & POLLIN) {
 
                        if (NULL != (evt = (CPSV_EVT 
*)m_NCS_IPC_NON_BLK_RECEIVE(&mbx, evt))) {
                                /* now got the IPC mail box event */
                                cpnd_process_evt(evt);
                        }
                }
-               m_NCS_SEL_OBJ_SET(clm_ncs_sel_obj, &all_sel_obj);
-               m_NCS_SEL_OBJ_SET(amf_ncs_sel_obj, &all_sel_obj);
-               m_NCS_SEL_OBJ_SET(mbx_fd, &all_sel_obj);
-
        }
        TRACE_LEAVE();
        return;

------------------------------------------------------------------------------
Android is increasing in popularity, but the open development platform that
developers love is also attractive to malware creators. Download this white
paper to learn more about secure code signing practices that can help keep
Android apps secure.
http://pubads.g.doubleclick.net/gampad/clk?id=65839951&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to