Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

131 lines (96 sloc) 4.164 kB
/* --------------------------------------------------------------------------
Time-stamp: <Sun Mar 18 2001 21:23:50 Stardate: [-30]6349.45 hwloidl>
Low Level Communications Header (LLC.h)
Contains the definitions used by the Low-level Communications
module of the GUM Haskell runtime environment.
Based on the Graph for PVM implementation.
Phil Trinder, Glasgow University, 13th Dec 1994
Adapted for the 4.xx RTS
H-W. Loidl, Heriot-Watt, November 1999
----------------------------------------------------------------------- */
#ifndef __LLC_H
#define __LLC_H
#ifdef PAR
//@node Low Level Communications Header, , ,
//@section Low Level Communications Header
//* Includes::
//* Macros and Constants::
//* PVM macros::
//* Externs::
//@end menu
//@node Includes, Macros and Constants, Low Level Communications Header, Low Level Communications Header
//@subsection Includes
#include "Rts.h"
#include "Parallel.h"
#include "PEOpCodes.h"
#include "pvm3.h"
//@node Macros and Constants, PVM macros, Includes, Low Level Communications Header
//@subsection Macros and Constants
#define ANY_TASK (-1) /* receive messages from any task */
#define ANY_OPCODE (-1) /* receive any opcode */
#define ALL_GROUP (-1) /* wait for barrier from every group member */
#define PEGROUP "PE"
#define MGRGROUP "MGR"
#define SYSGROUP "SYS"
#define PETASK "PE"
//@node PVM macros, Externs, Macros and Constants, Low Level Communications Header
//@subsection PVM macros
#define sync(gp,op) do { \
broadcast(gp,op); \
pvm_barrier(gp,ALL_GROUP); \
} while(0)
#define broadcast(gp,op) do { \
pvm_initsend(PvmDataDefault); \
pvm_bcast(gp,op); \
} while(0)
#define checkComms(c,s) do { \
if ((c)<0) { \
pvm_perror(s); \
stg_exit(EXIT_FAILURE); \
}} while(0)
#define _my_gtid pvm_mytid()
#define GetPacket() pvm_recv(ANY_TASK,ANY_OPCODE)
#define PacketsWaiting() (pvm_probe(ANY_TASK,ANY_OPCODE) != 0)
#define _extract_jump_field(v) (v)
/* basic PVM packing */
#define PutArg1(a) pvm_pklong((long *)&(a),1,1)
#define PutArg2(a) pvm_pklong((long *)&(a),1,1)
#define PutArgN(n,a) pvm_pklong((long *)&(a),1,1)
#define PutArgs(b,n) pvm_pklong((long *)b,n,1)
#define PutLit(l) { int a = l; PutArgN(?,a); }
/* basic PVM unpacking */
#define GetArg1(a) pvm_upklong((long *)&(a),1,1)
#define GetArg2(a) pvm_upklong((long *)&(a),1,1)
#define GetArgN(n,a) pvm_upklong((long *)&(a),1,1)
#define GetArgs(b,n) pvm_upklong((long *)b,n,1)
//@node Externs, , PVM macros, Low Level Communications Header
//@subsection Externs
/* basic message passing routines */
extern void sendOp (OpCode,GlobalTaskId),
sendOp1 (OpCode,GlobalTaskId,StgWord),
sendOp2 (OpCode,GlobalTaskId,StgWord,StgWord),
sendOpV (OpCode,GlobalTaskId,int,...),
sendOpN (OpCode,GlobalTaskId,int,StgPtr),
sendOpNV (OpCode,GlobalTaskId,int,StgPtr,int,...);
extern void broadcastOpN(OpCode op, char *group, int n, StgPtr args);
/* extracting data out of a packet */
OpCode getOpcode (rtsPacket p);
void getOpcodeAndSender (rtsPacket p, OpCode *popcode,
GlobalTaskId *psender_id);
GlobalTaskId senderTask (rtsPacket p);
rtsPacket waitForPEOp(OpCode op, GlobalTaskId who, void(*processUnexpected)(rtsPacket) );
/* Init and shutdown routines */
void startUpPE (void);
void shutDownPE(void);
int getExitCode(int nbytes, GlobalTaskId *sender_idp);
/* aux functions */
char *getOpName (unsigned op); // returns string of opcode
void processUnexpectedMessage (rtsPacket);
//void NullException(void);
#endif /*PAR */
#endif /*defined __LLC_H */
Jump to Line
Something went wrong with that request. Please try again.