1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #include"drd64_server.h"
38 #define DRD64_SRC_SERVER_RECVSTATUS
39 #include"drd64_server_recvstatus.h"
41 Drd64_Server_RecvStatus **gpp_recvstat;
42 Drd64_Server_RecvStatus *gp_recvalloc;
46 Drd64_Server_RecvStatus *gp_recv_resume_start;
47 Drd64_Server_RecvStatus *gp_recv_resume_end;
48 int gi_recv_resume_max;
52 Drd64_Server_RecvStatus_FreeRecvStatus_All(
57 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
58 free( (gp_recvalloc + i_cnt)->pv_buf );
59 (gp_recvalloc + i_cnt)->pv_buf = NULL;
74 Drd64_Server_RecvStatus *
75 Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
82 Drd64_Server_RecvStatus *p_recvs;
86 if( 0 == gi_recvalloc_max ) {
87 p_recvs = (Drd64_Server_RecvStatus *)malloc(
88 sizeof( Drd64_Server_RecvStatus )
92 i_init_end_id = i_alloc_units;
95 p_recvs = realloc( gp_recvalloc,
96 gi_recvalloc_max + i_alloc_units );
98 i_init_start_id = gi_recvalloc_max;
99 i_init_end_id = gi_recvalloc_max + i_alloc_units;
102 if( NULL == p_recvs ) {
107 for( i_cnt = i_init_start_id; i_cnt < i_init_end_id; i_cnt++ ) {
108 memset( (p_recvs + i_cnt), 0x00,
109 sizeof( Drd64_Server_RecvStatus ) );
110 (p_recvs + i_cnt)->i_recvstatus_id = -1;
111 (p_recvs + i_cnt)->i_fds_id = -1;
113 pv_temp = malloc( DRD64_MAX_PACKET_LENGTH );
114 if( NULL == pv_temp ) { break; }
115 (p_recvs + i_cnt)->pv_buf = pv_temp;
119 if( gi_recvalloc_max == i_init_start_id ) {
123 gp_recvalloc = p_recvs;
128 EXTERN_SERVER_RECVSTATUS
130 Drd64_Server_RecvStatus_Init(
133 Drd64_Server_RecvStatus *p_recvs;
135 /* Alloc RecvStatus Struct Management Area --- */
137 = (Drd64_Server_RecvStatus **)malloc(
138 sizeof( Drd64_Server_RecvStatus *)
139 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE);
140 if( NULL == gpp_recvstat ) { return 0x01; }
142 memset( gpp_recvstat, 0x00,
143 sizeof( Drd64_Server_RecvStatus *)
144 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE );
148 /* Alloc RecvStatus Area ( with Packet Data buffer ) ---*/
149 p_recvs = Drd64_Server_RecvStatus_AllocRecvStatus_Unit( i_alloc_units );
150 if( NULL == p_recvs ) {
151 Drd64_Server_RecvStatus_FreeRecvStatus_All();
155 gp_recvalloc = p_recvs;
156 gi_recvalloc_now = 0;
158 gp_recv_resume_start = NULL;
159 gi_recv_resume_max = FD_SETSIZE;
165 EXTERN_SERVER_RECVSTATUS
167 Drd64_Server_RecvStatus_Term(
170 Drd64_Server_RecvStatus_FreeRecvStatus_All();
176 EXTERN_SERVER_RECVSTATUS
177 Drd64_Server_RecvStatus *
178 Drd64_Server_RecvStatus_AllocRecvStatus(
183 Drd64_Server_RecvStatus *p_recv;
184 Drd64_Server_RecvStatus *p_temp;
188 /* Check No-Use RecvStatus --- */
189 if( gi_recvalloc_now >= gi_recvalloc_max ) {
190 /* Search No-Use RecvStatus --- */
191 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
192 if( -1 == (gp_recvalloc + i_cnt)->i_recvstatus_id ) {
193 p_recv = (gp_recvalloc + i_cnt);
198 /* Realloc RecvStatus --- */
199 if( NULL == p_recv ) {
201 = Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
203 if( NULL == p_temp ) { return NULL; }
205 gp_recvalloc = p_temp;
206 p_recv = gp_recvalloc + gi_recvalloc_now++;
210 p_recv = gp_recvalloc + gi_recvalloc_now++;
213 /* Set RecvStatus Init. Param ---*/
214 p_recv->i_recvstatus_id = i_fds;
215 p_recv->i_fds_id = i_fds;
216 *(gpp_recvstat + i_fds) = p_recv;
220 if( i_fds + 1 > gi_recvstat_max )
221 { gi_recvstat_max = i_fds + 1; }
227 EXTERN_SERVER_RECVSTATUS
229 Drd64_Server_RecvStatus_FreeRecvStatus(
233 Drd64_Server_RecvStatus *p_recv_now;
234 Drd64_Server_RecvStatus *p_recv_temp;
236 p_recv_now = *(gpp_recvstat + i_fds);
238 if( NULL != p_recv_now ) {
239 *(gpp_recvstat + i_fds) = NULL;
241 if( i_fds + 1 == gi_recvstat_max ) {
242 for( i_cnt = i_fds+1; i_cnt > 0; i_cnt-- ) {
243 p_recv_temp = *(gpp_recvstat + i_cnt);
244 if( NULL != p_recv_temp ) {
245 gi_recvstat_max = i_cnt + 1;
250 if( 0 == i_cnt ) { gi_recvstat_max = 0; }
253 p_recv_now->i_recvstatus_id = -1;
254 p_recv_now->i_fds_id = -1;
261 EXTERN_SERVER_RECVSTATUS
263 Drd64_Server_RecvStatus_PushResumeChain(
269 Drd64_Server_RecvStatus *p_recv_self;
270 Drd64_Server_RecvStatus *p_recv_new;
271 Drd64_Server_RecvStatus *p_recv_before;
275 /* Get Self RecvStatus --- */
276 p_recv_self = *(gpp_recvstat + i_fds);
277 if( NULL == p_recv_self ) {
281 /* Get New RecvStatus --- */
283 = Drd64_Server_RecvStatus_AllocRecvStatus(
284 i_fds, i_alloc_units );
285 if( NULL == p_recv_new ) {
289 /* Push & Chain RecvStatus ---*/
291 if( NULL == gp_recv_resume_start ) {
292 gp_recv_resume_start = p_recv_self;
293 gp_recv_resume_end = p_recv_self;
294 p_recv_self->pv_recv_before = NULL;
295 p_recv_self->pv_recv_next = NULL;
296 i_cnt = gi_recv_resume_max;
300 while(( NULL != *(gpp_recvstat + i_cnt) )
301 && ( i_cnt < gi_recv_resume_max )) { i_cnt++; }
302 assert( NULL == *(gpp_recvstat + i_cnt) );
304 p_recv_before = gp_recv_resume_end;
305 assert( NULL != p_recv_before );
307 p_recv_self->pv_recv_before = (void *)p_recv_before;
308 p_recv_self->pv_recv_next = (void *)p_recv_before->pv_recv_next;
309 p_recv_before->pv_recv_next = (void *)p_recv_self;
310 gp_recv_resume_end = p_recv_self;
315 p_recv_self->i_recvstatus_id = i_cnt;
316 *(gpp_recvstat + p_recv_self->i_recvstatus_id) = p_recv_self;
317 if( gi_recv_resume_max == i_cnt ) {
318 gi_recv_resume_max++;
325 EXTERN_SERVER_RECVSTATUS
327 Drd64_Server_RecvStatus_DeleteResumeChain(
330 Drd64_Server_RecvStatus *p_recv_self;
331 Drd64_Server_RecvStatus *p_recv_before;
332 Drd64_Server_RecvStatus *p_recv_next;
334 p_recv_self = *(gpp_recvstat + i_recv_id);
335 if( NULL == p_recv_self ) {
339 p_recv_before = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_before;
340 p_recv_next = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_next;
342 if( NULL != p_recv_before ) {
343 p_recv_before->pv_recv_next = (void *)p_recv_next;
346 if( NULL != p_recv_next ) {
347 p_recv_next->pv_recv_before = (void *)p_recv_before;
350 if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) ) {
351 gi_recv_resume_max--;
354 if( FD_SETSIZE == gi_recv_resume_max ) {
355 gp_recv_resume_start = NULL;
356 gp_recv_resume_end = NULL;
359 *(gpp_recvstat + i_recv_id) = NULL;
360 p_recv_self->pv_recv_before = NULL;
361 p_recv_self->pv_recv_next = NULL;
363 p_recv_self->i_recvstatus_id = -1;
364 p_recv_self->i_fds_id = -1;
370 EXTERN_SERVER_RECVSTATUS
372 Drd64_Server_RecvStatus_InitRecvStatus(
373 Drd64_Server_RecvStatus *p_recv )
375 assert( NULL != p_recv );
377 p_recv->i_read_phase = DRD64_SERVER_RECVSTATUS_PHASE_HEADER;
378 p_recv->b_recv_status = DRD64_SERVER_RECVSTATUS_STATUS_READ;
379 p_recv->i_remain_bytes = sizeof( Drd64_PacketHeader );
380 p_recv->pv_resume = p_recv->pv_buf;
386 EXTERN_SERVER_RECVSTATUS
387 Drd64_Server_RecvStatus *
388 Drd64_Server_RecvStatus_GetRecvStatus(
391 return *(gpp_recvstat + i_recv_id);
395 EXTERN_SERVER_RECVSTATUS
397 Drd64_Server_RecvStatus_GetSocketID(
400 Drd64_Server_RecvStatus *p_recv;
401 p_recv = *(gpp_recvstat + i_recv_id);
403 if( NULL == p_recv ) { return -1; }
405 return p_recv->i_fds_id;
409 EXTERN_SERVER_RECVSTATUS
411 Drd64_Server_RecvStatus_GetPacketStatus(
414 Drd64_Server_RecvStatus *p_recv;
415 p_recv = *(gpp_recvstat + i_recv_id);
417 if( NULL == p_recv ) { return -1; }
419 return p_recv->b_recv_status;
423 EXTERN_SERVER_RECVSTATUS
425 Drd64_Server_RecvStatus_GetCmdStatus(
428 Drd64_Server_RecvStatus *p_recv;
429 p_recv = *(gpp_recvstat + i_recv_id);
431 if( NULL == p_recv ) { return -1; }
433 return p_recv->i_command_status;
437 EXTERN_SERVER_RECVSTATUS
439 Drd64_Server_RecvStatus_SetCmdStatus(
441 int i_command_status )
443 Drd64_Server_RecvStatus *p_recv;
444 p_recv = *(gpp_recvstat + i_recv_id);
446 if( NULL == p_recv ) { return -1; }
448 p_recv->i_command_status = i_command_status;
450 return p_recv->i_command_status;
454 EXTERN_SERVER_RECVSTATUS
456 Drd64_Server_RecvStatus_GetRecvStatMax(
459 return gi_recvstat_max;
463 EXTERN_SERVER_RECVSTATUS
464 Drd64_Server_RecvStatus *
465 Drd64_Server_RecvStatus_GetResumeStart(
468 return gp_recv_resume_start;
471 /* EOF of drd64_.c ----------------------------------- */