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
This commit is contained in:
parent
2334010f7f
commit
5b71f37339
@ -4,19 +4,19 @@
|
|||||||
* *
|
* *
|
||||||
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
* 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 *
|
* File: mpi.c *
|
||||||
* Last rev: $Date: 2003-06-26 14:35:52 $ *
|
* Last rev: $Date: 2003-07-03 15:01:18 $ *
|
||||||
* mods: *
|
* mods: *
|
||||||
* comments: Internal interface to MPI libraries *
|
* comments: Interface to MPI libraries *
|
||||||
* *
|
* *
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
#ifndef lint
|
#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
|
#endif
|
||||||
|
|
||||||
#include "Yap.h"
|
#include "Yap.h"
|
||||||
@ -33,6 +33,9 @@ static char *rcsid = "$Header: /Users/vitor/Yap/yap-cvsbackup/library/mpi/mpi.c,
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
|
|
||||||
|
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_open, (void));
|
||||||
STATIC_PROTO (Int p_mpi_close, (void));
|
STATIC_PROTO (Int p_mpi_close, (void));
|
||||||
STATIC_PROTO (Int p_mpi_send, (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 Int rank, numprocs, namelen;
|
||||||
static char processor_name[MPI_MAX_PROCESSOR_NAME];
|
static char processor_name[MPI_MAX_PROCESSOR_NAME];
|
||||||
|
|
||||||
/* used by the parser */
|
|
||||||
static int StartLine;
|
|
||||||
|
|
||||||
static Int mpi_argc;
|
static Int mpi_argc;
|
||||||
static char **mpi_argv;
|
static char **mpi_argv;
|
||||||
|
|
||||||
/* mini-stream */
|
/* this should eventually be moved to config.h */
|
||||||
|
|
||||||
#define RECV_BUF_SIZE 1024*32
|
#define RECV_BUF_SIZE 1024*32
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A simple stream
|
||||||
|
*/
|
||||||
|
|
||||||
static size_t bufsize, bufstrlen;
|
static size_t bufsize, bufstrlen;
|
||||||
static char *buf;
|
static char *buf;
|
||||||
static int bufptr;
|
static int bufptr;
|
||||||
@ -95,105 +99,23 @@ expand_buffer( int space )
|
|||||||
bufsize += space;
|
bufsize += space;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
mpi_putc(Int stream, Int ch)
|
mpi_putc(Int ch)
|
||||||
{
|
{
|
||||||
if( ch > 0 ) {
|
if( ch > 0 ) {
|
||||||
if( bufptr >= bufsize ) expand_buffer( RECV_BUF_SIZE );
|
if( bufptr >= bufsize ) expand_buffer( RECV_BUF_SIZE );
|
||||||
buf[bufptr++] = ch;
|
buf[bufptr++] = ch;
|
||||||
}
|
}
|
||||||
return ch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
mpi_getc(Int stream)
|
mpi_getc(void)
|
||||||
{
|
{
|
||||||
return buf[bufptr++];
|
if( bufptr < bufsize ) return buf[bufptr++];
|
||||||
}
|
else return -1;
|
||||||
|
|
||||||
static Int
|
|
||||||
mpi_eob(void)
|
|
||||||
{
|
|
||||||
return (bufptr<bufstrlen) && (buf[bufptr] != EOF);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Term parser */
|
|
||||||
|
|
||||||
static Term
|
|
||||||
mpi_parse(void)
|
|
||||||
{
|
|
||||||
Term t;
|
|
||||||
TokEntry *tokstart;
|
|
||||||
tr_fr_ptr old_TR, TR_before_parse;
|
|
||||||
|
|
||||||
old_TR = TR;
|
|
||||||
while( TRUE ) {
|
|
||||||
CELL *old_H;
|
|
||||||
|
|
||||||
/* Scans the term using stack space */
|
|
||||||
Yap_eot_before_eof = FALSE;
|
|
||||||
|
|
||||||
/* the first arg is the getc_for_read, diff only if CharConv is on */
|
|
||||||
tokstart = Yap_tokptr = Yap_toktide = Yap_tokenizer(mpi_getc, mpi_getc);
|
|
||||||
|
|
||||||
/* preserve value of H after scanning: otherwise we may lose strings
|
|
||||||
and floats */
|
|
||||||
old_H = H;
|
|
||||||
|
|
||||||
if ( mpi_eob() && !Yap_eot_before_eof) {
|
|
||||||
if (tokstart != NIL && tokstart->Tok != 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 );
|
tag = IntOfTerm( t_tag );
|
||||||
}
|
}
|
||||||
|
|
||||||
bufptr = 0;
|
|
||||||
/* Turn the term into its ASCII representation */
|
/* Turn the term into its ASCII representation */
|
||||||
Yap_plwrite( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f );
|
bufptr = 0;
|
||||||
bufstrlen = (size_t)bufptr;
|
YAP_Write( t_data, mpi_putc, Quote_illegal_f|Handle_vars_f );
|
||||||
|
|
||||||
/* The buf is not NULL-terminated and does not have the
|
/* The buf is not NULL-terminated and does not have the
|
||||||
trailing ". " required by the parser */
|
trailing ". " required by the parser */
|
||||||
mpi_putc( 0, '.' );
|
mpi_putc( '.' );
|
||||||
mpi_putc( 0, ' ' );
|
mpi_putc( ' ' );
|
||||||
|
mpi_putc( 0 );
|
||||||
buf[bufptr] = 0;
|
bufstrlen = strlen(buf);
|
||||||
bufstrlen = bufptr + 1;
|
|
||||||
bufptr = 0;
|
|
||||||
|
|
||||||
/* send the data */
|
/* send the data */
|
||||||
|
bufptr = 0;
|
||||||
retv = MPI_Send( &buf[bufptr], bufstrlen, MPI_CHAR, dest, tag, MPI_COMM_WORLD );
|
retv = MPI_Send( &buf[bufptr], bufstrlen, MPI_CHAR, dest, tag, MPI_COMM_WORLD );
|
||||||
if( retv != MPI_SUCCESS ) return FALSE;
|
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 */
|
/* parse received string into a Prolog term */
|
||||||
|
|
||||||
bufptr = 0;
|
bufptr = 0;
|
||||||
t = mpi_parse();
|
t = YAP_Read( mpi_getc );
|
||||||
|
|
||||||
if( t == TermNil ) {
|
if( t == TermNil ) {
|
||||||
retv = FALSE;
|
retv = FALSE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
retv = Yap_unify(t, ARG1);
|
retv = Yap_unify(t, t_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retv;
|
return retv;
|
||||||
@ -417,14 +338,15 @@ p_mpi_bcast3() /* mpi_bcast( ?data, +root, +max_size ) */
|
|||||||
Yap_Error(INSTANTIATION_ERROR, t_data, "mpi_bcast");
|
Yap_Error(INSTANTIATION_ERROR, t_data, "mpi_bcast");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
bufptr = 0;
|
|
||||||
/* Turn the term into its ASCII representation */
|
/* 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
|
/* NULL-terminate the string and add the ". " termination
|
||||||
required by the parser. */
|
required by the parser. */
|
||||||
buf[bufptr] = 0;
|
mpi_putc( '.' );
|
||||||
strcat( buf, ". " );
|
mpi_putc( ' ' );
|
||||||
bufstrlen = bufptr + 2;
|
mpi_putc( 0 );
|
||||||
|
bufstrlen = strlen(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The third argument must be bound to an integer (the maximum length
|
/* 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;
|
bufptr = 0;
|
||||||
|
|
||||||
/* parse received string into a Prolog term */
|
/* 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;
|
bufptr = 0;
|
||||||
/* Turn the term into its ASCII representation */
|
/* 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
|
/* NULL-terminate the string and add the ". " termination
|
||||||
required by the parser. */
|
required by the parser. */
|
||||||
buf[bufptr] = 0;
|
buf[bufptr] = 0;
|
||||||
@ -545,14 +467,7 @@ p_mpi_bcast2() /* mpi_bcast( ?data, +root ) */
|
|||||||
bufstrlen = strlen(buf);
|
bufstrlen = strlen(buf);
|
||||||
bufptr = 0;
|
bufptr = 0;
|
||||||
|
|
||||||
/* parse received string into a Prolog term */
|
return Yap_unify(YAP_Read( mpi_getc ), ARG1);
|
||||||
{
|
|
||||||
Term t_tmp;
|
|
||||||
|
|
||||||
t_tmp = mpi_parse();
|
|
||||||
Yap_unify(ARG1, t_tmp);
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user