version 1.14, 2000/12/03 22:09:34 |
version 1.22, 2003/02/13 01:29:38 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.13 2000/12/03 21:46:52 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/ox_math/serv1.c,v 1.21 2003/02/12 08:28:41 ohara Exp $ */ |
|
|
/* |
/* |
Copyright (C) Katsuyoshi OHARA, 2000. |
Copyright (C) Katsuyoshi OHARA, 2000. |
|
|
|
|
extern OXFILE *stack_oxfp; |
extern OXFILE *stack_oxfp; |
|
|
/* if in_critical equals to 1 then we do not permit an interrupt. */ |
static int exchange_ox_sync_ball(OXFILE *oxfp) |
static int in_critical = 0; |
|
static int already_send_ox_sync_ball = 0; |
|
static int flag_sigusr1 = 0; |
|
|
|
static int send_ox_sync_ball(); |
|
|
|
static int set_critical() |
|
{ |
{ |
in_critical = 1; |
|
} |
|
|
|
static int unset_critical() |
|
{ |
|
in_critical = 0; |
|
} |
|
|
|
static int critical_p() { |
|
return in_critical; |
|
} |
|
|
|
/* 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; |
|
} |
|
} |
|
} |
|
|
|
static int handler_kill() |
|
{ |
|
oxf_close(stack_oxfp); |
|
exit(1); |
|
} |
|
|
|
static int send_ox_sync_ball() |
|
{ |
|
fprintf(stderr, "sending a sync_ball.\n"); |
|
send_ox_tag(stack_oxfp, OX_SYNC_BALL); |
|
} |
|
|
|
static int exchange_ox_sync_ball() |
|
{ |
|
int tag; |
int tag; |
|
ox_printf("exchanging OX_SYNC_BALL\n"); |
while((tag = receive_ox_tag(stack_oxfp)) != OX_SYNC_BALL) { |
send_ox_tag(oxfp, OX_SYNC_BALL); |
/* skipping a message. */ |
while((tag = receive_ox_tag(oxfp)) != OX_SYNC_BALL) { |
if (tag == OX_DATA) { |
if (tag == OX_DATA) { |
receive_cmo(stack_oxfp); |
receive_cmo(oxfp); |
}else { |
}else if (tag == OX_COMMAND) { |
receive_int32(stack_oxfp); |
receive_int32(oxfp); |
} |
} |
} |
} |
fprintf(stderr, "received a sync_ball.\n"); |
|
} |
} |
|
|
int shutdown() |
int shutdown() |
|
|
exit(0); |
exit(0); |
} |
} |
|
|
#define VERSION 0x11121400 |
/* (Heisei)15/02/01 */ |
#define ID_STRING "2000/11/29" |
#define VERSION 0x15020100 |
|
#define ID_STRING "2003/02/01" |
|
|
int main() |
int main() |
{ |
{ |
OXFILE* sv; |
OXFILE* sv; |
|
|
|
ox_stderr_init(stderr); |
ml_init(); |
ml_init(); |
mathcap_init(VERSION, ID_STRING, "ox_math", NULL, NULL); |
mathcap_init(VERSION, ID_STRING, "ox_math", NULL, NULL); |
|
|
signal(SIGUSR1, handler_reset1); |
|
signal(SIGKILL, handler_kill); |
|
|
|
sv = oxf_open(3); |
sv = oxf_open(3); |
oxf_determine_byteorder_server(sv); |
oxf_determine_byteorder_server(sv); |
sm(sv); |
sm(sv); |
Line 124 int sm_receive_ox() |
|
Line 75 int sm_receive_ox() |
|
break; |
break; |
case OX_COMMAND: |
case OX_COMMAND: |
code = receive_sm_command(stack_oxfp); |
code = receive_sm_command(stack_oxfp); |
set_critical(); |
|
sm_run(code); |
sm_run(code); |
unset_critical(); |
|
break; |
break; |
default: |
default: |
fprintf(stderr, "illeagal message? ox_tag = (%d)\n", tag); |
ox_printf("illeagal OX message(%d)\n", tag); |
return 0; |
|
break; |
break; |
} |
} |
return 1; |
return 1; |
Line 138 int sm_receive_ox() |
|
Line 86 int sm_receive_ox() |
|
|
|
int sm(OXFILE *oxfp) |
int sm(OXFILE *oxfp) |
{ |
{ |
|
int i=0; |
|
fd_set fdmask; |
stack_oxfp = oxfp; |
stack_oxfp = oxfp; |
stack_extend(); |
stack_extend(); |
while(sm_receive_ox()) { |
sm_siginit(); |
if(flag_sigusr1) { |
|
if (!already_send_ox_sync_ball) { |
FD_ZERO(&fdmask); |
send_ox_sync_ball(); |
FD_SET(oxf_fileno(oxfp), &fdmask); |
already_send_ox_sync_ball = 1; |
|
} |
for (i=0; ; i++) { |
exchange_ox_sync_ball(); |
sm_sigunmask(); |
flag_sigusr1 = 0; |
ox_printf("phase%d: select\n",i); |
already_send_ox_sync_ball = 0; |
if (select(5, &fdmask, NULL, NULL, NULL) > 0) { |
|
sm_sigmask(); |
|
ox_printf("phase%d: receiving\n",i); |
|
sm_receive_ox(); |
} |
} |
|
sm_sigmask(); |
|
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(); |
|
} |
} |
} |
fprintf(stderr, "SM: socket(%d) is closed.\n", stack_oxfp->fd); |
ox_printf("ox_math::socket(%d) is closed.\n", stack_oxfp->fd); |
} |
} |