64ee17bbf956e3375c886080c315bac89864c9c1
[charm.git] / src / ck-core / env_macros.h
1 /***************************************************************************
2  * RCS INFORMATION:
3  *
4  *      $RCSfile$
5  *      $Author$        $Locker$                $State$
6  *      $Revision$      $Date$
7  *
8  ***************************************************************************
9  * DESCRIPTION:
10  *
11  ***************************************************************************
12  * REVISION HISTORY:
13  *
14  * $Log$
15  * Revision 2.15  1997-11-10 16:36:53  milind
16  * Changed size_t to CMK_SIZE_T.
17  *
18  * Revision 2.14  1997/10/29 23:52:46  milind
19  * Fixed CthInitialize bug on uth machines.
20  *
21  * Revision 2.13  1997/03/24 23:10:13  milind
22  * Made envelope 64-bit safe by replacing an int with a void *.
23  *
24  * Revision 2.12  1997/02/06 19:52:44  jyelon
25  * Corrected the core field to take CmiMsgHeaderSizeBytes into account.
26  *
27  * Revision 2.11  1995/10/27 09:09:31  jyelon
28  * *** empty log message ***
29  *
30  * Revision 2.10  1995/10/13  18:15:53  jyelon
31  * K&R changes.
32  *
33  * Revision 2.9  1995/09/29  09:51:12  jyelon
34  * Many small corrections.
35  *
36  * Revision 2.8  1995/09/01  02:13:17  jyelon
37  * VID_BLOCK, CHARE_BLOCK, BOC_BLOCK consolidated.
38  *
39  * Revision 2.7  1995/07/27  20:29:34  jyelon
40  * Improvements to runtime system, general cleanup.
41  *
42  * Revision 2.6  1995/07/25  00:29:31  jyelon
43  * *** empty log message ***
44  *
45  * Revision 2.5  1995/07/24  01:54:40  jyelon
46  * *** empty log message ***
47  *
48  * Revision 2.4  1995/07/22  23:44:13  jyelon
49  * *** empty log message ***
50  *
51  * Revision 2.3  1995/07/19  22:15:35  jyelon
52  * *** empty log message ***
53  *
54  * Revision 2.2  1995/07/12  16:28:45  jyelon
55  * *** empty log message ***
56  *
57  * Revision 2.1  1995/06/08  17:07:12  gursoy
58  * Cpv macro changes done
59  *
60  * Revision 1.6  1995/05/03  20:58:09  sanjeev
61  * *** empty log message ***
62  *
63  * Revision 1.5  1995/04/23  20:54:43  sanjeev
64  * Removed Core....
65  *
66  * Revision 1.4  1995/03/17  23:37:51  sanjeev
67  * changes for better message format
68  *
69  * Revision 1.3  1995/03/12  17:09:48  sanjeev
70  * changes for new msg macros
71  *
72  * Revision 1.2  1994/11/11  05:31:19  brunner
73  * Removed ident added by accident with RCS header
74  *
75  * Revision 1.1  1994/11/07  15:39:42  brunner
76  * Initial revision
77  *
78  ***************************************************************************/
79 /*****************************************************************/
80 /** This is the structure of the envelope. The various functions**/
81 /** that access it follow.                                      **/
82 /** This file also contains access macros for the chare-id      **/
83 /*****************************************************************/
84 #ifndef ENV_MACROS_H
85 #define ENV_MACROS_H
86
87 #define GetID_onPE(id)                  ((id).onPE)
88 #define SetID_onPE(id,x)                ((id).onPE=(x))
89
90 #define GetID_chare_magic_number(id)    ((id).magic)
91 #define SetID_chare_magic_number(id,x)  ((id).magic=(x))
92
93 #define GetID_chareBlockPtr(id)         ((id).chareBlockPtr)
94 #define SetID_chareBlockPtr(id,x)       ((id).chareBlockPtr=(x))
95
96 /*
97  * Current envelope size: 256 bits = 32 bytes = 4 doubles.
98  *
99  * Note: the user-data area is aligned to a 64-bit boundary.  Therefore,
100  * there is no point to trimming the envelope unless you can save 64 bits.
101  *
102  * save 32 bits: remove 'event'.  Easy with ifdefs, doubles SUPER_INSTALL time.
103  * save 16 bits: remove 'pe'.     Easy with ifdefs, doubles SUPER_INSTALL time.
104  * save 16 bits: change TotalSize to a magnitude.  Inefficient.
105  * save 16 bits: could eliminate priosize, by moving it into priority. Clumsy.
106  * save  8 bits: remove msgType by replacing HANDLE_X_MSG.  Hard.
107  * save 14 bits: turn isPACKED, msgType, queueing into bitfields.  Inefficient.
108  * save  2 bits: coalesce isPACKED with packid. Hard.
109  *
110  */
111
112 typedef struct envelope {
113   char     core[CmiMsgHeaderSizeBytes];
114   
115   unsigned int   event;   /* unknown meaning. Used only for logging.*/
116
117   void *     i_tag2;  /* Count OR vidBlockPtr OR chareBlockPtr OR boc_num*/
118
119   unsigned int   TotalSize; /* total size of message, in bytes */
120
121   unsigned short s_tag1;  /* vidPE OR ref OR other_id */
122   unsigned short s_tag2;  /* chare_magic_number */
123
124   unsigned short EP;      /* entry point to call */
125   unsigned short priosize;/* priority length, measured in bits */
126
127   unsigned short pe;      /* unknown meaning. used only for logging. */
128   unsigned char  msgType;
129   unsigned char  isPACKED;
130
131   unsigned char  queueing;
132   unsigned char  packid;
133
134 } ENVELOPE;
135
136
137 #define INTBITS (sizeof(int)*8)
138
139 /*********************************************************/
140 /** Arrangement for i_tag2                              **/
141 /*********************************************************/
142 #define GetEnv_count(e)                 ((CMK_SIZE_T)(((ENVELOPE *)(e))->i_tag2))
143 #define SetEnv_count(e,x)               (((ENVELOPE *)(e))->i_tag2=((void *)(x)))
144
145 #define GetEnv_chareBlockPtr(e)         ((CHARE_BLOCK *)(((ENVELOPE *)(e))->i_tag2))
146 #define SetEnv_chareBlockPtr(e,x)       (((ENVELOPE *)(e))->i_tag2=((void *)(x)))
147
148 #define SetEnv_vidBlockPtr(e,x)         (((ENVELOPE *)(e))->i_tag2=(x))
149 #define GetEnv_vidBlockPtr(e)           ((CHARE_BLOCK *)(((ENVELOPE *)(e))->i_tag2))
150
151 #define GetEnv_boc_num(e)               ((CMK_SIZE_T)(((ENVELOPE *)(e))->i_tag2))
152 #define SetEnv_boc_num(e,x)             (((ENVELOPE *)(e))->i_tag2=((void *)(x)))
153
154 /*********************************************************/
155 /* Arrangement for s_tag1                                */
156 /* other_id is used only for acc, mono, init, tbl msgs   */
157 /* vidPE is used only if msgType==VidSendOverMsg         */
158 /* ref is for user messages only.                        */
159 /*********************************************************/
160
161 #define GetEnv_other_id(e)   (((ENVELOPE *)(e))->s_tag1)
162 #define SetEnv_other_id(e,x) (((ENVELOPE *)(e))->s_tag1=(x))
163
164 #define GetEnv_vidPE(e)      (((ENVELOPE *)(e))->s_tag1)
165 #define SetEnv_vidPE(e,x)    (((ENVELOPE *)(e))->s_tag1=(x))
166
167 #define GetEnv_ref(e)        (((ENVELOPE *)(e))->s_tag1)
168 #define SetEnv_ref(e,x)      (((ENVELOPE *)(e))->s_tag1=(x))
169
170 #define GetEnv_chare_magic_number(e)    (((ENVELOPE *)(e))->s_tag2)
171 #define SetEnv_chare_magic_number(e,x)  (((ENVELOPE *)(e))->s_tag2=(x))
172
173 /*********************************************************/
174 /** These fields share a byte.                           */
175 /*********************************************************/
176
177 #define GetEnv_isPACKED(e)      (((ENVELOPE *)(e))->isPACKED)
178 #define SetEnv_isPACKED(e,x)    (((ENVELOPE *)(e))->isPACKED=(x))
179
180 /*********************************************************/
181 /** These fields are alone currently, and accessed      **/
182 /** separately.                                         **/
183 /*********************************************************/
184
185 #define GetEnv_pe(e)            (((ENVELOPE *)(e))->pe)
186 #define SetEnv_pe(e,x)          (((ENVELOPE *)(e))->pe=(x))
187
188 #define GetEnv_event(e)         (((ENVELOPE *)(e))->event)
189 #define SetEnv_event(e,x)       (((ENVELOPE *)(e))->event=(x))
190
191 #define GetEnv_EP(e)            (((ENVELOPE *)(e))->EP)
192 #define SetEnv_EP(e,x)          (((ENVELOPE *)(e))->EP=(x))
193
194 #define GetEnv_queueing(e)      (((ENVELOPE *)(e))->queueing)
195 #define SetEnv_queueing(e,x)    (((ENVELOPE *)(e))->queueing=(x))
196
197 #define GetEnv_priosize(e)      (((ENVELOPE *)(e))->priosize)
198 #define SetEnv_priosize(e,x)    (((ENVELOPE *)(e))->priosize=(x))
199
200 #define GetEnv_TotalSize(e)     (((ENVELOPE *)(e))->TotalSize)
201 #define SetEnv_TotalSize(e,x)   (((ENVELOPE *)(e))->TotalSize=(x))
202
203 #define GetEnv_packid(e)        (((ENVELOPE *)(e))->packid)
204 #define SetEnv_packid(e,x)      (((ENVELOPE *)(e))->packid=(x))
205
206 #define GetEnv_msgType(e)       (((ENVELOPE *)(e))->msgType)
207 #define SetEnv_msgType(e,x)     (((ENVELOPE *)(e))->msgType=(x))
208
209 /*********************************/
210 /* Navigating the priority field */
211 /*********************************/
212
213 #define GetEnv_priowords(e) ((GetEnv_priosize(e)+INTBITS-1)/INTBITS)
214 #define GetEnv_priobytes(e) (GetEnv_priowords(e)*sizeof(int))
215 #define GetEnv_prioend(e) ((unsigned int *)(((char *)(e))+GetEnv_TotalSize(e)))
216 #define GetEnv_priobgn(e) ((unsigned int *)(((char *)(e))+GetEnv_TotalSize(e)-GetEnv_priobytes(e)))
217
218 #endif
219
220