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)