3 /* gras_private.h - GRAS private definitions */
5 /* Authors: Martin Quinson */
6 /* Copyright (C) 2003 the OURAGAN project. */
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. */
11 #ifndef GRAS_PRIVATE_H
12 #define GRAS_PRIVATE_H
20 #ifndef GS_FAILURE_CONTEXT
21 # define GS_FAILURE_CONTEXT
22 #endif /* FAILURE_CONTEXT */
24 #define GS_FAILURE(str) \
25 (fprintf(stderr, "FAILURE: %s(%s:%d)" GS_FAILURE_CONTEXT "%s\n", __func__, __FILE__, __LINE__, (str)), \
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))
32 /* end of Oli's cruft */
34 #include "gras_config.h"
36 #include "gras/error.h"
38 #include "gras/module.h"
39 #include "gras/dynar.h"
40 #include "gras/dict.h"
41 #include "gras/config.h"
43 #include "gras/data_description.h"
44 #include "gras/dd_type_bag.h"
46 #include "gras/core.h"
47 #include "gras/transport.h"
48 #include "gras/datadesc_simple.h"
49 #include "gras/socket.h"
50 #include "gras/messages.h"
55 #define ASSERT(cond,msg) do {if (!(cond)) { fprintf(stderr,msg); abort(); }} while(0)
57 /* **************************************************************************
59 ****************************************************************************/
62 * @Returns: 1 if succesfull 0 otherwise.
71 * @Returns: 1 if succesfull 0 otherwise.
73 * release the GRAS general lock.
78 /* **************************************************************************
80 * **************************************************************************/
85 * The list of callbacks for a given message type on a given host
88 gras_msgid_t id; /** identificator of this message */
90 int cbCount; /** number of registered callbacks */
91 gras_cb_t *cb; /** callbacks */
92 int *cbTTL; /** TTL of each callback (in number of use)*/
98 * An entry in the registered message list.
101 struct gras_msgentry_s {
102 gras_msgid_t id; /** identificator of this message */
103 char *name; /** printable name of this message */
105 int seqCount; /** number of sequence for this message */
106 DataDescriptor **dd; /** list of datadescriptor for each sequence */
107 size_t *ddCount; /** list of datadescriptor for each sequence */
108 unsigned int *networkSize;/** network size of one element in each sequence */
109 unsigned int *hostSize; /** host size of one element in each sequence */
111 /* **************************************************************************
113 * **************************************************************************/
118 * Globals for a given host.
121 gras_cblist_t *grasCbList; /** callbacks for registered messages */
122 unsigned int grasCbListCount; /** length of previous array */
128 * A header sent with messages. #version# is the NWS version and is presently
129 * ignored, but it could be used for compatibility. #message# is the actual
130 * message. #seqCount# is the number of sequence accompagning this message.
132 struct gras_msgheader_s {
134 gras_msgid_t message;
135 unsigned int dataSize;
136 unsigned int seqCount;
142 * Data for each process
145 /* queue of messages which where received but not wanted in msgWait, and therefore
146 temporarly queued until the next msgHandle */
148 gras_msg_t **grasMsgQueue;
150 /* registered callbacks for each message */
152 gras_cblist_t *grasCblList;
154 /* The channel we are listening to in SG for formated messages */
156 /* The channel we are listening to in SG for raw send/recv */
159 /* globals of the process */
164 /*@unused@*/static const DataDescriptor headerDescriptor[] =
165 {SIMPLE_MEMBER(CHAR_TYPE, 10, offsetof(gras_msgheader_t, version)),
166 SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, message)),
167 SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, dataSize)),
168 SIMPLE_MEMBER(UNSIGNED_INT_TYPE, 1, offsetof(gras_msgheader_t, seqCount))};
169 #define headerDescriptorCount 4
171 /*@unused@*/static const DataDescriptor countDescriptor[] =
172 {SIMPLE_DATA(UNSIGNED_INT_TYPE,1)};
173 #define countDescriptorCount 1
178 * This string is sent in each message to identify the version of the
179 * communication protocol used. This may be paranoid, but I feel so right now.
181 #define GRASVERSION "0.0.020504"
185 * @id: msg id to look for
186 * @Returns: the entry if found, NULL otherwise
188 * Get the entry corresponding to this message id;
190 gras_msgentry_t * grasMsgEntryGet(gras_msgid_t id);
193 * grasProcessDataGet:
195 * Get the GRAS globals for this host
197 grasProcessData_t *grasProcessDataGet(void);
201 * @id: msg id to look for
203 * Get the callback list corresponding to this message id;
205 gras_cblist_t * gras_cb_get(gras_msgid_t id);
209 * @id: the id of the new msg
211 * Create a new callback list for a new message id.
213 gras_error_t gras_cb_create(gras_msgid_t message);
218 * @dataSize: total size in network format, including headers and seqcount
219 * @seqCount: Number of sequences in this message (to check that everything goes well)
220 * @Returns: the created header
222 * Create a new header containing the passed values.
224 gras_msgheader_t *grasMsgHeaderNew(gras_msgid_t msgId,
225 unsigned int dataSize,
226 unsigned int seqCount);
231 * Receive the next message arriving within the given timeout
233 gras_error_t grasMsgRecv(gras_msg_t **msg, double timeout);
238 * Create an empty socket
240 gras_sock_t *gras_sock_new(void);
245 * Frees an old socket
247 void grasSockFree(gras_sock_t *s);
251 /* **************************************************************************
252 * Handling DataDescriptors
253 * **************************************************************************/
256 typedef enum {HOST_FORMAT, NETWORK_FORMAT} FormatTypes;
257 size_t DataSize(const DataDescriptor *description,
260 void *gras_datadesc_copy_data(const DataDescriptor *dd, unsigned int c, void *data);
261 int gras_datadesc_cmp(/*@null@*/const DataDescriptor *dd1, unsigned int c1,
262 /*@null@*/const DataDescriptor *dd2, unsigned int c2);
263 void gras_datadesc_dump(/*@null@*/const DataDescriptor *dd, unsigned int c);
265 #endif /* GRAS_PRIVATE_H */