=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/serv1.c,v retrieving revision 1.13 retrieving revision 1.21 diff -u -p -r1.13 -r1.21 --- OpenXM/src/ox_math/serv1.c 2000/12/03 21:46:52 1.13 +++ OpenXM/src/ox_math/serv1.c 2003/02/12 08:28:41 1.21 @@ -1,5 +1,5 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.12 2000/12/03 15:19:23 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.20 2003/01/13 12:04:53 ohara Exp $ */ /* Copyright (C) Katsuyoshi OHARA, 2000. @@ -18,71 +18,44 @@ #include #include "sm.h" -static int send_ox_sync_ball(); - extern OXFILE *stack_oxfp; -static int flag_sigusr1 = 0; -static int flag_sigusr2 = 0; - -/* if in_critical equals to 1 then we do not permit an interrupt. */ -static int in_critical = 0; - -static int set_critical() +static int exchange_ox_sync_ball(OXFILE *oxfp) { - in_critical = 1; -} - -static int unset_critical() -{ - in_critical = 0; -} - -static int critical_p() { - return in_critical; -} - -static int already_send_ox_sync_ball = 0; - -/* SM_control_reset_connection */ -static int handler_reset1() -{ - fprintf(stderr, "signal received.\n"); - signal(SIGUSR1, handler_reset1); - if (!flag_sigusr1) { - flag_sigusr1 = 1; - if(critical_p()) { - send_ox_sync_ball(); - already_send_ox_sync_ball = 1; + int tag; + send_ox_tag(oxfp, OX_SYNC_BALL); + while((tag = receive_ox_tag(oxfp)) != OX_SYNC_BALL) { + if (tag == OX_DATA) { + receive_cmo(oxfp); + }else if (tag == OX_COMMAND) { + receive_int32(oxfp); } } } -static int handler_kill() +int shutdown() { oxf_close(stack_oxfp); - exit(1); + ml_exit(); + exit(0); } -static int send_ox_sync_ball() -{ - fprintf(stderr, "sending a sync_ball.\n"); - send_ox_tag(stack_oxfp, OX_SYNC_BALL); -} +/* (Heisei)15/02/01 */ +#define VERSION 0x15020100 +#define ID_STRING "2003/02/01" -static int exchange_ox_syncball() +int main() { - int tag; + OXFILE* sv; - while((tag = receive_ox_tag(stack_oxfp)) != OX_SYNC_BALL) { - /* skipping a message. */ - if (tag == OX_DATA) { - receive_cmo(stack_oxfp); - }else { - receive_int32(stack_oxfp); - } - } - fprintf(stderr, "received a sync_ball.\n"); + ox_stderr_init(stderr); + ml_init(); + mathcap_init(VERSION, ID_STRING, "ox_math", NULL, NULL); + + sv = oxf_open(3); + oxf_determine_byteorder_server(sv); + sm(sv); + shutdown(); } /* a part of stack machine. */ @@ -101,67 +74,40 @@ int sm_receive_ox() break; case OX_COMMAND: code = receive_sm_command(stack_oxfp); - set_critical(); sm_run(code); - unset_critical(); break; default: - fprintf(stderr, "illeagal message? ox_tag = (%d)\n", tag); - return 0; + ox_printf("illeagal OX message(%d)\n", tag); break; } return 1; } -int shutdown() -{ - oxf_close(stack_oxfp); - ml_exit(); - exit(0); -} - -#define VERSION 0x11121400 -#define ID_STRING "2000/11/29" - -int oxf_error(OXFILE *oxfp) -{ - int e = oxfp->error; - if (e != 0) { - oxfp->error = 0; - } - return e; -} - -int main() -{ - OXFILE* sv; - - ml_init(); - mathcap_init(VERSION, ID_STRING, "ox_math", NULL, NULL); - - signal(SIGUSR1, handler_reset1); - signal(SIGKILL, handler_kill); - - sv = oxf_open(3); - oxf_determine_byteorder_server(sv); - sm(sv); - shutdown(); -} - int sm(OXFILE *oxfp) { + int i=0; + fd_set fdmask; stack_oxfp = oxfp; stack_extend(); - while(sm_receive_ox()) { - if(flag_sigusr1) { - if (!already_send_ox_sync_ball) { - send_ox_sync_ball(); - already_send_ox_sync_ball = 1; - } - exchange_ox_syncball(); - flag_sigusr1 = 0; - already_send_ox_sync_ball = 0; + sm_siginit(); + + FD_ZERO(&fdmask); + FD_SET(oxf_fileno(oxfp), &fdmask); + + while(1) { + ox_printf("phase%d: select\n",i); + if (select(5, &fdmask, NULL, NULL, NULL) > 0) { + sm_sigmask(); + ox_printf("phase%d: receiving\n",i); + sm_receive_ox(); + sm_sigunmask(); /* unmasked. */ } + ox_printf("phase%d: clearing(%d)\n",i,sm_state_interrupting()); + if (sm_state_interrupting()) { + exchange_ox_sync_ball(stack_oxfp); + sm_state_clear_interrupting(); + } + i++; } - fprintf(stderr, "SM: socket(%d) is closed.\n", stack_oxfp->fd); + ox_printf("ox_math::socket(%d) is closed.\n", stack_oxfp->fd); }