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