=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/ox_asir.c,v retrieving revision 1.11 retrieving revision 1.14 diff -u -p -r1.11 -r1.14 --- OpenXM_contrib2/asir2000/io/ox_asir.c 2000/03/16 04:55:21 1.11 +++ OpenXM_contrib2/asir2000/io/ox_asir.c 2000/07/13 05:09:02 1.14 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/io/ox_asir.c,v 1.10 2000/03/16 01:07:00 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/io/ox_asir.c,v 1.13 2000/03/19 12:35:20 noro Exp $ */ #include "ca.h" #include "parse.h" #include "signal.h" @@ -9,7 +9,7 @@ #endif void ox_usr1_handler(); -void asir_ox_init(); +int asir_ox_init(); extern jmp_buf environnement; @@ -42,28 +42,37 @@ static void asir_popString(); static void asir_popCMO(unsigned int); static void asir_popSerializedLocalObject(); static LIST asir_GetErrorList(); -static char *name_of_cmd(unsigned int); +static char *name_of_cmd(int); static char *name_of_id(int); -static void asir_do_cmd(unsigned int,unsigned int); +static void asir_do_cmd(int,unsigned int); #if MPI +/* XXX : currently MPI version supports only a homogeneous cluster. */ + extern int mpi_nprocs,mpi_myid; void ox_mpi_master_init() { - int i,idx,ret; + int i,idx; - for ( i = 1; i < mpi_nprocs; i++ ) { - /* client mode */ + for ( i = 0; i < mpi_nprocs; i++ ) { + /* ordering information is not exchanged */ + /* idx should be equal to i */ idx = get_iofp(i,0,0); - ret = register_server(0,idx,idx); + register_server(0,idx,idx); } } void ox_mpi_slave_init() { + int i,idx; + endian_init(); - /* server mode */ - get_iofp(0,0,1); fclose(stdin); + for ( i = 0; i < mpi_nprocs; i++ ) { + /* ordering information is not exchanged */ + /* idx should be equal to i */ + idx = get_iofp(i,0,0); + register_server(0,idx,idx); + } asir_OperandStackSize = BUFSIZ; asir_OperandStack = (Obj *)CALLOC(asir_OperandStackSize,sizeof(Obj)); asir_OperandStackPtr = -1; @@ -90,7 +99,7 @@ static void create_error(ERR *err,unsigned int serial, void ox_main(int argc,char **argv) { int id; - unsigned int cmd; + int cmd; Obj obj; USINT ui; ERR err; @@ -160,7 +169,7 @@ void ox_main(int argc,char **argv) { } } -static void asir_do_cmd(unsigned int cmd,unsigned int serial) +static void asir_do_cmd(int cmd,unsigned int serial) { MATHCAP client_mathcap; Q q; @@ -242,7 +251,7 @@ static char *name_of_id(int id) } } -static char *name_of_cmd(unsigned cmd) +static char *name_of_cmd(int cmd) { switch ( cmd ) { case SM_popSerializedLocalObject: @@ -675,6 +684,8 @@ static void ox_io_init() { write_char(iofp[0].out,&c); ox_flush_stream_force(0); read_char(iofp[0].in,&rc); iofp[0].conv = c == rc ? 0 : 1; + /* XXX; for raw I/O */ + register_server(0,0,0); } /* @@ -725,19 +736,24 @@ int asir_ox_pop_cmo(void *cmo, int limit) * Executes an SM command. */ -void asir_ox_push_cmd(unsigned int cmd) +void asir_ox_push_cmd(int cmd) { int ret; ERR err; extern char LastError[]; if ( ret = setjmp(env) ) { + asir_reset_handler(); if ( ret == 1 ) { create_error(&err,0,LastError); /* XXX */ asir_push_one((Obj)err); } - } else + } else { + asir_save_handler(); + asir_set_handler(); asir_do_cmd(cmd,0); + asir_reset_handler(); + } } /* @@ -754,12 +770,17 @@ void asir_ox_execute_string(char *s) MKSTR(str,s); asir_push_one((Obj)str); if ( ret = setjmp(env) ) { + asir_reset_handler(); if ( ret == 1 ) { create_error(&err,0,LastError); /* XXX */ asir_push_one((Obj)err); } - } else + } else { + asir_save_handler(); + asir_set_handler(); asir_executeString(); + asir_reset_handler(); + } } /* @@ -788,7 +809,7 @@ int asir_ox_peek_cmo_size() * =1 => network byte order */ -void asir_ox_init(int byteorder) +int asir_ox_init(int byteorder) { int tmp; char ifname[BUFSIZ]; @@ -862,4 +883,6 @@ void asir_ox_init(int byteorder) lib_ox_need_conv = 0; do_message = 0; create_my_mathcap("ox_asir"); + asir_reset_handler(); + return 0; }