Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
f8d1962b178718b5003fb23d260d1b9cf6d01e01
[simgrid.git] / src / gras / gras_private.h
1 /* $Id$ */
2
3 /* gras_private.h - GRAS private definitions                                */
4
5 /* Authors: Martin Quinson                                                  */
6 /* Copyright (C) 2003 the OURAGAN project.                                  */
7
8 /* This program is free software; you can redistribute it and/or modify it
9    under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #ifndef GRAS_PRIVATE_H
12 #define GRAS_PRIVATE_H
13
14 #include <unistd.h>
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18
19 /* Oli's macro */
20 #ifndef GS_FAILURE_CONTEXT
21 #  define GS_FAILURE_CONTEXT
22 #endif /* FAILURE_CONTEXT */
23
24 #define GS_FAILURE(str) \
25      (fprintf(stderr, "FAILURE: %s(%s:%d)" GS_FAILURE_CONTEXT "%s\n", __func__, __FILE__, __LINE__, (str)), \
26       abort())
27
28 #define aligned(v, a) (((v) + (a - 1)) & ~(a - 1))
29 #define max(a, b) (((a) > (b))?(a):(b))
30 #define min(a, b) (((a) < (b))?(a):(b))
31
32 /* end of Oli's cruft */
33
34 #include "gras_config.h"
35
36 #include "gras/error.h"
37 #include "gras/log.h"
38 #include "gras/module.h"
39 #include "gras/dynar.h"
40 #include "gras/dict.h"
41 #include "gras/config.h"
42
43 #include "gras/data_description.h"
44 #include "gras/dd_type_bag.h"
45
46 #include "gras/core.h"
47 #include "gras/datadesc.h"
48 #include "gras/socket.h"
49 #include "gras/messages.h"
50
51 #define TRUE  1
52 #define FALSE 0
53
54 #define ASSERT(cond,msg) do {if (!(cond)) { fprintf(stderr,msg); abort(); }} while(0)
55
56 /* **************************************************************************
57  * Locking system
58  ****************************************************************************/
59 /**
60  * gras_lock:
61  * @Returns: 1 if succesfull 0 otherwise.
62  *
63  * Get the GRAS lock.
64  */
65 int
66 gras_lock(void);
67
68 /**
69  * gras_unlock:
70  * @Returns: 1 if succesfull 0 otherwise.
71  *
72  * release the GRAS general lock.
73  */
74 int
75 gras_unlock(void);
76
77 /* **************************************************************************
78  * Messaging stuff
79  * **************************************************************************/
80
81 /**
82  * gras_cblist_t:
83  *
84  * The list of callbacks for a given message type on a given host
85  */
86 typedef struct {
87   gras_msgid_t id;     /** identificator of this message */
88   
89   int cbCount;         /** number of registered callbacks */
90   gras_cb_t *cb;       /** callbacks */
91   int *cbTTL;          /** TTL of each callback (in number of use)*/
92 } gras_cblist_t;
93
94 /**
95  * gras_msgentry_t:
96  *
97  * An entry in the registered message list.
98  */
99
100 struct gras_msgentry_s {
101   gras_msgid_t id;     /** identificator of this message */
102   char *name;               /** printable name of this message */
103
104   int seqCount;             /** number of sequence for this message */
105   DataDescriptor **dd;      /** list of datadescriptor for each sequence */
106   size_t *ddCount;          /** list of datadescriptor for each sequence */
107   unsigned int *networkSize;/** network size of one element in each sequence */
108   unsigned int *hostSize;   /** host size of one element in each sequence */
109 };
110 /* **************************************************************************
111  * GRAS globals
112  * **************************************************************************/
113
114 /** 
115  * gras_hostglobal_t:
116  * 
117  * Globals for a given host. 
118  */
119 typedef struct {
120   gras_cblist_t *grasCbList; /** callbacks for registered messages */
121   unsigned int grasCbListCount;      /** length of previous array */
122 } gras_hostglobal_t;
123
124 /**
125  * gras_msgheader_t:
126  *
127  * A header sent with messages.  #version# is the NWS version and is presently
128  * ignored, but it could be used for compatibility.  #message# is the actual
129  * message. #seqCount# is the number of sequence accompagning this message.
130  */
131 struct gras_msgheader_s {
132   char          version[10];
133   gras_msgid_t  message;
134   unsigned int  dataSize;
135   unsigned int  seqCount;
136 };
137
138 /**
139  * grasProcessData_t:
140  *
141  * Data for each process 
142  */
143 typedef struct {
144   /* queue of messages which where received but not wanted in msgWait, and therefore
145      temporarly queued until the next msgHandle */
146   int grasMsgQueueLen;
147   gras_msg_t **grasMsgQueue;
148
149   /* registered callbacks for each message */
150   int grasCblListLen;
151   gras_cblist_t *grasCblList;
152
153   /* The channel we are listening to in SG for formated messages */
154   int chan;
155   /* The channel we are listening to in SG for raw send/recv */
156   int rawChan; 
157
158   /* globals of the process */
159   void *userdata;               
160 } grasProcessData_t;
161
162
163 /*@unused@*/static const DataDescriptor headerDescriptor[] =
164   {SIMPLE_MEMBER(CHAR_TYPE, 10, offsetof(gras_msgheader_t, version)),
165    SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, message)),
166    SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, dataSize)),
167    SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, seqCount))};
168 #define headerDescriptorCount 4
169
170 /*@unused@*/static const DataDescriptor countDescriptor[] =
171   {SIMPLE_DATA(UNSIGNED_INT_TYPE,1)};
172 #define countDescriptorCount 1
173
174 /**
175  * GRASVERSION
176  *
177  * This string is sent in each message to identify the version of the 
178  * communication protocol used. This may be paranoid, but I feel so right now.
179  */
180 #define GRASVERSION "0.0.020504"
181
182 /**
183  * grasMsgEntryGet: 
184  * @id: msg id to look for
185  * @Returns: the entry if found, NULL otherwise
186  * 
187  * Get the entry corresponding to this message id;
188  */ /*@observer@*/
189 gras_msgentry_t * grasMsgEntryGet(gras_msgid_t id);
190
191 /**
192  * grasProcessDataGet: 
193  * 
194  * Get the GRAS globals for this host
195  */ /*@observer@*/
196 grasProcessData_t *grasProcessDataGet(void);
197
198 /**
199  * gras_cb_get: 
200  * @id: msg id to look for
201  * 
202  * Get the callback list corresponding to this message id;
203  */ /*@observer@*/
204 gras_cblist_t * gras_cb_get(gras_msgid_t id);
205
206 /**
207  * gras_cb_create:
208  * @id: the id of the new msg
209  *
210  * Create a new callback list for a new message id.
211  */
212 gras_error_t gras_cb_create(gras_msgid_t message);
213
214 /**
215  * grasMsgHeaderNew:
216  * @msgId: 
217  * @dataSize: total size in network format, including headers and seqcount
218  * @seqCount: Number of sequences in this message (to check that everything goes well)
219  * @Returns: the created header
220  *
221  * Create a new header containing the passed values.
222  */
223 gras_msgheader_t *grasMsgHeaderNew(gras_msgid_t msgId, 
224                                   unsigned int dataSize,
225                                   unsigned int seqCount);
226
227 /**
228  * grasMsgRecv:
229  *
230  * Receive the next message arriving within the given timeout
231  */
232 gras_error_t grasMsgRecv(gras_msg_t **msg, double timeout);
233
234 /**
235  * gras_sock_new:
236  *
237  * Create an empty socket
238  */
239 gras_sock_t *gras_sock_new(void);
240
241 /**
242  * grasSockFree:
243  *
244  * Frees an old socket
245  */
246 void grasSockFree(gras_sock_t *s);
247
248
249
250 /* **************************************************************************
251  * Handling DataDescriptors
252  * **************************************************************************/
253 typedef enum {HOST_FORMAT, NETWORK_FORMAT} FormatTypes;
254 size_t DataSize(const DataDescriptor *description,
255                 size_t length,
256                 FormatTypes format);
257 void *gras_datadesc_copy_data(const DataDescriptor *dd, unsigned int c, void *data);
258 int gras_datadesc_cmp(/*@null@*/const DataDescriptor *dd1, unsigned int c1,
259                       /*@null@*/const DataDescriptor *dd2, unsigned int c2);
260 void gras_datadesc_dump(/*@null@*/const DataDescriptor *dd, unsigned int c);
261
262 #endif /* GRAS_PRIVATE_H */