Reorganisation of the source tree
[ghc-hetmet.git] / rts / parallel / LLC.h
diff --git a/rts/parallel/LLC.h b/rts/parallel/LLC.h
new file mode 100644 (file)
index 0000000..536e431
--- /dev/null
@@ -0,0 +1,130 @@
+/* --------------------------------------------------------------------------
+   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
+
+//@menu
+//* 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_GLOBAL_TASK        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 SPARK_THREAD_DESCRIPTOR                1
+#define GLOBAL_THREAD_DESCRIPTOR       2
+
+#define _extract_jump_field(v) (v)
+
+#define MAX_DATA_WORDS_IN_PACKET       1024
+
+/* 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 */