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;
334 p_recv_self->i_recvstatus_id = i_cnt;
335 *(gpp_recvstat + p_recv_self->i_recvstatus_id) = p_recv_self;
336 if( gi_recv_resume_max == i_cnt ) {
337 gi_recv_resume_max++;
344 EXTERN_SERVER_RECVSTATUS
346 Drd64_Server_RecvStatus_DeleteResumeChain(
349 Drd64_Server_RecvStatus *p_recv_self;
350 Drd64_Server_RecvStatus *p_recv_before;
351 Drd64_Server_RecvStatus *p_recv_next;
354 p_recv_self = *(gpp_recvstat + i_recv_id);
355 if( NULL == p_recv_self ) {
359 p_recv_before = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_before;
360 p_recv_next = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_next;
362 if( NULL != p_recv_before ) {
363 p_recv_before->pv_recv_next = (void *)p_recv_next;
366 if( NULL != p_recv_next ) {
367 p_recv_next->pv_recv_before = (void *)p_recv_before;
370 if( gp_recv_resume_end == p_recv_self ) {
371 gp_recv_resume_end = p_recv_before;
374 if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) ) {
375 gi_recv_resume_max--;
378 if( FD_SETSIZE == gi_recv_resume_max ) {
379 gp_recv_resume_start = NULL;
380 gp_recv_resume_end = NULL;
383 *(gpp_recvstat + i_recv_id) = NULL;
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_command_status = DRD64_SERVER_CMDSTATUS_STATUS_NORMAL;
455 p_recv->i_remain_bytes = sizeof( Drd64_PacketHeader );
456 p_recv->pv_resume = p_recv->pv_buf;
457 p_recv->pv_recv_before = NULL;
458 p_recv->pv_recv_next = NULL;
459 p_recv->pv_cinfo_connection = NULL;
460 p_recv->i_fds_id = i_socket;
466 EXTERN_SERVER_RECVSTATUS
468 Drd64_Server_RecvStatus_SetConnectionInfoPointer(
469 Drd64_Server_RecvStatus *p_recv_now,
473 Drd64_Server_RecvStatus *p_recv_socket;
475 assert( NULL != p_recv_now );
476 printf( "SetPnt: %d > %d\n", p_recv_now->i_recvstatus_id, p_recv_now->i_fds_id );
478 p_recv_now->pv_cinfo_connection = pv_cinfo;
480 p_recv_socket = *(gpp_recvstat + p_recv_now->i_fds_id);
481 if( NULL != p_recv_socket ) {
482 assert( NULL == p_recv_socket->pv_cinfo_connection );
483 p_recv_socket->pv_cinfo_connection = pv_cinfo;
490 EXTERN_SERVER_RECVSTATUS
491 Drd64_Server_RecvStatus *
492 Drd64_Server_RecvStatus_GetRecvStatus(
495 return *(gpp_recvstat + i_recv_id);
499 EXTERN_SERVER_RECVSTATUS
501 Drd64_Server_RecvStatus_GetSocketID(
504 Drd64_Server_RecvStatus *p_recv;
505 p_recv = *(gpp_recvstat + i_recv_id);
507 if( NULL == p_recv ) { return -1; }
509 return p_recv->i_fds_id;
513 EXTERN_SERVER_RECVSTATUS
515 Drd64_Server_RecvStatus_GetPacketStatus(
518 Drd64_Server_RecvStatus *p_recv;
519 p_recv = *(gpp_recvstat + i_recv_id);
521 if( NULL == p_recv ) { return -1; }
523 return p_recv->b_recv_status;
527 EXTERN_SERVER_RECVSTATUS
529 Drd64_Server_RecvStatus_GetCmdStatus(
532 Drd64_Server_RecvStatus *p_recv;
533 p_recv = *(gpp_recvstat + i_recv_id);
535 if( NULL == p_recv ) { return -1; }
537 return p_recv->i_command_status;
541 EXTERN_SERVER_RECVSTATUS
543 Drd64_Server_RecvStatus_SetCmdStatus(
545 int i_command_status )
547 Drd64_Server_RecvStatus *p_recv;
548 p_recv = *(gpp_recvstat + i_recv_id);
550 if( NULL == p_recv ) { return -1; }
552 p_recv->i_command_status = i_command_status;
554 return p_recv->i_command_status;
558 EXTERN_SERVER_RECVSTATUS
560 Drd64_Server_RecvStatus_GetRecvStatMax(
563 return gi_recvstat_max;
567 EXTERN_SERVER_RECVSTATUS
568 Drd64_Server_RecvStatus *
569 Drd64_Server_RecvStatus_GetResumeChainStart(
572 return gp_recv_resume_start;
576 EXTERN_SERVER_RECVSTATUS
577 Drd64_Server_RecvStatus *
578 Drd64_Server_RecvStatus_GetSocketsChainStart(
581 return gp_recv_sockets_start;
585 /* EOF of drd64_.c ----------------------------------- */