int gi_recvalloc_max;
int gi_recvalloc_now;
int gi_recvstat_max;
+Drd64_Server_RecvStatus *gp_recv_resume_start;
+Drd64_Server_RecvStatus *gp_recv_resume_end;
+int gi_recv_resume_max;
int
gp_recvalloc = p_recvs;
gi_recvalloc_now = 0;
+ gp_recv_resume_start = NULL;
+ gi_recv_resume_max = FD_SETSIZE;
+
return 0x00;
}
p_recv = NULL;
+ /* Check No-Use RecvStatus --- */
if( gi_recvalloc_now >= gi_recvalloc_max ) {
+ /* Search No-Use RecvStatus --- */
for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
if( -1 == (gp_recvalloc + i_cnt)->i_recvstatus_id ) {
p_recv = (gp_recvalloc + i_cnt);
}
}
+ /* Realloc RecvStatus --- */
if( NULL == p_recv ) {
p_temp
= Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
p_recv = gp_recvalloc + gi_recvalloc_now++;
}
+ /* Set RecvStatus Init. Param ---*/
p_recv->i_recvstatus_id = i_fds;
p_recv->i_fds_id = i_fds;
*(gpp_recvstat + i_fds) = p_recv;
+
+
+
if( i_fds + 1 > gi_recvstat_max )
{ gi_recvstat_max = i_fds + 1; }
EXTERN_SERVER_RECVSTATUS
Drd64_Server_RecvStatus *
+ Drd64_Server_RecvStatus_PushResumeChain(
+ int i_fds,
+ int i_alloc_units )
+{
+ int i_cnt;
+ Drd64_Server_RecvStatus *p_recv_self;
+ Drd64_Server_RecvStatus *p_recv_new;
+ Drd64_Server_RecvStatus *p_recv_before;
+
+ /* Get Self RecvStatus --- */
+ p_recv_self = *(gpp_recvstat + i_fds);
+ if( NULL == p_recv_self ) {
+ return NULL;
+ }
+
+ /* Get New RecvStatus --- */
+ p_recv_new
+ = Drd64_Server_RecvStatus_AllocRecvStatus(
+ i_fds, i_alloc_units );
+ if( NULL == p_recv_new ) {
+ return NULL;
+ }
+
+ /* Push & Chain RecvStatus ---*/
+ /* new */
+ if( NULL == gp_recv_resume_start ) {
+ gp_recv_resume_start = p_recv_self;
+ gp_recv_resume_end = p_recv_self;
+ p_recv_self->pv_recv_before = NULL;
+ p_recv_self->pv_recv_next = NULL;
+ i_cnt = gi_recv_resume_max;
+ }
+ else {
+ i_cnt = FD_SETSIZE;
+ while(( NULL != *(gpp_recvstat + i_cnt) )
+ && ( i_cnt < gi_recv_resume_max )) { i_cnt++; }
+ assert( NULL == *(gpp_recvstat + i_cnt) );
+
+ p_recv_before = gp_recv_resume_end;
+ assert( NULL != p_recv_before );
+
+ p_recv_self->pv_recv_before = (void *)p_recv_before;
+ p_recv_self->pv_recv_next = (void *)p_recv_before->pv_recv_next;
+ p_recv_before->pv_recv_next = (void *)p_recv_self;
+ gp_recv_resume_end = p_recv_self;
+
+ }
+
+ p_recv_self->i_recvstatus_id = i_cnt;
+ *(gpp_recvstat + p_recv_self->i_recvstatus_id) = p_recv_self;
+ if( gi_recv_resume_max == i_cnt ) {
+ gi_recv_resume_max++;
+ }
+
+ return p_recv_self;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+int
+ Drd64_Server_RecvStatus_DeleteResumeChain(
+ int i_recv_id )
+{
+ Drd64_Server_RecvStatus *p_recv_self;
+ Drd64_Server_RecvStatus *p_recv_before;
+ Drd64_Server_RecvStatus *p_recv_next;
+
+ p_recv_self = *(gpp_recvstat + i_recv_id);
+ if( NULL == p_recv_self ) {
+ return 0x01;
+ }
+
+ p_recv_before = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_before;
+ p_recv_next = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_next;
+
+ if( NULL != p_recv_before ) {
+ p_recv_before->pv_recv_next = (void *)p_recv_next;
+ }
+
+ if( NULL != p_recv_next ) {
+ p_recv_next->pv_recv_before = (void *)p_recv_before;
+ }
+
+ if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) ) {
+ gi_recv_resume_max--;
+ }
+
+ if( FD_SETSIZE == gi_recv_resume_max ) {
+ gp_recv_resume_start = NULL;
+ gp_recv_resume_end = NULL;
+ }
+
+ *(gpp_recvstat + i_recv_id) = NULL;
+ p_recv_self->pv_recv_before = NULL;
+ p_recv_self->pv_recv_next = NULL;
+
+ p_recv_self->i_recvstatus_id = -1;
+ p_recv_self->i_fds_id = -1;
+
+ return NULL;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+Drd64_Server_RecvStatus *
Drd64_Server_RecvStatus_GetRecvStatus(
int i_fds )
{