diff options
Diffstat (limited to 'stacks/lwip_stack/lwip_src/common/stackx_app_res.c')
-rw-r--r-- | stacks/lwip_stack/lwip_src/common/stackx_app_res.c | 972 |
1 files changed, 0 insertions, 972 deletions
diff --git a/stacks/lwip_stack/lwip_src/common/stackx_app_res.c b/stacks/lwip_stack/lwip_src/common/stackx_app_res.c deleted file mode 100644 index 5c30271..0000000 --- a/stacks/lwip_stack/lwip_src/common/stackx_app_res.c +++ /dev/null @@ -1,972 +0,0 @@ -/* -* -* 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. -*/ - -#include "stackx_app_res.h" -#include "nstack_securec.h" -#include "common_pal_bitwide_adjust.h" -#include "nstack_log.h" -#include "stackx_common.h" -#include "nsfw_maintain_api.h" -#include "stackx_tx_box.h" -#include "nsfw_msg_api.h" -#include "nsfw_recycle_api.h" -#include "common_mem_mbuf.h" -#include "stackx_pbuf.h" -#include "nsfw_mt_config.h" -#include "nsfw_mem_api.h" -#include "spl_opt.h" -#define SPL_MAX_MSG_NUM (MBOX_RING_SIZE*8*MAX_THREAD_NUM) - -spl_app_res_group *g_spl_app_res_group = NULL; - -spl_app_res_group_array *g_res_group_array = NULL; - -#ifdef SYS_MEM_RES_STAT -mpool_handle g_app_tx_pool[SBR_TX_POOL_NUM]; -#endif - -/*************************************************** -* description: -***************************************************/ -int -spl_init_group_array () -{ - g_res_group_array = - (spl_app_res_group_array *) sbr_create_mzone (SPL_RES_GROUP_ARRAY, - sizeof - (spl_app_res_group_array)); - if (!g_res_group_array) - { - NSPOL_LOGERR ("create g_res_group_array failed"); - return -1; - } - - u32 i; - for (i = 0; i < SBR_TX_POOL_NUM; ++i) - { - g_res_group_array->pid_array[i] = 0; - } - - for (i = 0; i < MAX_THREAD_NUM; ++i) - { - g_res_group_array->res_group[i] = NULL; - } - - g_res_group_array->thread_num = 0; - return 0; -} - -/*************************************************** -* description: -***************************************************/ -int -sbr_attach_group_array () -{ - g_res_group_array = - (spl_app_res_group_array *) sbr_lookup_mzone (SPL_RES_GROUP_ARRAY); - if (!g_res_group_array) - { - NSPOL_LOGERR ("attach g_res_group_array failed"); - return -1; - } - - return 0; -} - -/*************************************************** -* description: -***************************************************/ -int -spl_add_instance_res_group (u32 thread_index, spl_app_res_group * group) -{ - if (thread_index >= MAX_THREAD_NUM) - { - NSPOL_LOGERR - ("thread_index >= MAX_THREAD_NUM]thread_index=%u, MAX_THREAD_NUM=%u", - thread_index, MAX_THREAD_NUM); - return -1; - } - - if (g_res_group_array->res_group[thread_index] != NULL) - { - NSPOL_LOGERR - ("g_res_group_array in thread_index is not NULL, this can not happen"); - return -1; - } - - g_res_group_array->res_group[thread_index] = group; - __sync_add_and_fetch (&g_res_group_array->thread_num, 1); - return 0; -} - -/*************************************************** -* description: -***************************************************/ -int -spl_add_mbox (mring_handle mbox_array[], u32 array_size) -{ - if (array_size != SPL_MSG_BOX_NUM) - { - NSPOL_LOGERR ("array_size must be %u, but not", SPL_MSG_BOX_NUM); - return -1; - } - - u32 i; - for (i = 0; i < array_size; ++i) - { - g_spl_app_res_group->mbox_array[i] = mbox_array[i]; - } - - return 0; -} - -/***************************************************************************** -* Prototype : spl_create_group -* Description : create group -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -spl_app_res_group * -spl_create_group () -{ - spl_app_res_group *group = - (spl_app_res_group *) sbr_create_mzone (SPL_APP_RES_GROUP_NAME, - sizeof (spl_app_res_group)); - if (!group) - { - NSPOL_LOGERR ("Create app_res_group zone fail]name=%s, size=%u", - SPL_APP_RES_GROUP_NAME, sizeof (spl_app_res_group)); - return NULL; - } - - group->msg_pool = NULL; - group->conn_pool = NULL; - group->conn_array = NULL; - group->recv_ring_pool = NULL; - - u32 i; - for (i = 0; i < SBR_TX_POOL_NUM; ++i) - { - group->tx_pool_array[i] = NULL; - } - - for (i = 0; i < SPL_MSG_BOX_NUM; ++i) - { - group->mbox_array[i] = NULL; - } - - group->extend_member_bit = 0; - - NSPOL_LOGINF (SC_DPDK_INFO, "Create app_res_group zone ok]name=%s, size=%u", - SPL_APP_RES_GROUP_NAME, sizeof (spl_app_res_group)); - MEM_STAT (SPL_APP_RES, SPL_APP_RES_GROUP_NAME, NSFW_SHMEM, - sizeof (spl_app_res_group)); - return group; -} - -/***************************************************************************** -* Prototype : _spl_create_ring_pool -* Description : create ring pool -* Input : char* pool_name -* char* array_name -* nsfw_mpool_type type -* Output : None -* Return Value : static inline mring_handle -* Calls : -* Called By : -* -*****************************************************************************/ -static inline mring_handle -_spl_create_ring_pool (char *pool_name, char *array_name, - nsfw_mpool_type type, u32 num, u32 ring_size) -{ - mring_handle pool = sbr_create_ring (pool_name, num - 1); - - if (!pool) - { - return NULL; - } - - NSPOL_LOGINF (SC_DPDK_INFO, "Create ring pool ok]name=%s, num=%u, size=%d", - pool_name, num, nsfw_mem_get_len (pool, NSFW_MEM_RING)); - MEM_STAT (SPL_APP_RES, pool_name, NSFW_SHMEM, - nsfw_mem_get_len (pool, NSFW_MEM_RING)); - - mring_handle *array = malloc (num * sizeof (mring_handle)); - if (!array) - { - NSPOL_LOGERR ("malloc fail]size=%u", num * sizeof (mring_handle)); - return NULL; - } - - if (sbr_create_multi_ring (array_name, ring_size - 1, num, - array, type) != 0) - { - free (array); - return NULL; - } - - NSPOL_LOGINF (SC_DPDK_INFO, - "Create multi rings ok]name=%s, ring_size=%u, ring_num=%u, total_mem=%d", - array_name, ring_size, num, - (nsfw_mem_get_len (array[0], NSFW_MEM_RING) * num)); - MEM_STAT (SPL_APP_RES, array_name, NSFW_SHMEM, - nsfw_mem_get_len (array[0], NSFW_MEM_RING) * num); - - unsigned int i = 0; - while (i < num) - { - if (nsfw_mem_ring_enqueue (pool, (void *) array[i]) != 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_enqueue failed,this can not happen"); - free (array); - return NULL; - } - - i++; - } - - free (array); - return pool; -} - -/***************************************************************************** -* Prototype : spl_create_ring_pool -* Description : create ring pool -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_create_ring_pool (spl_app_res_group * group) -{ - group->recv_ring_pool = - _spl_create_ring_pool (SPL_RECV_RING_POOL_NAME, SPL_RECV_RING_ARRAY_NAME, - NSFW_MRING_SPSC, CUR_CFG_SOCKET_NUM, - SPL_MAX_RING_SIZE); - if (!group->recv_ring_pool) - { - NSPOL_LOGERR ("Create recv ring pool failed"); - return -1; - } - - NSPOL_LOGINF (SC_DPDK_INFO, "Create recv ring pool ok]name=%s", - SPL_RECV_RING_POOL_NAME); - return 0; -} - -int -spl_force_netconn_free (void *data) -{ - spl_netconn_t *conn = (spl_netconn_t *) data; - if (TRUE == conn->res_chk.alloc_flag) - { - if (NULL != conn->recycle.accept_from) - { - return FALSE; - } - - if (TRUE != nsfw_pidinfo_empty (&conn->recycle.pid_info)) - { - return FALSE; - } - } - ss_reset_conn (conn); - (void) res_free (&conn->res_chk); - - if (nsfw_mem_ring_enqueue (ss_get_conn_pool (conn), (void *) conn) != 1) - { - NSSBR_LOGERR ("nsfw_mem_ring_enqueue failed,this can not happen"); - } - NSFW_LOGINF ("force free conn]conn=%p", conn); - return TRUE; -} - -/***************************************************************************** -* Prototype : spl_create_netconn_pool -* Description : create netconn pool -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_create_netconn_pool (spl_app_res_group * group) -{ - spl_netconn_t **conn_array = - (spl_netconn_t **) sbr_create_mzone (SPL_CONN_ARRAY_NAME, - sizeof (spl_netconn_t *) * - CUR_CFG_SOCKET_NUM); - - if (!conn_array) - { - return -1; - } - - NSPOL_LOGINF (SC_DPDK_INFO, "Create connn_array zone ok]name=%s, size=%zu", - SPL_CONN_ARRAY_NAME, - sizeof (spl_netconn_t *) * CUR_CFG_SOCKET_NUM); - mring_handle pool = - sbr_create_pool (SPL_CONN_POOL_NAME, CUR_CFG_SOCKET_NUM - 1, - SBR_FD_NETCONN_SIZE); - - if (!pool) - { - return -1; - } - - NSPOL_LOGINF (SC_DPDK_INFO, - "Create conn_pool ok]name=%s, num=%u, total_mem=%d", - SPL_CONN_POOL_NAME, CUR_CFG_SOCKET_NUM, - nsfw_mem_get_len (pool, NSFW_MEM_SPOOL)); - - sbr_recycle_group *recycle_group = - (sbr_recycle_group *) sbr_create_mzone (SPL_RECYCLE_GROUP, - sizeof (sbr_recycle_group)); - if (!recycle_group) - { - return -1; - } - - NSPOL_LOGINF (SC_DPDK_INFO, "Create recycle_group zone ok]name=%s, size=%u", - SPL_RECYCLE_GROUP, sizeof (sbr_recycle_group)); - - recycle_group->conn_array = conn_array; - recycle_group->conn_num = spl_get_conn_num (); - recycle_group->conn_pool = pool; - recycle_group->extend_member_bit = 0; - recycle_group->msg_pool = group->msg_pool; - - spl_netconn_t *conn = NULL; - unsigned int i = 0; - while (i < CUR_CFG_SOCKET_NUM) - { - if (nsfw_mem_ring_dequeue (pool, (void **) &conn) != 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_dequeue failed,this can not happen"); - return -1; - } - - ss_reset_conn (conn); - conn->recycle.group = recycle_group; - - if (nsfw_mem_ring_dequeue (group->recv_ring_pool, &conn->recv_ring) != - 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_dequeue failed,this can not happen"); - return -1; - } - - conn_array[i] = conn; - - if (nsfw_mem_ring_enqueue (pool, (void *) conn) != 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_enqueue failed,this can not happen"); - return -1; - } - - i++; - } - - group->conn_pool = pool; - group->conn_array = conn_array; - - MEM_STAT (SPL_APP_RES, SPL_RECYCLE_GROUP, NSFW_SHMEM, - sizeof (sbr_recycle_group)); - MEM_STAT (SPL_APP_RES, SPL_CONN_ARRAY_NAME, NSFW_SHMEM, - sizeof (spl_netconn_t *) * CUR_CFG_SOCKET_NUM); - MEM_STAT (SPL_APP_RES, SPL_CONN_POOL_NAME, NSFW_SHMEM, - nsfw_mem_get_len (group->conn_pool, NSFW_MEM_SPOOL)); - return 0; -} - -int -spl_force_msg_free (void *data) -{ - data_com_msg *m = (data_com_msg *) data; - if (NULL == m) - { - return FALSE; - } - - NSFW_LOGINF ("force free msg]msg=%p", data); - (void) res_free (&m->param.res_chk); - m->param.recycle_pid = 0; - if (nsfw_mem_ring_enqueue (m->param.msg_from, (void *) m) != 1) - { - NSFW_LOGERR ("nsfw_mem_ring_enqueue failed,this can not happen"); - } - return TRUE; -} - -/***************************************************************************** -* Prototype : spl_create_msg_pool -* Description : create msg pool -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_create_msg_pool (spl_app_res_group * group) -{ - mring_handle pool = - sbr_create_pool (SPL_MSG_POOL_NAME, SPL_MAX_MSG_NUM - 1, MAX_MSG_SIZE); - - if (!pool) - { - return -1; - } - - data_com_msg *m = NULL; - unsigned int i = 0; - while (i < SPL_MAX_MSG_NUM) - { - if (nsfw_mem_ring_dequeue (pool, (void **) &m) != 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_dequeue failed,this can not happen"); - return -1; - } - - m->param.msg_from = pool; - m->param.recycle_pid = 0; - sys_sem_init (&m->param.op_completed); - - if (nsfw_mem_ring_enqueue (pool, (void *) m) != 1) - { - NSPOL_LOGERR ("nsfw_mem_ring_enqueue failed,this can not happen"); - return -1; - } - - i++; - } - - group->msg_pool = pool; - - NSPOL_LOGINF (SC_DPDK_INFO, - "Create app msg pool ok]name=%s, num=%u, size=%u, total_mem=%d", - SPL_MSG_POOL_NAME, SPL_MAX_MSG_NUM, MAX_MSG_SIZE, - nsfw_mem_get_len (group->msg_pool, NSFW_MEM_SPOOL)); - MEM_STAT (SPL_APP_RES, SPL_MSG_POOL_NAME, NSFW_SHMEM, - nsfw_mem_get_len (group->msg_pool, NSFW_MEM_SPOOL)); - return 0; -} - -/***************************************************************************** -* Prototype : spl_regist_recycle -* Description : regist recycle -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_regist_recycle (spl_app_res_group * group) -{ - void *ret = - nsfw_recycle_reg_obj (NSFW_REC_PRO_DEFAULT, NSFW_REC_SBR_SOCKET, NULL); - - if (!ret) - { - NSSBR_LOGERR ("failed"); - return -1; - } - - if (NULL == group) - { - NSSBR_LOGERR ("g_spl_app_res_group null"); - return -1; - } - - nsfw_res_scn_cfg scn_cfg = { NSFW_RES_SCAN_SPOOL, 90, 3, 16, - CUR_CFG_SOCKET_NUM / 128, CUR_CFG_SOCKET_NUM - 1, - SBR_FD_NETCONN_SIZE, - offsetof (spl_netconn_t, res_chk), - (void *) group->conn_pool, - (void *) group->conn_pool, - spl_force_netconn_free - }; - - (void) nsfw_res_mgr_reg (&scn_cfg); - - nsfw_res_scn_cfg scn_cfg_msg = { NSFW_RES_SCAN_SPOOL, 60, 3, 16, - SPL_MAX_MSG_NUM / 128, SPL_MAX_MSG_NUM, - MAX_MSG_SIZE, - offsetof (data_com_msg, param.res_chk), - (void *) group->msg_pool, - (void *) group->msg_pool, - spl_force_msg_free - }; - (void) nsfw_res_mgr_reg (&scn_cfg_msg); - - return 0; -} - -void -spl_reg_tx_pool_mgr (mpool_handle pool_array[], u32 num) -{ - u32 loop; - for (loop = 0; loop < num; loop++) - { - (void) spl_reg_res_txrx_mgr (pool_array[loop]); // will only return 0, no need to check return value - } - - return; -} - -/***************************************************************************** -* Prototype : sbr_create_tx_pool -* Description : create tx pool,spl call this fun -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_create_tx_pool (mpool_handle pool_array[], u32 array_size) -{ - data_com_msg *tx_msg_array = - (data_com_msg *) sbr_create_mzone (SBR_TX_MSG_ARRAY_NAME, - (size_t) sizeof (data_com_msg) * - SBR_TX_MSG_NUM); - - if (!tx_msg_array) - { - NSSBR_LOGERR ("Create tx_msg_array zone fail]name=%s, num=%u, size=%u", - SBR_TX_MSG_ARRAY_NAME, SBR_TX_MSG_NUM, - (size_t) sizeof (data_com_msg) * SBR_TX_MSG_NUM); - return -1; - } - - MEM_STAT (SBR_TX_POOL_NAME, SBR_TX_MSG_ARRAY_NAME, NSFW_SHMEM, - (size_t) sizeof (data_com_msg) * SBR_TX_MSG_NUM); - NSSBR_LOGINF - ("Create tx_msg_array zone ok]name=%s, ptr=%p, num=%u, size=%u", - SBR_TX_MSG_ARRAY_NAME, tx_msg_array, SBR_TX_MSG_NUM, - sizeof (data_com_msg) * SBR_TX_MSG_NUM); - - mpool_handle mp; - int ret; - char tx_pool_name[64]; - u32 loop; - for (loop = 0; loop < array_size; loop++) - { - ret = - SPRINTF_S (tx_pool_name, sizeof (tx_pool_name), "%s_%d", - SBR_TX_POOL_NAME, loop); - if (-1 == ret) - { - NSSBR_LOGERR ("SPRINTF_S failed]ret=%d", ret); - return -1; - } - - nsfw_mem_mbfpool pool_param; - if (STRCPY_S - (pool_param.stname.aname, NSFW_MEM_NAME_LENTH, tx_pool_name) != 0) - { - NSSBR_LOGERR ("STRCPY_S failed]name=%s", tx_pool_name); - return -1; - } - - pool_param.isocket_id = -1; - pool_param.stname.entype = NSFW_SHMEM; - pool_param.enmptype = NSFW_MRING_MPMC; - pool_param.uscash_size = 0; - pool_param.uspriv_size = 0; - pool_param.usdata_room = TX_MBUF_MAX_LEN; - pool_param.usnum = SBR_TX_POOL_MBUF_NUM - 1; - - mp = nsfw_mem_mbfmp_create (&pool_param); - if (!mp) - { - NSSBR_LOGERR ("Create tx_mbuf_pool fail]name=%s, num=%u, room=%u", - tx_pool_name, SBR_TX_POOL_MBUF_NUM, - pool_param.usdata_room); - return -1; - } - else - { - struct common_mem_mbuf *mbuf = NULL; - struct spl_pbuf *buf = NULL; - int i = 0; - while (i < (int) SBR_TX_POOL_MBUF_NUM) - { - mbuf = nsfw_mem_mbf_alloc (mp, NSFW_SHMEM); - if (!mbuf) - { - NSSBR_LOGERR - ("nsfw_mem_mbf_alloc failed,this can not happen"); - return -1; - } - - buf = - (struct spl_pbuf *) ((char *) mbuf + - sizeof (struct common_mem_mbuf)); - int idx = loop * (int) SBR_TX_POOL_MBUF_NUM + i; - sys_sem_init (&tx_msg_array[idx].param.op_completed); - tx_msg_array[idx].param.msg_from = NULL; - buf->msg = (void *) &tx_msg_array[idx]; - (void) res_free (&buf->res_chk); //no need to check return value, as it will do free operation depends on alloc_flag - - if (nsfw_mem_mbf_free (mbuf, NSFW_SHMEM) < 0) - { - NSSBR_LOGERR - ("nsfw_mem_mbf_free failed,this can not happen"); - return -1; - } - - i++; - } - - pool_array[loop] = mp; -#ifdef SYS_MEM_RES_STAT - g_app_tx_pool[loop] = mp; -#endif - } - } - - spl_reg_tx_pool_mgr (pool_array, array_size); - - NSSBR_LOGINF ("Create all tx_mbuf_pool ok]pool_num=%d, total_mem=%d", - array_size, nsfw_mem_get_len (pool_array[0], - NSFW_MEM_MBUF) * array_size); - MEM_STAT (SBR_TX_POOL_NAME, SBR_TX_POOL_NAME, NSFW_SHMEM, - nsfw_mem_get_len (pool_array[0], NSFW_MEM_MBUF) * array_size); - return 0; -} - -spl_app_res_group * -spl_create_res_group () -{ - spl_app_res_group *group = spl_create_group (); - if (NULL == group) - { - NSPOL_LOGERR ("spl_create_group failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_create_group ok"); - - if (spl_create_ring_pool (group) != 0) - { - NSPOL_LOGERR ("spl_create_ring_pool failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_create_ring_pool ok"); - - if (spl_create_msg_pool (group) != 0) - { - NSPOL_LOGERR ("spl_create_msg_pool failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_create_msg_pool ok"); - - if (spl_create_netconn_pool (group) != 0) - { - NSPOL_LOGERR ("spl_create_netconn_pool failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_create_netconn_pool ok"); - - if (spl_regist_recycle (group) != 0) - { - NSPOL_LOGERR ("spl_regist_recycle failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_regist_recycle ok"); - - if (spl_create_tx_pool (group->tx_pool_array, SBR_TX_POOL_NUM) != 0) - { - NSPOL_LOGERR ("spl_create_tx_pool failed"); - return NULL; - } - - NSPOL_LOGDBG (SC_DPDK_INFO, "spl_create_tx_pool ok"); - - return group; -} - -/***************************************************************************** -* Prototype : spl_init_app_res -* Description : init app res -* Input : None -* Output : None -* Return Value : int -* Calls : -* Called By : -* -*****************************************************************************/ -int -spl_init_app_res () -{ - g_spl_app_res_group = spl_create_res_group (); - if (NULL == g_spl_app_res_group) - { - NSPOL_LOGERR ("spl_create_group failed"); - return -1; - } - - return spl_add_instance_res_group (0, g_spl_app_res_group); -} - -/***************************************************************************** -* Prototype : spl_get_conn_array -* Description : get conn array -* Input : u32 pid -* Output : None -* Return Value : spl_netconn_t** -* Calls : -* Called By : -* -*****************************************************************************/ -spl_netconn_t ** -spl_get_conn_array (u32 pid) -{ - return (spl_netconn_t **) ADDR_SHTOL (g_spl_app_res_group->conn_array); -} - -/***************************************************************************** -* Prototype : spl_get_conn_pool -* Description : get conn pool -* Input : None -* Output : None -* Return Value : mring_handle -* Calls : -* Called By : -* -*****************************************************************************/ -mring_handle -spl_get_conn_pool () -{ - return (mring_handle) ADDR_SHTOL (g_spl_app_res_group->conn_pool); -} - -/***************************************************************************** -* Prototype : spl_get_msg_pool -* Description : get msg pool -* Input : None -* Output : None -* Return Value : mring_handle -* Calls : -* Called By : -* -*****************************************************************************/ -mring_handle -spl_get_msg_pool () -{ - return (mring_handle) ADDR_SHTOL (g_spl_app_res_group->msg_pool); -} - -/***************************************************************************** -* Prototype : spl_recycle_msg -* Description : recycle msg -* Input : void *data -* void* argv -* Output : None -* Return Value : static int -* Calls : -* Called By : -* -*****************************************************************************/ -static int -spl_recycle_msg (void *data, void *argv) -{ - if (!data) - { - NSPOL_LOGERR ("data is NULL]data=%p,pid=%p", data, argv); - return -1; - } - - data_com_msg *m = (data_com_msg *) data; - u64 pid_64 = (u64) argv; - u32 pid = (u32) pid_64; - if (pid == m->param.recycle_pid) - { - ASYNC_MSG_FREE (m); - } - - return 0; -} - -/***************************************************************************** -* Prototype : spl_recycle_msg_pool -* Description : recycle msg pool -* Input : u32 pid -* Output : None -* Return Value : void -* Calls : -* Called By : -* -*****************************************************************************/ -void -spl_recycle_msg_pool (u32 pid) -{ - mring_handle msg_pool = spl_get_msg_pool (); - if (!msg_pool) - { - NSPOL_LOGERR ("msg_pool is NULL,this can not happen]pid=%u", pid); - return; - } - - u64 pid_64 = pid; - (void) nsfw_mem_sp_iterator (msg_pool, 0, SPL_MAX_MSG_NUM, spl_recycle_msg, - (void *) pid_64); -} - -/***************************************************************************** -* Prototype : spl_get_conn_num -* Description : get conn num -* Input : None -* Output : None -* Return Value : u32 -* Calls : -* Called By : -* -*****************************************************************************/ -u32 -spl_get_conn_num () -{ - return CUR_CFG_SOCKET_NUM; -} - -/*************************************************** -* description: -***************************************************/ -int -sbr_malloc_tx_pool (u32 pid, mpool_handle pool[], u32 pool_num) -{ - int loop; - for (loop = 0; loop < SBR_TX_POOL_NUM; loop++) - { - if ((0 == g_res_group_array->pid_array[loop]) - && - __sync_bool_compare_and_swap (&g_res_group_array->pid_array[loop], - 0, pid)) - { - u32 i; - for (i = 0; i < g_res_group_array->thread_num && i < pool_num; ++i) - { - spl_app_res_group *group = - (spl_app_res_group *) - ADDR_SHTOL (g_res_group_array->res_group[i]); - pool[i] = ADDR_SHTOL (group->tx_pool_array[loop]); - } - - NSSBR_LOGINF ("get tx pool]pid=%d,loop=%d.", pid, loop); - return 0; - } - } - - for (loop = 0; loop < SBR_TX_POOL_NUM; loop++) - { - NSSBR_LOGERR ("no free pool]loop=%d,pid=%d", loop, - g_res_group_array->pid_array[loop]); - } - - return -1; -} - -/*************************************************** -* description: -***************************************************/ -void -spl_free_tx_pool (u32 pid) -{ - int loop; - for (loop = 0; loop < SBR_TX_POOL_NUM; loop++) - { - if (pid == g_res_group_array->pid_array[loop]) - { - u32 i; - for (i = 0; i < g_res_group_array->thread_num; ++i) - { - (void) - nsfw_mem_mbuf_pool_recycle (g_res_group_array->res_group - [i]->tx_pool_array[loop]); - } - - if (!__sync_bool_compare_and_swap - (&g_res_group_array->pid_array[loop], pid, 0)) - { - NSSBR_LOGERR ("free tx_pool failed]loop=%d,pid=%d", loop, pid); - } - else - { - NSSBR_LOGDBG ("free tx_pool ok]loop=%d,pid=%d", loop, pid); - } - - break; - } - } -} - -/*************************************************** -* description: -***************************************************/ -mring_handle -sbr_get_instance_conn_pool (u32 thread_index) -{ - if (thread_index >= g_res_group_array->thread_num) - { - return NULL; - } - - spl_app_res_group *group = - (spl_app_res_group *) - ADDR_SHTOL (g_res_group_array->res_group[thread_index]); - return ADDR_SHTOL (group->conn_pool); -} - -/*************************************************** -* description: -***************************************************/ -mring_handle * -ss_get_instance_msg_box (u16 thread_index, u16 idx) -{ - if (thread_index >= g_res_group_array->thread_num) - { - thread_index = 0; - } - - if (idx >= SPL_MSG_BOX_NUM) - { - idx = 0; - } - - spl_app_res_group *group = - (spl_app_res_group *) - ADDR_SHTOL (g_res_group_array->res_group[thread_index]); - return ADDR_SHTOL (group->mbox_array[idx]); -} |