aboutsummaryrefslogtreecommitdiffstats
path: root/src/adapt/nstack_dmm_adpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/adapt/nstack_dmm_adpt.c')
-rw-r--r--src/adapt/nstack_dmm_adpt.c250
1 files changed, 250 insertions, 0 deletions
diff --git a/src/adapt/nstack_dmm_adpt.c b/src/adapt/nstack_dmm_adpt.c
new file mode 100644
index 0000000..eea2bf1
--- /dev/null
+++ b/src/adapt/nstack_dmm_adpt.c
@@ -0,0 +1,250 @@
+/*
+*
+* Copyright (c) 2018 Huawei Technologies Co.,Ltd.
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif /* __cplusplus */
+
+#include "nsfw_init.h"
+#include "nsfw_mem_api.h"
+#include "nsfw_recycle_api.h"
+#include "nsfw_mgr_com_api.h"
+#include "nsfw_ps_mem_api.h"
+#include "nsfw_ps_api.h"
+#include "nsfw_recycle_api.h"
+#include "nsfw_fd_timer_api.h"
+#include "nsfw_maintain_api.h"
+#include "nstack_eventpoll.h"
+#include "nstack_dmm_api.h"
+#include "nstack_dmm_adpt.h"
+#include "nstack_rd_mng.h"
+#include "mgr_com.h"
+
+int g_same_process = 1;
+
+extern int nsep_adpt_attach_memory ();
+extern int nstack_init_share_res ();
+extern int nstack_attach_share_res ();
+extern int nsep_adpt_reg_res_mgr ();
+
+/**
+ * This just for linux kernel epoll thread
+ */
+int
+nstack_event_callback (void *pdata, int events)
+{
+ nsep_epollInfo_t *epInfo = (nsep_epollInfo_t *) pdata;
+
+ if (!epInfo)
+ {
+ NSSOC_LOGWAR ("!!!!!!!err pdata=%p,get null epInfo", pdata);
+ return -1;
+ }
+#if 0
+ if (epInfo->rmidx >= 0 && epInfo->rmidx != modInx)
+ {
+ NSSOC_LOGDBG ("This fd should not issue events");
+ return -1;
+ }
+#endif
+
+ NSSOC_LOGDBG ("Got one event]fd=%d,events=%u", epInfo->fd, events);
+
+ sys_arch_lock_with_pid (&epInfo->epiLock);
+ struct list_node *fdEpiHead =
+ (struct list_node *) ADDR_SHTOL (epInfo->epiList.head);
+ struct list_node *node = (struct list_node *) ADDR_SHTOL (fdEpiHead->next);
+ struct epitem *epi = NULL;
+ struct eventpoll *ep = NULL;
+ while (node)
+ {
+
+ epi = (struct epitem *) ep_list_entry (node, struct epitem, fllink);
+
+ node = (struct list_node *) ADDR_SHTOL (node->next);
+ ep = (struct eventpoll *) ADDR_SHTOL (epi->ep);
+ if (!(epi->event.events & events))
+ continue;
+
+ /*event should not notice other process */
+ if ((ep->pid != get_sys_pid ()) && g_same_process)
+ {
+ continue;
+ }
+
+ sys_arch_lock_with_pid (&ep->lock);
+
+ if (unlikely (ep->ovflist != NSEP_EP_UNACTIVE_PTR))
+ {
+ if (epi->next == NSEP_EP_UNACTIVE_PTR)
+ {
+ epi->next = ep->ovflist;
+ ep->ovflist = (struct epitem *) ADDR_LTOSH (epi);
+ }
+ epi->ovf_revents |= events;
+ NSSOC_LOGDBG ("Add to ovflist]protoFD=%d,event=%d", epInfo->fd,
+ events);
+ goto out_unlock;
+ }
+ if (!EP_HLIST_NODE_LINKED (&epi->rdllink))
+ {
+ ep_hlist_add_tail (&ep->rdlist, &epi->rdllink);
+ sem_post (&ep->waitSem);
+ }
+ epi->revents |= events;
+ out_unlock:
+ sys_sem_s_signal (&ep->lock);
+ }
+ sys_sem_s_signal (&epInfo->epiLock);
+ /* [Remove fdInf->event_sem post] */
+ return 0;
+}
+
+int
+nstack_adpt_init (nstack_dmm_para * para)
+{
+ nsfw_mem_para stinfo = { 0 };
+ i32 init_ret = 0;
+
+ if (!para)
+ {
+ return -1;
+ }
+ stinfo.iargsnum = para->argc;
+ stinfo.pargs = para->argv;
+ stinfo.enflag = para->proc_type;
+ if (para->deploy_type >= NSTACK_MODEL_TYPE1)
+ {
+ g_same_process = 0;
+ }
+
+ nsfw_com_attr_set (para->attr.policy, para->attr.pri);
+
+ (void) nstack_framework_setModuleParam (NSFW_MEM_MGR_MODULE, &stinfo);
+ (void) nstack_framework_setModuleParam (NSFW_MGR_COM_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_TIMER_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_PS_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_PS_MEM_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_RECYCLE_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_RES_MGR_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_SOFT_PARAM_MODULE,
+ (void *) ((u64) para->proc_type));
+ (void) nstack_framework_setModuleParam (NSFW_LOG_CFG_MODULE,
+ (void *) ((u64) para->proc_type));
+
+ init_ret = nstack_framework_init ();
+ if (init_ret < 0)
+ {
+ NSFW_LOGERR
+ ("######################init failed!!!!######################");
+ return -1;
+ }
+
+ if ((para->proc_type != NSFW_PROC_APP)
+ && (para->proc_type != NSFW_PROC_MAIN))
+ {
+ return 0;
+ }
+
+ if (para->proc_type == NSFW_PROC_MAIN)
+ {
+ if (nstack_init_share_res () != 0)
+ {
+ NSFW_LOGERR ("nstack_init_share_res failed");
+ return -1;
+ }
+ if (nsep_create_memory () != 0)
+ {
+ NSFW_LOGERR ("nsep_create_memory failed");
+ return -1;
+ }
+
+ if (nstack_rd_mng_int (0) != 0)
+ {
+ NSFW_LOGERR ("nstack_rd_mng_int failed");
+ return -1;
+ }
+ }
+ else
+ {
+ if (nstack_attach_share_res () != 0)
+ {
+ NSFW_LOGERR ("nstack_attach_share_res failed");
+ return -1;
+ }
+
+ /**
+ * the share memory for epoll is created and usedy be app, don't clear
+ * it in fault case.
+ */
+ if (0 != nsep_adpt_attach_memory ())
+ {
+ NSFW_LOGERR ("nsep_adpt_attach_memory failed");
+ return -1;
+ }
+
+ if (nstack_rd_mng_int (1) != 0)
+ {
+ NSFW_LOGERR ("nstack_rd_mng_int failed");
+ return -1;
+ }
+ }
+
+ void *pret =
+ nsfw_recycle_reg_obj (NSFW_REC_PRO_LOWEST, NSFW_REC_NSOCKET_EPOLL,
+ NULL);
+ if (!pret)
+ {
+ NSFW_LOGERR ("regist recycle failed");
+ return -1;
+ }
+ (void) nsep_adpt_reg_res_mgr ();
+
+ return 0;
+}
+
+/*just to used to dependence by other module*/
+int
+nstack_init_module (void *para)
+{
+ return 0;
+}
+
+NSFW_MODULE_NAME (NSTACK_DMM_MODULE)
+NSFW_MODULE_PRIORITY (10)
+NSFW_MODULE_DEPENDS (NSFW_MEM_MGR_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_MGR_COM_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_TIMER_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_PS_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_PS_MEM_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_RECYCLE_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_LOG_CFG_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_RES_MGR_MODULE)
+NSFW_MODULE_DEPENDS (NSFW_SOFT_PARAM_MODULE)
+NSFW_MODULE_INIT (nstack_init_module)
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif /* __cplusplus */