From 5b71f373391eaf43fc1f83d7280f678354df4665 Mon Sep 17 00:00:00 2001 From: stasinos Date: Thu, 3 Jul 2003 15:01:18 +0000 Subject: [PATCH] Use YAP_Read and YAP_Write instead of directly Yap_Parse and plwrite. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@841 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- library/mpi/mpi.c | 161 +++++++++++----------------------------------- 1 file changed, 38 insertions(+), 123 deletions(-) diff --git a/library/mpi/mpi.c b/library/mpi/mpi.c index 0c31749e3..d26cf0c17 100644 --- a/library/mpi/mpi.c +++ b/library/mpi/mpi.c @@ -4,19 +4,19 @@ * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * -* Copyright S. Konstantopoulos and Universidade do Porto 2002 * +* Copyright S. Konstantopoulos and Universidade do Porto 2002-2003 * * * ************************************************************************** * * * File: mpi.c * -* Last rev: $Date: 2003-06-26 14:35:52 $ * +* Last rev: $Date: 2003-07-03 15:01:18 $ * * mods: * -* comments: Internal interface to MPI libraries * +* comments: Interface to MPI libraries * * * *************************************************************************/ #ifndef lint -static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,v 1.19 2003-06-26 14:35:52 stasinos Exp $"; +static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,v 1.20 2003-07-03 15:01:18 stasinos Exp $"; #endif #include "Yap.h" @@ -33,6 +33,9 @@ static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c, #include #include +Term STD_PROTO(YAP_Read, (int (*)(void))); +void STD_PROTO(YAP_Write, (Term, void (*)(int), int)); + STATIC_PROTO (Int p_mpi_open, (void)); STATIC_PROTO (Int p_mpi_close, (void)); STATIC_PROTO (Int p_mpi_send, (void)); @@ -43,22 +46,23 @@ STATIC_PROTO (Int p_mpi_barrier, (void)); /* - * Auxiliary Data and Functions + * Auxiliary Data */ static Int rank, numprocs, namelen; static char processor_name[MPI_MAX_PROCESSOR_NAME]; -/* used by the parser */ -static int StartLine; - static Int mpi_argc; static char **mpi_argv; -/* mini-stream */ - +/* this should eventually be moved to config.h */ #define RECV_BUF_SIZE 1024*32 + +/* + * A simple stream + */ + static size_t bufsize, bufstrlen; static char *buf; static int bufptr; @@ -95,105 +99,23 @@ expand_buffer( int space ) bufsize += space; } -static int -mpi_putc(Int stream, Int ch) +static void +mpi_putc(Int ch) { if( ch > 0 ) { if( bufptr >= bufsize ) expand_buffer( RECV_BUF_SIZE ); buf[bufptr++] = ch; } - return ch; } static Int -mpi_getc(Int stream) +mpi_getc(void) { - return buf[bufptr++]; -} - -static Int -mpi_eob(void) -{ - return (bufptrTok != Ord (eot_tok)) { - /* we got the end of file from an abort */ - if (Yap_ErrorMessage == "Abort") { - TR = old_TR; - return TermNil; - } - /* we need to force the next reading to also give end of file.*/ - buf[bufptr] = EOF; - Yap_ErrorMessage = "[ Error: end of file found before end of term ]"; - } else { - /* restore TR */ - TR = old_TR; - - return (Yap_unify_constant(t, MkAtomTerm(AtomEof))); - } - } - repeat_cycle: - TR_before_parse = TR; - if( (t = Yap_Parse())==0 || Yap_ErrorMessage ) { - if (Yap_ErrorMessage && (strcmp(Yap_ErrorMessage,"Stack Overflow") == 0)) { - /* ignore term we just built */ - TR = TR_before_parse; - H = old_H; - if (Yap_growstack_in_parser(&old_TR, &tokstart, &Yap_VarTable)) { - old_H = H; - Yap_tokptr = Yap_toktide = tokstart; - Yap_ErrorMessage = NULL; - goto repeat_cycle; - } - } - TR = old_TR; - - /* - behave as if ParserErrorStyle were QUIET_ON_PARSER_ERROR, - (see iopreds.c), except with bombing Yap instead of simply - failing the predicate: the parse cannot fail unless there - is a problem with the transmission that went unnoticed or - a bug in the pretty printer. - */ - Yap_Error(SYSTEM_ERROR, TermNil, "Failed to parse MPI_Recv()'ed term" ); - Yap_exit( EXIT_FAILURE ); - - } else { - /* parsing succeeded */ - break; - } - } - - TR = old_TR; - return t; -} - /* @@ -286,21 +208,19 @@ p_mpi_send() /* mpi_send(+data, +destination, +tag) */ tag = IntOfTerm( t_tag ); } - bufptr = 0; /* Turn the term into its ASCII representation */ - Yap_plwrite( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); - bufstrlen = (size_t)bufptr; + bufptr = 0; + YAP_Write( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); /* The buf is not NULL-terminated and does not have the trailing ". " required by the parser */ - mpi_putc( 0, '.' ); - mpi_putc( 0, ' ' ); - - buf[bufptr] = 0; - bufstrlen = bufptr + 1; - bufptr = 0; + mpi_putc( '.' ); + mpi_putc( ' ' ); + mpi_putc( 0 ); + bufstrlen = strlen(buf); /* send the data */ + bufptr = 0; retv = MPI_Send( &buf[bufptr], bufstrlen, MPI_CHAR, dest, tag, MPI_COMM_WORLD ); if( retv != MPI_SUCCESS ) return FALSE; @@ -382,14 +302,15 @@ p_mpi_receive() /* mpi_receive(-data, ?orig, ?tag) */ } /* parse received string into a Prolog term */ + bufptr = 0; - t = mpi_parse(); + t = YAP_Read( mpi_getc ); if( t == TermNil ) { retv = FALSE; } else { - retv = Yap_unify(t, ARG1); + retv = Yap_unify(t, t_data); } return retv; @@ -417,14 +338,15 @@ p_mpi_bcast3() /* mpi_bcast( ?data, +root, +max_size ) */ Yap_Error(INSTANTIATION_ERROR, t_data, "mpi_bcast"); return FALSE; } - bufptr = 0; /* Turn the term into its ASCII representation */ - Yap_plwrite( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); + bufptr = 0; + YAP_Write( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); /* NULL-terminate the string and add the ". " termination required by the parser. */ - buf[bufptr] = 0; - strcat( buf, ". " ); - bufstrlen = bufptr + 2; + mpi_putc( '.' ); + mpi_putc( ' ' ); + mpi_putc( 0 ); + bufstrlen = strlen(buf); } /* The third argument must be bound to an integer (the maximum length @@ -465,7 +387,7 @@ p_mpi_bcast3() /* mpi_bcast( ?data, +root, +max_size ) */ bufptr = 0; /* parse received string into a Prolog term */ - return Yap_unify(mpi_parse(), ARG1); + return Yap_unify( YAP_Read(mpi_getc), ARG1 ); } } @@ -500,7 +422,7 @@ p_mpi_bcast2() /* mpi_bcast( ?data, +root ) */ } bufptr = 0; /* Turn the term into its ASCII representation */ - Yap_plwrite( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); + YAP_Write( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f ); /* NULL-terminate the string and add the ". " termination required by the parser. */ buf[bufptr] = 0; @@ -545,14 +467,7 @@ p_mpi_bcast2() /* mpi_bcast( ?data, +root ) */ bufstrlen = strlen(buf); bufptr = 0; - /* parse received string into a Prolog term */ - { - Term t_tmp; - - t_tmp = mpi_parse(); - Yap_unify(ARG1, t_tmp); - } - return TRUE; + return Yap_unify(YAP_Read( mpi_getc ), ARG1); } }