=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/serv1.c,v retrieving revision 1.6 retrieving revision 1.18 diff -u -p -r1.6 -r1.18 --- OpenXM/src/ox_math/serv1.c 1999/11/29 12:09:58 1.6 +++ OpenXM/src/ox_math/serv1.c 2002/04/11 19:53:40 1.18 @@ -1,139 +1,117 @@ /* -*- mode: C; coding: euc-japan -*- */ -/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.5 1999/11/18 22:07:50 ohara Exp $ */ +/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.17 2002/04/11 14:13:37 ohara Exp $ */ +/* + Copyright (C) Katsuyoshi OHARA, 2000. + Portions copyright 1999 Wolfram Research, Inc. + + You must see OpenXM/Copyright/Copyright.generic. + The MathLink Library is licensed from Wolfram Research Inc.. + See OpenXM/Copyright/Copyright.mathlink for detail. +*/ + #include #include #include #include -#include #include -#include "ox.h" -#include "serv2.h" +#include +#include "sm.h" -static int send_ox_sync_ball(int fd); +extern OXFILE *stack_oxfp; -static int sv_read = 3; -static int sv_write = 4; - -static int flag_sigusr1 = 0; -static int flag_sigusr2 = 0; - -/* 1 のとき割り込み禁止 */ -static int in_critical = 0; - -static int set_critical() +/* SM_control_reset_connection */ +static void handler() { - in_critical = 1; + sigset_t newmask, oldmask; + sigemptyset(&newmask); + sigaddset(&newmask, SIGUSR1); + sigprocmask(SIG_SETMASK, &newmask, &oldmask); + fprintf(stderr, "signal received.\n"); + exchange_ox_sync_ball(stack_oxfp); + sigprocmask(SIG_SETMASK, &oldmask, NULL); /* unmasked. */ } -static int unset_critical() +static int exchange_ox_sync_ball(OXFILE *oxfp) { - 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(sv_write); - 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() { - close(3); - close(4); - exit(1); + oxf_close(stack_oxfp); + ml_exit(); + exit(0); } -static int send_ox_sync_ball(int fd) -{ - fprintf(stderr, "sending a sync_ball.\n"); - send_ox_tag(fd, OX_SYNC_BALL); -} +#define VERSION 0x11121400 +#define ID_STRING "2000/11/29" -static int exchange_ox_syncball(int fd) +int main() { - int tag; + OXFILE* sv; - while((tag = receive_ox_tag(fd)) != OX_SYNC_BALL) { - /* skipping a message. */ - if (tag == OX_DATA) { - receive_cmo(fd); - }else { - receive_int32(fd); - } - } - fprintf(stderr, "received a sync_ball.\n"); + ml_init(); + mathcap_init(VERSION, ID_STRING, "ox_math", NULL, NULL); + + sv = oxf_open(3); + oxf_determine_byteorder_server(sv); + sm(sv); + shutdown(); } -/* スタックマシン部分 */ -int receive_ox(int fd_read, int fd_write) +/* a part of stack machine. */ +int sm_receive_ox() { int tag; int code; - tag = receive_ox_tag(fd_read); + tag = receive_ox_tag(stack_oxfp); + if (oxf_error(stack_oxfp)) { + return 0; + } switch(tag) { case OX_DATA: - push(receive_cmo(fd_read)); + push(receive_cmo(stack_oxfp)); break; case OX_COMMAND: - code = receive_sm_command(fd_read); - set_critical(); - execute_sm_command(fd_write, code); - unset_critical(); + code = receive_sm_command(stack_oxfp); + sm_run(code); break; default: fprintf(stderr, "illeagal message? ox_tag = (%d)\n", tag); - return -1; break; } - return 0; + return 1; } -int shutdown() +int sm(OXFILE *oxfp) { - close(sv_read); - close(sv_write); - ml_exit(); - exit(0); -} + fd_set fdmask; + stack_oxfp = oxfp; + stack_extend(); + signal(SIGUSR1, handler); -int main() -{ - ml_init(); - initialize_stack(); + FD_ZERO(&fdmask); + FD_SET(oxf_fileno(oxfp), &fdmask); - signal(SIGUSR1, handler_reset1); - signal(SIGKILL, handler_kill); - - /* バイトオーダの決定 */ - decideByteOrderServer(sv_read, 0); - while(1) { - receive_ox(sv_read, sv_write); - if(flag_sigusr1) { - if (!already_send_ox_sync_ball) { - send_ox_sync_ball(sv_write); - already_send_ox_sync_ball = 1; - } - exchange_ox_syncball(sv_read); - flag_sigusr1 = 0; - already_send_ox_sync_ball = 0; + if (select(5, &fdmask, NULL, NULL, NULL) > 0) { + sigset_t newmask, oldmask; + sigemptyset(&newmask); + sigaddset(&newmask, SIGUSR1); + sigprocmask(SIG_SETMASK, &newmask, &oldmask); + sm_receive_ox(); + sigprocmask(SIG_SETMASK, &oldmask, NULL); /* unmasked. */ } } - shutdown(); + fprintf(stderr, "SM: socket(%d) is closed.\n", stack_oxfp->fd); }