Return to tcpf.c CVS log | Up to [local] / OpenXM_contrib2 / asir2000 / io |
version 1.5, 2000/01/11 06:43:36 | version 1.8, 2000/07/13 05:09:03 | ||
---|---|---|---|
|
|
||
/* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf.c,v 1.4 1999/12/24 06:57:22 noro Exp $ */ | /* $OpenXM: OpenXM_contrib2/asir2000/io/tcpf.c,v 1.7 2000/03/19 12:35:20 noro Exp $ */ | ||
#if INET | #if INET | ||
#include "ca.h" | #include "ca.h" | ||
#include "parse.h" | #include "parse.h" | ||
|
|
||
#if MPI | #if MPI | ||
extern int mpi_nprocs; | extern int mpi_nprocs; | ||
#define valid_mctab_index(ind)\ | #define valid_mctab_index(ind)\ | ||
if((ind)<0||(ind)>=(mpi_nprocs-1)){error("invalid server id");} | if((ind)<0||(ind)>=mpi_nprocs){error("invalid server id");} | ||
#else | #else | ||
#define valid_mctab_index(ind)\ | #define valid_mctab_index(ind)\ | ||
if((ind)<0||(ind)>=m_c_i||\ | if((ind)<0||(ind)>=m_c_i||\ | ||
(!m_c_tab[ind].m&&!m_c_tab[ind].c)){error("invalid server id");} | ((m_c_tab[ind].m<0)&&(m_c_tab[ind].c<0))){error("invalid server id");} | ||
#endif | #endif | ||
int register_server(); | int register_server(); | ||
int get_mcindex(int); | int get_mcindex(int); | ||
void Pox_send_raw_cmo(), Pox_recv_raw_cmo(); | |||
void Pox_launch(),Pox_launch_nox(),Pox_launch_main(); | void Pox_launch(),Pox_launch_nox(),Pox_launch_main(); | ||
void Pox_launch_generic(); | void Pox_launch_generic(); | ||
void Pox_shutdown(); | void Pox_shutdown(); | ||
|
|
||
void Pgenerate_port(),Ptry_bind_listen(),Ptry_connect(),Ptry_accept(); | void Pgenerate_port(),Ptry_bind_listen(),Ptry_connect(),Ptry_accept(); | ||
void Pregister_server(); | void Pregister_server(); | ||
void Pox_get_serverinfo(); | void Pox_get_serverinfo(); | ||
void Pox_mpi_myid(), Pox_mpi_nprocs(); | |||
void ox_launch_generic(); | void ox_launch_generic(); | ||
pointer bevalf(); | pointer bevalf(); | ||
struct ftab tcp_tab[] = { | struct ftab tcp_tab[] = { | ||
{"ox_send_raw_cmo",Pox_send_raw_cmo,2}, | |||
{"ox_recv_raw_cmo",Pox_recv_raw_cmo,1}, | |||
{"ox_get_serverinfo",Pox_get_serverinfo,-1}, | {"ox_get_serverinfo",Pox_get_serverinfo,-1}, | ||
{"generate_port",Pgenerate_port,-1}, | {"generate_port",Pgenerate_port,-1}, | ||
{"try_bind_listen",Ptry_bind_listen,1}, | {"try_bind_listen",Ptry_bind_listen,1}, | ||
|
|
||
{"ox_cmo_rpc",Pox_cmo_rpc,-99999999}, | {"ox_cmo_rpc",Pox_cmo_rpc,-99999999}, | ||
{"ox_sync",Pox_sync,1}, | {"ox_sync",Pox_sync,1}, | ||
#if MPI | |||
{"ox_mpi_myid",Pox_mpi_myid,0}, | |||
{"ox_mpi_nprocs",Pox_mpi_nprocs,0}, | |||
#endif | |||
#if !MPI | #if !MPI | ||
{"ox_reset",Pox_reset,-2}, | {"ox_reset",Pox_reset,-2}, | ||
{"ox_intr",Pox_intr,1}, | {"ox_intr",Pox_intr,1}, | ||
|
|
||
extern struct IOFP iofp[]; | extern struct IOFP iofp[]; | ||
extern MATHCAP my_mathcap; | extern MATHCAP my_mathcap; | ||
extern int ox_exchange_mathcap; | |||
char *getenv(); | char *getenv(); | ||
#if MPI | |||
extern int mpi_myid, mpi_nprocs; | |||
void Pox_mpi_myid(rp) | |||
Q *rp; | |||
{ | |||
STOQ(mpi_myid,*rp); | |||
} | |||
void Pox_mpi_nprocs(rp) | |||
Q *rp; | |||
{ | |||
STOQ(mpi_nprocs,*rp); | |||
} | |||
#endif | |||
void Pox_get_serverinfo(arg,rp) | void Pox_get_serverinfo(arg,rp) | ||
NODE arg; | NODE arg; | ||
LIST *rp; | LIST *rp; | ||
|
|
||
if ( !arg ) { | if ( !arg ) { | ||
for ( i = 0, n0 = 0; i < m_c_i; i++ ) | for ( i = 0, n0 = 0; i < m_c_i; i++ ) | ||
if ( m_c_tab[i].m || m_c_tab[i].c ) { | if ( (m_c_tab[i].m>=0) || (m_c_tab[i].c>=0) ) { | ||
c = m_c_tab[i].c; | c = m_c_tab[i].c; | ||
ox_get_serverinfo(c,&list); | ox_get_serverinfo(c,&list); | ||
STOQ(i,sid); | STOQ(i,sid); | ||
|
|
||
MKLIST(*rp,n0); | MKLIST(*rp,n0); | ||
} else { | } else { | ||
i = QTOS((Q)ARG0(arg)); | i = QTOS((Q)ARG0(arg)); | ||
if ( i >= 0 && i < m_c_i && (m_c_tab[i].m || m_c_tab[i].c) ) | if ( i >= 0 && i < m_c_i && ((m_c_tab[i].m>=0) || (m_c_tab[i].c>=0)) ) | ||
ox_get_serverinfo(m_c_tab[i].c,rp); | ox_get_serverinfo(m_c_tab[i].c,rp); | ||
else { | else { | ||
MKLIST(*rp,0); | MKLIST(*rp,0); | ||
|
|
||
/* register server to the server list */ | /* register server to the server list */ | ||
ind = register_server(use_unix,cn,sn); | ind = register_server(use_unix,cn,sn); | ||
/* request remote mathcap */ | if ( ox_exchange_mathcap ) { | ||
ox_send_cmd(sn,SM_mathcap); | /* request remote mathcap */ | ||
ox_send_cmd(sn,SM_popCMO); | ox_send_cmd(sn,SM_mathcap); | ||
ox_flush_stream_force(sn); | ox_send_cmd(sn,SM_popCMO); | ||
ox_recv(sn,&id,&server_mathcap); | ox_flush_stream_force(sn); | ||
store_remote_mathcap(sn,server_mathcap); | ox_recv(sn,&id,&server_mathcap); | ||
store_remote_mathcap(sn,server_mathcap); | |||
/* send my mathcap */ | |||
create_my_mathcap("asir"); | /* send my mathcap */ | ||
ox_send_data(sn,my_mathcap); | create_my_mathcap("asir"); | ||
ox_send_cmd(sn,SM_setMathcap); | ox_send_data(sn,my_mathcap); | ||
ox_send_cmd(sn,SM_setMathcap); | |||
} | |||
/* return the server id */ | /* return the server id */ | ||
STOQ(ind,*rp); | STOQ(ind,*rp); | ||
} | } | ||
|
|
||
/* register server to the server list */ | /* register server to the server list */ | ||
ind = register_server(use_unix,cn,sn); | ind = register_server(use_unix,cn,sn); | ||
/* request remote mathcap */ | if ( ox_exchange_mathcap ) { | ||
ox_send_cmd(sn,SM_mathcap); | /* request remote mathcap */ | ||
ox_send_cmd(sn,SM_popCMO); | ox_send_cmd(sn,SM_mathcap); | ||
ox_flush_stream_force(sn); | ox_send_cmd(sn,SM_popCMO); | ||
ox_recv(sn,&id,&server_mathcap); | ox_flush_stream_force(sn); | ||
store_remote_mathcap(sn,server_mathcap); | ox_recv(sn,&id,&server_mathcap); | ||
store_remote_mathcap(sn,server_mathcap); | |||
/* send my mathcap */ | |||
create_my_mathcap("asir"); | /* send my mathcap */ | ||
ox_send_data(sn,my_mathcap); | create_my_mathcap("asir"); | ||
ox_send_cmd(sn,SM_setMathcap); | ox_send_data(sn,my_mathcap); | ||
ox_send_cmd(sn,SM_setMathcap); | |||
} | |||
/* return the server id */ | /* return the server id */ | ||
STOQ(ind,*rp); | STOQ(ind,*rp); | ||
} | } | ||
|
|
||
return -1; | return -1; | ||
if ( !m_c_tab ) { | if ( !m_c_tab ) { | ||
s = BUFSIZ*sizeof(struct m_c); | s = BUFSIZ*sizeof(struct m_c); | ||
m_c_tab = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s); | m_c_tab = (struct m_c *)MALLOC_ATOMIC(s); | ||
for ( i = 0; i < BUFSIZ; i++ ) { | |||
m_c_tab[i].af_unix = 0; | |||
m_c_tab[i].m = m_c_tab[i].c = -1; | |||
} | |||
m_c_s = BUFSIZ; | m_c_s = BUFSIZ; | ||
} | } | ||
#if !MPI | #if !MPI | ||
for ( i = 0; i < m_c_i; i++ ) | for ( i = 0; i < m_c_i; i++ ) | ||
if ( !m_c_tab[i].m && !m_c_tab[i].c ) | if ( (m_c_tab[i].m<0) && (m_c_tab[i].c<0) ) | ||
break; | break; | ||
if ( i < m_c_i ) { | if ( i < m_c_i ) { | ||
m_c_tab[i].m = m; m_c_tab[i].c = c; | m_c_tab[i].m = m; m_c_tab[i].c = c; | ||
|
|
||
s = (m_c_s+BUFSIZ)*sizeof(struct m_c); | s = (m_c_s+BUFSIZ)*sizeof(struct m_c); | ||
t = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s); | t = (struct m_c *)MALLOC_ATOMIC(s); bzero(m_c_tab,s); | ||
bcopy(m_c_tab,t,m_c_s*sizeof(struct m_c)); | bcopy(m_c_tab,t,m_c_s*sizeof(struct m_c)); | ||
for ( i = 0; i < BUFSIZ; i++ ) { | |||
m_c_tab[m_c_s+i].af_unix = 0; | |||
m_c_tab[m_c_s+i].m = m_c_tab[m_c_s+i].c = -1; | |||
} | |||
m_c_s += BUFSIZ; m_c_tab = t; | m_c_s += BUFSIZ; m_c_tab = t; | ||
} | } | ||
m_c_tab[m_c_i].m = m; m_c_tab[m_c_i].c = c; | m_c_tab[m_c_i].m = m; m_c_tab[m_c_i].c = c; | ||
|
|
||
*rp = ONE; | *rp = ONE; | ||
} | } | ||
void Pox_send_raw_cmo(arg,rp) | |||
NODE arg; | |||
Obj *rp; | |||
{ | |||
int s; | |||
int index = QTOS((Q)ARG0(arg)); | |||
valid_mctab_index(index); | |||
s = m_c_tab[index].c; | |||
ox_write_cmo(s,(Obj)ARG1(arg)); | |||
/* flush always */ | |||
ox_flush_stream(s); | |||
*rp = 0; | |||
} | |||
void Pox_recv_raw_cmo(arg,rp) | |||
NODE arg; | |||
Obj *rp; | |||
{ | |||
int s; | |||
int index = QTOS((Q)ARG0(arg)); | |||
valid_mctab_index(index); | |||
s = m_c_tab[index].c; | |||
ox_read_cmo(s,rp); | |||
} | |||
void Pox_push_local(arg,rp) | void Pox_push_local(arg,rp) | ||
NODE arg; | NODE arg; | ||
Obj *rp; | Obj *rp; | ||
|
|
||
if ( m_c_tab[index].af_unix ) | if ( m_c_tab[index].af_unix ) | ||
wait(&status); | wait(&status); | ||
#endif | #endif | ||
m_c_tab[index].m = 0; m_c_tab[index].c = 0; | m_c_tab[index].m = -1; m_c_tab[index].c = -1; | ||
m_c_tab[index].af_unix = 0; | m_c_tab[index].af_unix = 0; | ||
*rp = 0; | *rp = 0; | ||
} | } | ||
|
|
||
NODE arg; | NODE arg; | ||
Q *rp; | Q *rp; | ||
{ | { | ||
unsigned int ui; | int ui; | ||
int index = QTOS((Q)ARG0(arg)); | int index = QTOS((Q)ARG0(arg)); | ||
valid_mctab_index(index); | valid_mctab_index(index); | ||
ui = (unsigned int)QTOS((Q)ARG1(arg)); | ui = QTOS((Q)ARG1(arg)); | ||
ox_send_cmd(m_c_tab[index].c,ui); | ox_send_cmd(m_c_tab[index].c,ui); | ||
*rp = 0; | *rp = 0; | ||
} | } |