OSDN Git Service

*** empty log message ***
authorkoinec <>
Sun, 15 Nov 2009 02:22:24 +0000 (02:22 +0000)
committerkoinec <>
Sun, 15 Nov 2009 02:22:24 +0000 (02:22 +0000)
deamon/drd64_server_recvstatus.c
deamon/drd64_server_recvstatus.h

index 896fee4..9116d2c 100644 (file)
@@ -43,6 +43,9 @@ Drd64_Server_RecvStatus               *gp_recvalloc;
 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
@@ -152,6 +155,9 @@ int
        gp_recvalloc    = p_recvs;
        gi_recvalloc_now        = 0;
 
+       gp_recv_resume_start    = NULL;
+       gi_recv_resume_max              = FD_SETSIZE;
+
        return 0x00;
 }
 
@@ -179,7 +185,9 @@ Drd64_Server_RecvStatus *
 
        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);
@@ -187,6 +195,7 @@ Drd64_Server_RecvStatus *
                        }
                }
 
+               /* Realloc RecvStatus --- */
                if( NULL == p_recv )    {
                        p_temp
                                = Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
@@ -201,9 +210,13 @@ Drd64_Server_RecvStatus *
                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; }
 
@@ -247,6 +260,111 @@ void
 
 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 )
 {
index a0844f6..be48800 100644 (file)
@@ -60,6 +60,9 @@ typedef struct {
 
        Byte    b_recv_status;
        int             i_command_status;       /* Cmd Proc. Use Area - for Cmd Status */
+
+       void    *pv_recv_before;
+       void    *pv_recv_next;
 } Drd64_Server_RecvStatus;
 
 #ifdef DRD64_SRC_SERVER_RECVSTATUS
@@ -89,6 +92,18 @@ EXTERN_SERVER_RECVSTATUS
                Drd64_Server_RecvStatus_FreeRecvStatus(
                        int i_fds );
 
+
+EXTERN_SERVER_RECVSTATUS
+       Drd64_Server_RecvStatus *
+               Drd64_Server_RecvStatus_PushResumeChain(
+                       int     i_fds,
+                       int     i_alloc_units );
+
+EXTERN_SERVER_RECVSTATUS
+       int
+               Drd64_Server_RecvStatus_DeleteResumeChain(
+                       int     i_recv_id );
+
 EXTERN_SERVER_RECVSTATUS
        Drd64_Server_RecvStatus *
                Drd64_Server_RecvStatus_GetRecvStatus(