/* 网络中无数据包, CPU闲置时, 在包处理线程的上下文中调用此接口, 可用于htable超时淘汰, 活跃IP配置更新(原来是无策略的, 用户增加了一条配置, 变成有策略的了; 或反之, 原来属于有策略, 被删除了), 因此函数接口在包处理线程的上下文中, 可实现包处理线程正常处理时不加锁, 提高性能!! */ #include "flowood.h" #include "flowood_fun.h" #include "flwd_net.h" #include "MESA_handle_logger.h" #include "MESA_atomic.h" #include #include #include #include #include #include #include extern MESA_ATOMIC_T flwd_temp_active_ip_op_flag[FLWD_MAX_THREAD_NUM]; /* 在包处理线程上下文处理活跃IP的更新, 无锁模式 */ static int flwd_act_ip_update_in_process_thread_context(int tid) { #if FLWD_ASYNC_LOCK_FREE int ret; flwd_active_ip_t tmp_act_ip; long buf_len; if(0 == MESA_lqueue_get_count(flwd_temp_active_ip_to_deal[tid])){ /* 没有新的数据 */ return 0; } if(FLWD_ACT_IP_OP_OR_MASK_BY_CALLBACK & __sync_or_and_fetch(&flwd_temp_active_ip_op_flag[tid], FLWD_ACT_IP_OP_OR_MASK_BY_PROC)){ /* callback线程还在处理中, 此处不能等待, 清空标志位后, 直接返回等下一次调用 */ __sync_and_and_fetch(&flwd_temp_active_ip_op_flag[tid], FLWD_ACT_IP_OP_AND_MASK_BY_PROC); return 0; } buf_len = sizeof(flwd_active_ip_t); ret = MESA_lqueue_get_head(flwd_temp_active_ip_to_deal[tid], &tmp_act_ip, &buf_len); assert(ret >= 0); flwd_act_ip_hash_proc(tid, &tmp_act_ip); /* 处理完毕, 清零标志位 */ __sync_and_and_fetch(&flwd_temp_active_ip_op_flag[tid], FLWD_ACT_IP_OP_AND_MASK_BY_PROC); return 1; #else return 0; #endif } int flwd_idle_call(int tid) { int ret; ret = flwd_act_ip_update_in_process_thread_context(tid); return ret; }