32 #define VARSIZE_DECL(MSGTYPE) \
33 static void *alloc(int, int, int *, int); \
34 static void *pack(MSGTYPE *); \
35 static MSGTYPE* unpack(void *)
37 #define VARSIZE_MSG(MSGTYPE,MSGDATA) \
38 void *MSGTYPE::alloc(int varsizemsg_msgnum, int varsizemsg_size, \
39 int *varsizemsg_array, int varsizemsg_priobits) { \
40 varsizemsg_size = ALIGN8(varsizemsg_size); \
41 MSGTYPE *varsizemsg_msg = 0; \
43 const int varsizemsg_pass = 0; \
44 int varsizemsg_totalsize = varsizemsg_size; \
45 int varsizemsg_arraycount = 0; \
47 varsizemsg_msg = (MSGTYPE *) CkAllocMsg( \
48 varsizemsg_msgnum, varsizemsg_totalsize, varsizemsg_priobits); \
51 const int varsizemsg_pass = 1; \
52 int varsizemsg_totalsize = varsizemsg_size; \
53 int varsizemsg_arraycount = 0; \
56 return (void *) varsizemsg_msg; \
59 void *MSGTYPE::pack(MSGTYPE *varsizemsg_msg) { \
60 int *varsizemsg_array=0, varsizemsg_arraycount=0, varsizemsg_totalsize=0; \
62 const int varsizemsg_pass = 2; \
65 return (void *) varsizemsg_msg; \
68 MSGTYPE *MSGTYPE::unpack(void *varsizemsg_buf) { \
69 int *varsizemsg_array=0, varsizemsg_arraycount=0, varsizemsg_totalsize=0; \
70 MSGTYPE *varsizemsg_msg = (MSGTYPE *) varsizemsg_buf; \
72 const int varsizemsg_pass = 3; \
75 return varsizemsg_msg; \
78 template<
class T>
inline T*
cast_array(T*,
char *a) {
return (T*) a; }
79 template<
class T>
inline T*
cast_size(T*,
size_t a) {
return (T*) a; }
81 #define VARSIZE_ARRAY(ARRAY) { \
82 int varsizemsg_arraysize; \
83 switch ( varsizemsg_pass ) { \
85 varsizemsg_arraysize = sizeof(*(varsizemsg_msg->ARRAY)) * \
86 varsizemsg_array[varsizemsg_arraycount]; \
87 varsizemsg_totalsize += ALIGN8(varsizemsg_arraysize); \
88 varsizemsg_arraycount++; \
91 varsizemsg_msg->ARRAY = cast_array(varsizemsg_msg->ARRAY, \
92 (char *) varsizemsg_msg + varsizemsg_totalsize); \
93 varsizemsg_arraysize = sizeof(*(varsizemsg_msg->ARRAY)) * \
94 varsizemsg_array[varsizemsg_arraycount]; \
95 varsizemsg_totalsize += ALIGN8(varsizemsg_arraysize); \
96 varsizemsg_arraycount++; \
99 varsizemsg_msg->ARRAY = cast_size(varsizemsg_msg->ARRAY, \
100 (char *) (varsizemsg_msg->ARRAY) - (char *) &(varsizemsg_msg->ARRAY) ); \
103 varsizemsg_msg->ARRAY = cast_array(varsizemsg_msg->ARRAY, \
104 (char *) &(varsizemsg_msg->ARRAY) + (size_t) (varsizemsg_msg->ARRAY) ); \
T * cast_size(T *, size_t a)
T * cast_array(T *, char *a)