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;
49 Drd64_Server_RecvStatus *gp_recv_sockets_start;
50 Drd64_Server_RecvStatus *gp_recv_sockets_end;
54 Drd64_Server_RecvStatus_FreeRecvStatus_All(
59 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
60 free( (gp_recvalloc + i_cnt)->pv_buf );
61 (gp_recvalloc + i_cnt)->pv_buf = NULL;
76 Drd64_Server_RecvStatus *
77 Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
84 Drd64_Server_RecvStatus *p_recvs;
88 if( 0 == gi_recvalloc_max ) {
89 p_recvs = (Drd64_Server_RecvStatus *)malloc(
90 sizeof( Drd64_Server_RecvStatus )
94 i_init_end_id = i_alloc_units;
97 p_recvs = realloc( gp_recvalloc,
98 gi_recvalloc_max + i_alloc_units );
100 i_init_start_id = gi_recvalloc_max;
101 i_init_end_id = gi_recvalloc_max + i_alloc_units;
104 if( NULL == p_recvs ) {
109 for( i_cnt = i_init_start_id; i_cnt < i_init_end_id; i_cnt++ ) {
110 memset( (p_recvs + i_cnt), 0x00,
111 sizeof( Drd64_Server_RecvStatus ) );
112 (p_recvs + i_cnt)->i_recvstatus_id = -1;
113 (p_recvs + i_cnt)->i_fds_id = -1;
115 pv_temp = malloc( DRD64_MAX_PACKET_LENGTH );
116 if( NULL == pv_temp ) { break; }
117 (p_recvs + i_cnt)->pv_buf = pv_temp;
121 if( gi_recvalloc_max == i_init_start_id ) {
125 gp_recvalloc = p_recvs;
130 EXTERN_SERVER_RECVSTATUS
132 Drd64_Server_RecvStatus_Init(
135 Drd64_Server_RecvStatus *p_recvs;
137 /* Alloc RecvStatus Struct Management Area --- */
139 = (Drd64_Server_RecvStatus **)malloc(
140 sizeof( Drd64_Server_RecvStatus *)
141 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE);
142 if( NULL == gpp_recvstat ) { return 0x01; }
144 memset( gpp_recvstat, 0x00,
145 sizeof( Drd64_Server_RecvStatus *)
146 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE );
150 /* Alloc RecvStatus Area ( with Packet Data buffer ) ---*/
151 p_recvs = Drd64_Server_RecvStatus_AllocRecvStatus_Unit( i_alloc_units );
152 if( NULL == p_recvs ) {
153 Drd64_Server_RecvStatus_FreeRecvStatus_All();
157 gp_recvalloc = p_recvs;
158 gi_recvalloc_now = 0;
160 gp_recv_resume_start = NULL;
161 gi_recv_resume_max = FD_SETSIZE;
163 gp_recv_sockets_start = NULL;
164 gp_recv_sockets_end = NULL;
170 EXTERN_SERVER_RECVSTATUS
172 Drd64_Server_RecvStatus_Term(
175 Drd64_Server_RecvStatus_FreeRecvStatus_All();
181 EXTERN_SERVER_RECVSTATUS
182 Drd64_Server_RecvStatus *
183 Drd64_Server_RecvStatus_AllocRecvStatus(
188 Drd64_Server_RecvStatus *p_recv;
189 Drd64_Server_RecvStatus *p_temp;
193 /* Check No-Use RecvStatus --- */
194 if( gi_recvalloc_now >= gi_recvalloc_max ) {
195 /* Search No-Use RecvStatus --- */
196 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
197 if( -1 == (gp_recvalloc + i_cnt)->i_recvstatus_id ) {
198 p_recv = (gp_recvalloc + i_cnt);
203 /* Realloc RecvStatus --- */
204 if( NULL == p_recv ) {
206 = Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
208 if( NULL == p_temp ) { return NULL; }
210 gp_recvalloc = p_temp;
211 p_recv = gp_recvalloc + gi_recvalloc_now++;
215 p_recv = gp_recvalloc + gi_recvalloc_now++;
218 /* Set RecvStatus Init. Param ---*/
219 p_recv->i_recvstatus_id = i_fds;
220 p_recv->i_fds_id = i_fds;
221 *(gpp_recvstat + i_fds) = p_recv;
225 if( i_fds + 1 > gi_recvstat_max )
226 { gi_recvstat_max = i_fds + 1; }
233 Drd64_Server_RecvStatus_FreeRecvStatus(
234 Drd64_Server_RecvStatus *p_recv )
236 assert( NULL != p_recv );
238 p_recv->pv_recv_before = NULL;
239 p_recv->pv_recv_next = NULL;
241 p_recv->i_recvstatus_id = -1;
242 p_recv->i_fds_id = -1;
248 EXTERN_SERVER_RECVSTATUS
250 Drd64_Server_RecvStatus_CloseRecvStatus(
254 Drd64_Server_RecvStatus *p_recv_now;
255 Drd64_Server_RecvStatus *p_recv_temp;
257 p_recv_now = *(gpp_recvstat + i_fds);
259 if( NULL != p_recv_now ) {
260 *(gpp_recvstat + i_fds) = NULL;
262 if( i_fds + 1 == gi_recvstat_max ) {
263 for( i_cnt = i_fds+1; i_cnt > 0; i_cnt-- ) {
264 p_recv_temp = *(gpp_recvstat + i_cnt);
265 if( NULL != p_recv_temp ) {
266 gi_recvstat_max = i_cnt + 1;
271 if( 0 == i_cnt ) { gi_recvstat_max = 0; }
274 Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_now );
281 EXTERN_SERVER_RECVSTATUS
283 Drd64_Server_RecvStatus_PushResumeChain(
289 Drd64_Server_RecvStatus *p_recv_self;
290 Drd64_Server_RecvStatus *p_recv_new;
291 Drd64_Server_RecvStatus *p_recv_before;
295 /* Get Self RecvStatus --- */
296 p_recv_self = *(gpp_recvstat + i_fds);
297 if( NULL == p_recv_self ) {
301 /* Get New RecvStatus --- */
303 = Drd64_Server_RecvStatus_AllocRecvStatus(
304 i_fds, i_alloc_units );
305 if( NULL == p_recv_new ) {
309 /* Push & Chain RecvStatus ---*/
311 if( NULL == gp_recv_resume_start ) {
312 gp_recv_resume_start = p_recv_self;
313 gp_recv_resume_end = p_recv_self;
314 p_recv_self->pv_recv_before = NULL;
315 p_recv_self->pv_recv_next = NULL;
316 i_cnt = gi_recv_resume_max;
320 while(( NULL != *(gpp_recvstat + i_cnt) )
321 && ( i_cnt < gi_recv_resume_max )) { i_cnt++; }
322 assert( NULL == *(gpp_recvstat + i_cnt) );
324 p_recv_before = gp_recv_resume_end;
325 assert( NULL != p_recv_before );
327 p_recv_self->pv_recv_before = (void *)p_recv_before;
328 p_recv_self->pv_recv_next = (void *)p_recv_before->pv_recv_next;
329 p_recv_before->pv_recv_next = (void *)p_recv_self;
330 gp_recv_resume_end = p_recv_self;
335 p_recv_self->i_recvstatus_id = i_cnt;
336 *(gpp_recvstat + p_recv_self->i_recvstatus_id) = p_recv_self;
337 if( gi_recv_resume_max == i_cnt ) {
338 gi_recv_resume_max++;
340 printf(" Push: %d\n", i_cnt );
346 EXTERN_SERVER_RECVSTATUS
348 Drd64_Server_RecvStatus_DeleteResumeChain(
351 Drd64_Server_RecvStatus *p_recv_self;
352 Drd64_Server_RecvStatus *p_recv_before;
353 Drd64_Server_RecvStatus *p_recv_next;
356 p_recv_self = *(gpp_recvstat + i_recv_id);
357 if( NULL == p_recv_self ) {
361 p_recv_before = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_before;
362 p_recv_next = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_next;
364 if( NULL != p_recv_before ) {
365 p_recv_before->pv_recv_next = (void *)p_recv_next;
368 if( NULL != p_recv_next ) {
369 p_recv_next->pv_recv_before = (void *)p_recv_before;
372 if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) ) {
373 gi_recv_resume_max--;
376 if( FD_SETSIZE == gi_recv_resume_max ) {
377 gp_recv_resume_start = NULL;
378 gp_recv_resume_end = NULL;
381 *(gpp_recvstat + i_recv_id) = NULL;
383 printf(" delete: %d (before=%p, next=%p)\n", i_recv_id, p_recv_before, p_recv_next );
385 Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_self );
391 EXTERN_SERVER_RECVSTATUS
393 Drd64_Server_RecvStatus_AddSocketsChain(
394 Drd64_Server_RecvStatus *p_recv )
396 Drd64_Server_RecvStatus *p_before;
398 if( NULL == p_recv ) { return 0x01; }
400 p_before = gp_recv_sockets_end;
402 p_recv->pv_recv_before = (void *)p_before;
403 if( NULL != p_before )
404 { p_before->pv_recv_next = (void *)p_recv; }
406 { gp_recv_sockets_start = p_recv; }
408 gp_recv_sockets_end = p_recv;
414 EXTERN_SERVER_RECVSTATUS
416 Drd64_Server_RecvStatus_DeleteSocketsChain(
417 Drd64_Server_RecvStatus *p_recv )
419 Drd64_Server_RecvStatus *p_before;
420 Drd64_Server_RecvStatus *p_next;
422 if( NULL == p_recv ) { return -1; }
424 p_before = (Drd64_Server_RecvStatus *)p_recv->pv_recv_before;
425 p_next = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
427 if( NULL != p_before )
428 { p_before->pv_recv_next = (void *)p_next; }
430 { p_next->pv_recv_before = (void *)p_before; }
432 if( p_recv == gp_recv_sockets_start )
433 { gp_recv_sockets_start = p_next; }
434 if( p_recv == gp_recv_sockets_end )
435 { gp_recv_sockets_end = p_before; }
437 p_recv->pv_recv_next = NULL;
438 p_recv->pv_recv_before = NULL;
444 EXTERN_SERVER_RECVSTATUS
446 Drd64_Server_RecvStatus_InitRecvStatus(
447 Drd64_Server_RecvStatus *p_recv,
450 assert( NULL != p_recv );
452 p_recv->i_read_phase = DRD64_SERVER_RECVSTATUS_PHASE_HEADER;
453 p_recv->b_recv_status = DRD64_SERVER_RECVSTATUS_STATUS_READ;
454 p_recv->i_remain_bytes = sizeof( Drd64_PacketHeader );
455 p_recv->pv_resume = p_recv->pv_buf;
456 p_recv->pv_recv_before = NULL;
457 p_recv->pv_recv_next = NULL;
458 p_recv->i_fds_id = i_socket;
464 EXTERN_SERVER_RECVSTATUS
465 Drd64_Server_RecvStatus *
466 Drd64_Server_RecvStatus_GetRecvStatus(
469 return *(gpp_recvstat + i_recv_id);
473 EXTERN_SERVER_RECVSTATUS
475 Drd64_Server_RecvStatus_GetSocketID(
478 Drd64_Server_RecvStatus *p_recv;
479 p_recv = *(gpp_recvstat + i_recv_id);
481 if( NULL == p_recv ) { return -1; }
483 return p_recv->i_fds_id;
487 EXTERN_SERVER_RECVSTATUS
489 Drd64_Server_RecvStatus_GetPacketStatus(
492 Drd64_Server_RecvStatus *p_recv;
493 p_recv = *(gpp_recvstat + i_recv_id);
495 if( NULL == p_recv ) { return -1; }
497 return p_recv->b_recv_status;
501 EXTERN_SERVER_RECVSTATUS
503 Drd64_Server_RecvStatus_GetCmdStatus(
506 Drd64_Server_RecvStatus *p_recv;
507 p_recv = *(gpp_recvstat + i_recv_id);
509 if( NULL == p_recv ) { return -1; }
511 return p_recv->i_command_status;
515 EXTERN_SERVER_RECVSTATUS
517 Drd64_Server_RecvStatus_SetCmdStatus(
519 int i_command_status )
521 Drd64_Server_RecvStatus *p_recv;
522 p_recv = *(gpp_recvstat + i_recv_id);
524 if( NULL == p_recv ) { return -1; }
526 p_recv->i_command_status = i_command_status;
528 return p_recv->i_command_status;
532 EXTERN_SERVER_RECVSTATUS
534 Drd64_Server_RecvStatus_GetRecvStatMax(
537 return gi_recvstat_max;
541 EXTERN_SERVER_RECVSTATUS
542 Drd64_Server_RecvStatus *
543 Drd64_Server_RecvStatus_GetResumeChainStart(
546 return gp_recv_resume_start;
550 EXTERN_SERVER_RECVSTATUS
551 Drd64_Server_RecvStatus *
552 Drd64_Server_RecvStatus_GetSocketsChainStart(
555 return gp_recv_sockets_start;
559 /* EOF of drd64_.c ----------------------------------- */