1110 lines
22 KiB
C++
1110 lines
22 KiB
C++
|
|
/***************************************************************************************
|
||
|
|
*
|
||
|
|
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||
|
|
*
|
||
|
|
* By downloading, copying, installing or using the software you agree to this license.
|
||
|
|
* If you do not agree to this license, do not download, install,
|
||
|
|
* copy or use the software.
|
||
|
|
*
|
||
|
|
* Copyright (C) 2014-2024, Happytimesoft Corporation, all rights reserved.
|
||
|
|
*
|
||
|
|
* Redistribution and use in binary forms, with or without modification, are permitted.
|
||
|
|
*
|
||
|
|
* 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 "sys_inc.h"
|
||
|
|
#include "ppstack.h"
|
||
|
|
|
||
|
|
/***************************************************************************************/
|
||
|
|
HT_API PPSN_CTX * pps_ctx_fl_init_assign(char * mem_addr, unsigned long mem_len, unsigned long node_num, unsigned long content_size, BOOL bNeedMutex)
|
||
|
|
{
|
||
|
|
PPSN_CTX * ctx_ptr;
|
||
|
|
uint32 i = 0;
|
||
|
|
unsigned long unit_len = content_size + sizeof(PPSN);
|
||
|
|
unsigned long content_len = node_num * unit_len;
|
||
|
|
|
||
|
|
if (mem_len < (content_len + sizeof(PPSN_CTX)))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_ERR, "%s, assign mem len too short!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr = (PPSN_CTX *)mem_addr;
|
||
|
|
memset(ctx_ptr, 0, sizeof(PPSN_CTX));
|
||
|
|
memset((char *)(mem_addr+sizeof(PPSN_CTX)), 0, content_len);
|
||
|
|
|
||
|
|
for (; i<node_num; i++)
|
||
|
|
{
|
||
|
|
uint32 offset = sizeof(PPSN_CTX) + unit_len * i;
|
||
|
|
PPSN * p_node = (PPSN *)(mem_addr + offset);
|
||
|
|
|
||
|
|
if (ctx_ptr->head_node == 0)
|
||
|
|
{
|
||
|
|
ctx_ptr->head_node = offset;
|
||
|
|
ctx_ptr->tail_node = offset;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_prev_node = (PPSN *)(mem_addr + ctx_ptr->tail_node);
|
||
|
|
p_prev_node->next_node = offset;
|
||
|
|
p_node->prev_node = ctx_ptr->tail_node;
|
||
|
|
ctx_ptr->tail_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node->node_flag = 1;
|
||
|
|
|
||
|
|
(ctx_ptr->node_num)++;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (bNeedMutex)
|
||
|
|
{
|
||
|
|
ctx_ptr->ctx_mutex = sys_os_create_mutex();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
ctx_ptr->ctx_mutex = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr->fl_base = (char *)ctx_ptr;
|
||
|
|
ctx_ptr->low_offset = sizeof(PPSN_CTX) + sizeof(PPSN);
|
||
|
|
ctx_ptr->high_offset = sizeof(PPSN_CTX) + content_len - unit_len + sizeof(PPSN);
|
||
|
|
ctx_ptr->unit_size = unit_len;
|
||
|
|
|
||
|
|
return ctx_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API PPSN_CTX * pps_ctx_fl_init(unsigned long node_num, unsigned long content_size, BOOL bNeedMutex)
|
||
|
|
{
|
||
|
|
unsigned long unit_len = content_size + sizeof(PPSN);
|
||
|
|
unsigned long content_len = node_num * unit_len;
|
||
|
|
char * content_ptr;
|
||
|
|
PPSN_CTX * ctx_ptr;
|
||
|
|
|
||
|
|
content_ptr = (char *)malloc(content_len + sizeof(PPSN_CTX));
|
||
|
|
if (content_ptr == NULL)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_ERR, "%s, memory malloc failed,len = %d\r\n", __FUNCTION__, content_len);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr = pps_ctx_fl_init_assign(content_ptr, content_len+sizeof(PPSN_CTX), node_num, content_size, bNeedMutex);
|
||
|
|
|
||
|
|
return ctx_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_fl_free(PPSN_CTX * fl_ctx)
|
||
|
|
{
|
||
|
|
if (fl_ctx == NULL)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (fl_ctx->ctx_mutex)
|
||
|
|
{
|
||
|
|
sys_os_destroy_sig_mutex(fl_ctx->ctx_mutex);
|
||
|
|
}
|
||
|
|
|
||
|
|
free(fl_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
/***************************************************************************************/
|
||
|
|
HT_API void pps_fl_reinit(PPSN_CTX * fl_ctx)
|
||
|
|
{
|
||
|
|
uint32 i = 0;
|
||
|
|
char * mem_addr;
|
||
|
|
char * content_start;
|
||
|
|
char * content_end;
|
||
|
|
unsigned long content_len;
|
||
|
|
|
||
|
|
if (fl_ctx == NULL)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
mem_addr = (char *)fl_ctx;
|
||
|
|
|
||
|
|
pps_wait_mutex(fl_ctx);
|
||
|
|
|
||
|
|
content_start = (char *)(mem_addr + fl_ctx->low_offset - sizeof(PPSN));
|
||
|
|
content_end = (char *)(mem_addr + fl_ctx->high_offset - sizeof(PPSN) + fl_ctx->unit_size);
|
||
|
|
|
||
|
|
content_len = (unsigned long)(content_end - content_start);
|
||
|
|
fl_ctx->node_num = content_len / fl_ctx->unit_size;
|
||
|
|
fl_ctx->head_node = 0;
|
||
|
|
fl_ctx->tail_node = 0;
|
||
|
|
|
||
|
|
memset(content_start, 0, content_len);
|
||
|
|
|
||
|
|
for (; i<fl_ctx->node_num; i++)
|
||
|
|
{
|
||
|
|
uint32 offset = sizeof(PPSN_CTX) + fl_ctx->unit_size * i;
|
||
|
|
PPSN * p_node = (PPSN *)(mem_addr + offset);
|
||
|
|
|
||
|
|
if (fl_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
fl_ctx->head_node = offset;
|
||
|
|
fl_ctx->tail_node = offset;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_prev_node = (PPSN *)(mem_addr + fl_ctx->tail_node);
|
||
|
|
p_prev_node->next_node = offset;
|
||
|
|
p_node->prev_node = fl_ctx->tail_node;
|
||
|
|
fl_ctx->tail_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node->node_flag = 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_post_mutex(fl_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_fl_push(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
unsigned long offset;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || content_ptr == NULL)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (pps_safe_node(pps_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
offset = (unsigned long)((char *)p_node - pps_ctx->fl_base);
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (p_node->node_flag == 1)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit node %d already in freelist !!!\r\n", __FUNCTION__, pps_get_index(pps_ctx, content_ptr));
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node->prev_node = 0;
|
||
|
|
p_node->node_flag = 1;
|
||
|
|
|
||
|
|
if (pps_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
pps_ctx->head_node = offset;
|
||
|
|
pps_ctx->tail_node = offset;
|
||
|
|
p_node->next_node = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_prev = (PPSN *)(pps_ctx->head_node + (char *)pps_ctx->fl_base);
|
||
|
|
p_prev->prev_node = offset;
|
||
|
|
p_node->next_node = pps_ctx->head_node;
|
||
|
|
pps_ctx->head_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_ctx->node_num++;
|
||
|
|
pps_ctx->push_cnt++;
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_fl_push_tail(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
unsigned long offset;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || content_ptr == NULL)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (pps_safe_node(pps_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
offset = (unsigned long)((char *)p_node - pps_ctx->fl_base);
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (p_node->node_flag == 1)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit node %d already in freelist !!!\r\n", __FUNCTION__, pps_get_index(pps_ctx, content_ptr));
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node->prev_node = 0;
|
||
|
|
p_node->next_node = 0;
|
||
|
|
p_node->node_flag = 1;
|
||
|
|
|
||
|
|
if (pps_ctx->tail_node == 0)
|
||
|
|
{
|
||
|
|
pps_ctx->head_node = offset;
|
||
|
|
pps_ctx->tail_node = offset;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_prev;
|
||
|
|
|
||
|
|
p_node->prev_node = pps_ctx->tail_node;
|
||
|
|
p_prev = (PPSN *)(pps_ctx->tail_node + (char *)pps_ctx);
|
||
|
|
p_prev->next_node = offset;
|
||
|
|
pps_ctx->tail_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_ctx->node_num++;
|
||
|
|
pps_ctx->push_cnt++;
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_fl_pop(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(pps_ctx->fl_base + pps_ctx->head_node);
|
||
|
|
|
||
|
|
pps_ctx->head_node = p_node->next_node;
|
||
|
|
|
||
|
|
if (pps_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
pps_ctx->tail_node = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_new_head = (PPSN *)(pps_ctx->fl_base + pps_ctx->head_node);
|
||
|
|
p_new_head->prev_node = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
(pps_ctx->node_num)--;
|
||
|
|
(pps_ctx->pop_cnt)++;
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
|
||
|
|
memset(p_node, 0, sizeof(PPSN));
|
||
|
|
|
||
|
|
return (void *)(((char *)p_node) + sizeof(PPSN));
|
||
|
|
}
|
||
|
|
|
||
|
|
void pps_ctx_fl_show(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
uint32 offset;
|
||
|
|
unsigned long ctx_count = 0;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
log_print(HT_LOG_DBG, "PPSN_CTX[0x%p]::unit size = %d,unit num = %d,head = %d,tail = %d\r\n",
|
||
|
|
pps_ctx->fl_base, pps_ctx->unit_size, pps_ctx->node_num, pps_ctx->head_node, pps_ctx->tail_node);
|
||
|
|
|
||
|
|
offset = pps_ctx->head_node;
|
||
|
|
|
||
|
|
while (offset != 0)
|
||
|
|
{
|
||
|
|
PPSN * p_node = (PPSN *)(pps_ctx->fl_base + offset);
|
||
|
|
|
||
|
|
log_print(HT_LOG_DBG, "0x%p == FLAG: %d next: 0x%08x prev: 0x%08x\r\n",
|
||
|
|
p_node, p_node->node_flag, p_node->next_node, p_node->prev_node);
|
||
|
|
|
||
|
|
ctx_count++;
|
||
|
|
|
||
|
|
if (ctx_count > pps_ctx->node_num)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "\r\n!!!FreeList Error,Linked item count[%u] > real item count[%u]\r\n", ctx_count, pps_ctx->node_num);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
offset = p_node->next_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
log_print(HT_LOG_INFO, "\r\nFreeList Linked item count[%d]\r\n", ctx_count);
|
||
|
|
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
/***************************************************************************************/
|
||
|
|
HT_API BOOL pps_ctx_ul_init_assign(PPSN_CTX * ul_ctx, PPSN_CTX * fl_ctx, BOOL bNeedMutex)
|
||
|
|
{
|
||
|
|
if (ul_ctx == NULL || fl_ctx == NULL)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
memset(ul_ctx, 0, sizeof(PPSN_CTX));
|
||
|
|
|
||
|
|
ul_ctx->fl_base = fl_ctx->fl_base;
|
||
|
|
ul_ctx->high_offset = fl_ctx->high_offset;
|
||
|
|
ul_ctx->low_offset = fl_ctx->low_offset;
|
||
|
|
ul_ctx->unit_size = fl_ctx->unit_size;
|
||
|
|
|
||
|
|
if (bNeedMutex)
|
||
|
|
{
|
||
|
|
ul_ctx->ctx_mutex = sys_os_create_mutex();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
ul_ctx->ctx_mutex = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API PPSN_CTX * pps_ctx_ul_init(PPSN_CTX * fl_ctx, BOOL bNeedMutex)
|
||
|
|
{
|
||
|
|
PPSN_CTX * ctx_ptr;
|
||
|
|
|
||
|
|
if (fl_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr = (PPSN_CTX *)malloc(sizeof(PPSN_CTX));
|
||
|
|
if (ctx_ptr == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
memset(ctx_ptr, 0, sizeof(PPSN_CTX));
|
||
|
|
|
||
|
|
ctx_ptr->fl_base = fl_ctx->fl_base;
|
||
|
|
ctx_ptr->high_offset = fl_ctx->high_offset; // + fl_ctx->fl_base;
|
||
|
|
ctx_ptr->low_offset = fl_ctx->low_offset; // + fl_ctx->fl_base;
|
||
|
|
ctx_ptr->unit_size = fl_ctx->unit_size;
|
||
|
|
|
||
|
|
if (bNeedMutex)
|
||
|
|
{
|
||
|
|
ctx_ptr->ctx_mutex = sys_os_create_mutex();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
ctx_ptr->ctx_mutex = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
return ctx_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_ctx_ul_init_nm(PPSN_CTX * fl_ctx, PPSN_CTX * ul_ctx)
|
||
|
|
{
|
||
|
|
return pps_ctx_ul_init_assign(ul_ctx, fl_ctx, FALSE);
|
||
|
|
}
|
||
|
|
|
||
|
|
/***************************************************************************************/
|
||
|
|
HT_API void pps_ul_reinit(PPSN_CTX * ul_ctx)
|
||
|
|
{
|
||
|
|
if (ul_ctx == NULL)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
ul_ctx->node_num = 0;
|
||
|
|
ul_ctx->head_node = 0;
|
||
|
|
ul_ctx->tail_node = 0;
|
||
|
|
|
||
|
|
pps_wait_mutex(ul_ctx);
|
||
|
|
pps_post_mutex(ul_ctx);
|
||
|
|
|
||
|
|
if (ul_ctx->ctx_mutex)
|
||
|
|
{
|
||
|
|
sys_os_destroy_sig_mutex(ul_ctx->ctx_mutex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_ul_free(PPSN_CTX * ul_ctx)
|
||
|
|
{
|
||
|
|
if (ul_ctx == NULL)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (ul_ctx->ctx_mutex)
|
||
|
|
{
|
||
|
|
sys_os_destroy_sig_mutex(ul_ctx->ctx_mutex);
|
||
|
|
}
|
||
|
|
|
||
|
|
free(ul_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_ctx_ul_del(PPSN_CTX * ul_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_used_node(ul_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
pps_wait_mutex(ul_ctx);
|
||
|
|
|
||
|
|
if (p_node->prev_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->head_node = p_node->next_node;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
((PPSN *)(ul_ctx->fl_base + p_node->prev_node))->next_node = p_node->next_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_node->next_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->tail_node = p_node->prev_node;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
((PPSN *)(ul_ctx->fl_base + p_node->next_node))->prev_node = p_node->prev_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
(ul_ctx->node_num)--;
|
||
|
|
|
||
|
|
pps_post_mutex(ul_ctx);
|
||
|
|
|
||
|
|
memset(p_node, 0, sizeof(PPSN));
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API PPSN * pps_ctx_ul_del_node_unlock(PPSN_CTX * ul_ctx, PPSN * p_node)
|
||
|
|
{
|
||
|
|
if (p_node->node_flag != 2)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit not in used list!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (ul_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, used list is empty!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_node->prev_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->head_node = p_node->next_node;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
((PPSN *)(ul_ctx->fl_base + p_node->prev_node))->next_node = p_node->next_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_node->next_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->tail_node = p_node->prev_node;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
((PPSN *)(ul_ctx->fl_base + p_node->next_node))->prev_node = p_node->prev_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
(ul_ctx->node_num)--;
|
||
|
|
|
||
|
|
if (p_node->next_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (PPSN *)(ul_ctx->fl_base + p_node->next_node);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_ctx_ul_del_unlock(PPSN_CTX * ul_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
PPSN * p_ret;
|
||
|
|
|
||
|
|
if (pps_used_node(ul_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
p_ret = pps_ctx_ul_del_node_unlock(ul_ctx, p_node);
|
||
|
|
if (p_ret == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(((char *)p_ret) + sizeof(PPSN));
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_ctx_ul_add(PPSN_CTX * ul_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
uint32 offset;
|
||
|
|
|
||
|
|
if (pps_safe_node(ul_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
if (p_node->node_flag != 0)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(ul_ctx);
|
||
|
|
|
||
|
|
p_node->next_node = 0;
|
||
|
|
p_node->node_flag = 2;
|
||
|
|
|
||
|
|
offset = (unsigned long)((char *)p_node - ul_ctx->fl_base);
|
||
|
|
|
||
|
|
if (ul_ctx->tail_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->tail_node = offset;
|
||
|
|
ul_ctx->head_node = offset;
|
||
|
|
p_node->prev_node = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_tail = (PPSN *)(ul_ctx->fl_base + ul_ctx->tail_node);
|
||
|
|
p_tail->next_node = offset;
|
||
|
|
p_node->prev_node = ul_ctx->tail_node;
|
||
|
|
ul_ctx->tail_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
(ul_ctx->node_num)++;
|
||
|
|
|
||
|
|
pps_post_mutex(ul_ctx);
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_ctx_ul_add_head(PPSN_CTX * ul_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
uint32 offset;
|
||
|
|
|
||
|
|
if (pps_safe_node(ul_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
if(p_node->node_flag != 0)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(ul_ctx);
|
||
|
|
|
||
|
|
offset = (unsigned long)((char *)p_node - ul_ctx->fl_base);
|
||
|
|
p_node->node_flag = 2;
|
||
|
|
p_node->prev_node = 0;
|
||
|
|
|
||
|
|
if (ul_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
ul_ctx->tail_node = offset;
|
||
|
|
ul_ctx->head_node = offset;
|
||
|
|
p_node->next_node = 0;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
PPSN * p_head = (PPSN *)(ul_ctx->fl_base + ul_ctx->head_node);
|
||
|
|
p_head->prev_node = offset;
|
||
|
|
p_node->next_node = ul_ctx->head_node;
|
||
|
|
ul_ctx->head_node = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
(ul_ctx->node_num)++;
|
||
|
|
|
||
|
|
pps_post_mutex(ul_ctx);
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
PPSN * _pps_node_head_start(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (PPSN *)(pps_ctx->fl_base + pps_ctx->head_node);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
PPSN * _pps_node_tail_start(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->tail_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (PPSN *)(pps_ctx->fl_base + pps_ctx->tail_node);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
PPSN * _pps_node_next(PPSN_CTX * pps_ctx, PPSN * p_node)
|
||
|
|
{
|
||
|
|
char * ctx_ptr;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || p_node == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr = ((char *)p_node) + sizeof(PPSN);
|
||
|
|
|
||
|
|
if (ctx_ptr < (pps_ctx->fl_base + pps_ctx->low_offset) ||
|
||
|
|
ctx_ptr > (pps_ctx->fl_base + pps_ctx->high_offset))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_node->next_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (PPSN *)(p_node->next_node + pps_ctx->fl_base);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
PPSN * _pps_node_prev(PPSN_CTX * pps_ctx, PPSN * p_node)
|
||
|
|
{
|
||
|
|
char * ctx_ptr;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || p_node == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
ctx_ptr = ((char *)p_node) + sizeof(PPSN);
|
||
|
|
|
||
|
|
if (ctx_ptr < (pps_ctx->low_offset+pps_ctx->fl_base) ||
|
||
|
|
ctx_ptr > (pps_ctx->high_offset+pps_ctx->fl_base))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (p_node->prev_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (PPSN *)(pps_ctx->fl_base + p_node->prev_node);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void _pps_node_end(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_lookup_start(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->head_node)
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(pps_ctx->fl_base + pps_ctx->head_node + sizeof(PPSN));
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_lookup_next(PPSN_CTX * pps_ctx, void * ctx_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || ctx_ptr == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((char *)ctx_ptr < (pps_ctx->fl_base + pps_ctx->low_offset) ||
|
||
|
|
(char *)ctx_ptr > (pps_ctx->fl_base + pps_ctx->high_offset))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)ctx_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
if (p_node->next_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(pps_ctx->fl_base + p_node->next_node + sizeof(PPSN));
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_lookup_end(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_lookback_start(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->tail_node)
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(pps_ctx->tail_node + sizeof(PPSN)+pps_ctx->fl_base);
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_lookback_next(PPSN_CTX * pps_ctx, void * ctx_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || ctx_ptr == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((char *)ctx_ptr < (pps_ctx->low_offset+pps_ctx->fl_base) ||
|
||
|
|
(char *)ctx_ptr > (pps_ctx->high_offset+pps_ctx->fl_base))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)ctx_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
if (p_node->prev_node == 0)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(p_node->prev_node + sizeof(PPSN)+pps_ctx->fl_base);
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_lookback_end(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
pps_post_mutex(pps_ctx);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API uint32 pps_get_index(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
uint32 index;
|
||
|
|
uint32 offset;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || content_ptr == NULL)
|
||
|
|
{
|
||
|
|
return 0xFFFFFFFF;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((char *)content_ptr < (pps_ctx->low_offset+pps_ctx->fl_base) ||
|
||
|
|
(char *)content_ptr > (pps_ctx->high_offset+pps_ctx->fl_base))
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return 0xFFFFFFFF;
|
||
|
|
}
|
||
|
|
|
||
|
|
index = (uint32)((char *)content_ptr - pps_ctx->low_offset - pps_ctx->fl_base);
|
||
|
|
offset = index % pps_ctx->unit_size;
|
||
|
|
if (offset != 0)
|
||
|
|
{
|
||
|
|
index = index /pps_ctx->unit_size;
|
||
|
|
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error,pps_ctx[0x%08x],ptr[0x%08x],low_offset[0x%08x],offset[0x%08x],like entry[%u]\r\n",
|
||
|
|
__FUNCTION__, pps_ctx, content_ptr, pps_ctx->low_offset, offset,index);
|
||
|
|
return 0xFFFFFFFF;
|
||
|
|
}
|
||
|
|
|
||
|
|
index = index / pps_ctx->unit_size;
|
||
|
|
|
||
|
|
return index;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_get_node_by_index(PPSN_CTX * pps_ctx, unsigned long index)
|
||
|
|
{
|
||
|
|
unsigned long content_offset;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
content_offset = pps_ctx->low_offset + index * pps_ctx->unit_size;
|
||
|
|
|
||
|
|
if (content_offset > pps_ctx->high_offset)
|
||
|
|
{
|
||
|
|
if (index != 0xFFFFFFFF)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, index [%u]error!!!\r\n", __FUNCTION__, index);
|
||
|
|
}
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
return (void *)(content_offset + pps_ctx->fl_base);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_wait_mutex(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, pps_ctx == NULL!!!\r\n", __FUNCTION__);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (pps_ctx->ctx_mutex)
|
||
|
|
{
|
||
|
|
sys_os_mutex_enter (pps_ctx->ctx_mutex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void pps_post_mutex(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, pps_ctx == NULL!!!\r\n", __FUNCTION__);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (pps_ctx->ctx_mutex)
|
||
|
|
{
|
||
|
|
sys_os_mutex_leave (pps_ctx->ctx_mutex);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_safe_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
uint32 index;
|
||
|
|
uint32 offset;
|
||
|
|
|
||
|
|
if (pps_ctx == NULL || content_ptr == NULL)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((char *)content_ptr < (pps_ctx->low_offset + pps_ctx->fl_base) ||
|
||
|
|
(char *)content_ptr > (pps_ctx->high_offset + pps_ctx->fl_base))
|
||
|
|
{
|
||
|
|
// log_print(HT_LOG_WARN, "%s, unit ptr error!!!\r\n", __FUNCTION__);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
index = (unsigned long)((char *)content_ptr - pps_ctx->low_offset - pps_ctx->fl_base);
|
||
|
|
offset = index % pps_ctx->unit_size;
|
||
|
|
|
||
|
|
if (offset != 0)
|
||
|
|
{
|
||
|
|
index = index / pps_ctx->unit_size;
|
||
|
|
|
||
|
|
log_print(HT_LOG_WARN, "%s, unit ptr error,pps_ctx[0x%08x],ptr[0x%08x],low_offset[0x%08x],offset[0x%08x],like entry[%u]\r\n",
|
||
|
|
__FUNCTION__, pps_ctx, content_ptr, pps_ctx->low_offset, offset, index);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_idle_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_safe_node(pps_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
return (p_node->node_flag == 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_exist_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_safe_node(pps_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
return (p_node->node_flag != 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API BOOL pps_used_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (pps_safe_node(pps_ctx, content_ptr) == FALSE)
|
||
|
|
{
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (pps_ctx->head_node == 0)
|
||
|
|
{
|
||
|
|
log_print(HT_LOG_WARN, "%s, used list is empty!!!\r\n", __FUNCTION__);
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)content_ptr) - sizeof(PPSN));
|
||
|
|
|
||
|
|
return (p_node->node_flag == 2);
|
||
|
|
}
|
||
|
|
|
||
|
|
void * _pps_node_get_data(PPSN * p_node)
|
||
|
|
{
|
||
|
|
if (p_node == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
return (void *)(((char *)p_node) + sizeof(PPSN));
|
||
|
|
}
|
||
|
|
|
||
|
|
PPSN * _pps_data_get_node(void * p_data)
|
||
|
|
{
|
||
|
|
PPSN * p_node;
|
||
|
|
|
||
|
|
if (p_data == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
p_node = (PPSN *)(((char *)p_data) - sizeof(PPSN));
|
||
|
|
|
||
|
|
return p_node;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API int pps_node_count(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
return pps_ctx->node_num;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_get_head_node(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
//pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->head_node)
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(pps_ctx->head_node + sizeof(PPSN));
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_get_tail_node(PPSN_CTX * pps_ctx)
|
||
|
|
{
|
||
|
|
if (pps_ctx == NULL)
|
||
|
|
{
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
//pps_wait_mutex(pps_ctx);
|
||
|
|
|
||
|
|
if (pps_ctx->tail_node)
|
||
|
|
{
|
||
|
|
void * ret_ptr = (void *)(pps_ctx->tail_node + sizeof(PPSN));
|
||
|
|
return ret_ptr;
|
||
|
|
}
|
||
|
|
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_get_next_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node = _pps_data_get_node(content_ptr);
|
||
|
|
p_node = _pps_node_next(pps_ctx, p_node);
|
||
|
|
return _pps_node_get_data(p_node);
|
||
|
|
}
|
||
|
|
|
||
|
|
HT_API void * pps_get_prev_node(PPSN_CTX * pps_ctx, void * content_ptr)
|
||
|
|
{
|
||
|
|
PPSN * p_node = _pps_data_get_node(content_ptr);
|
||
|
|
p_node = _pps_node_prev(pps_ctx, p_node);
|
||
|
|
return _pps_node_get_data(p_node);
|
||
|
|
}
|
||
|
|
|
||
|
|
|