winlin

Merge branch 'srs.master'

@@ -50,7 +50,7 @@ @@ -50,7 +50,7 @@
50 50
51 /* Enable assertions only if DEBUG is defined */ 51 /* Enable assertions only if DEBUG is defined */
52 #ifndef DEBUG 52 #ifndef DEBUG
53 -#define NDEBUG 53 + #define NDEBUG
54 #endif 54 #endif
55 #include <assert.h> 55 #include <assert.h>
56 #define ST_ASSERT(expr) assert(expr) 56 #define ST_ASSERT(expr) assert(expr)
@@ -59,15 +59,14 @@ @@ -59,15 +59,14 @@
59 #define ST_END_MACRO } 59 #define ST_END_MACRO }
60 60
61 #ifdef DEBUG 61 #ifdef DEBUG
62 -#define ST_HIDDEN /*nothing*/ 62 + #define ST_HIDDEN /*nothing*/
63 #else 63 #else
64 -#define ST_HIDDEN static 64 + #define ST_HIDDEN static
65 #endif 65 #endif
66 66
67 #include "public.h" 67 #include "public.h"
68 #include "md.h" 68 #include "md.h"
69 69
70 -  
71 /***************************************** 70 /*****************************************
72 * Circular linked list definitions 71 * Circular linked list definitions
73 */ 72 */
@@ -137,7 +136,6 @@ typedef struct _st_clist { @@ -137,7 +136,6 @@ typedef struct _st_clist {
137 136
138 typedef void (*_st_destructor_t)(void *); 137 typedef void (*_st_destructor_t)(void *);
139 138
140 -  
141 typedef struct _st_stack { 139 typedef struct _st_stack {
142 _st_clist_t links; 140 _st_clist_t links;
143 char *vaddr; /* Base of stack's allocated memory */ 141 char *vaddr; /* Base of stack's allocated memory */
@@ -146,9 +144,9 @@ typedef struct _st_stack { @@ -146,9 +144,9 @@ typedef struct _st_stack {
146 char *stk_bottom; /* Lowest address of stack's usable portion */ 144 char *stk_bottom; /* Lowest address of stack's usable portion */
147 char *stk_top; /* Highest address of stack's usable portion */ 145 char *stk_top; /* Highest address of stack's usable portion */
148 void *sp; /* Stack pointer from C's point of view */ 146 void *sp; /* Stack pointer from C's point of view */
149 -#ifdef __ia64__ 147 + #ifdef __ia64__
150 void *bsp; /* Register stack backing store pointer */ 148 void *bsp; /* Register stack backing store pointer */
151 -#endif 149 + #endif
152 } _st_stack_t; 150 } _st_stack_t;
153 151
154 152
@@ -171,9 +169,9 @@ struct _st_thread { @@ -171,9 +169,9 @@ struct _st_thread {
171 169
172 _st_clist_t links; /* For putting on run/sleep/zombie queue */ 170 _st_clist_t links; /* For putting on run/sleep/zombie queue */
173 _st_clist_t wait_links; /* For putting on mutex/condvar wait queue */ 171 _st_clist_t wait_links; /* For putting on mutex/condvar wait queue */
174 -#ifdef DEBUG 172 + #ifdef DEBUG
175 _st_clist_t tlink; /* For putting on thread queue */ 173 _st_clist_t tlink; /* For putting on thread queue */
176 -#endif 174 + #endif
177 175
178 st_utime_t due; /* Wakeup time when thread is sleeping */ 176 st_utime_t due; /* Wakeup time when thread is sleeping */
179 _st_thread_t *left; /* For putting in timeout heap */ 177 _st_thread_t *left; /* For putting in timeout heap */
@@ -223,18 +221,18 @@ typedef struct _st_vp { @@ -223,18 +221,18 @@ typedef struct _st_vp {
223 _st_clist_t run_q; /* run queue for this vp */ 221 _st_clist_t run_q; /* run queue for this vp */
224 _st_clist_t io_q; /* io queue for this vp */ 222 _st_clist_t io_q; /* io queue for this vp */
225 _st_clist_t zombie_q; /* zombie queue for this vp */ 223 _st_clist_t zombie_q; /* zombie queue for this vp */
226 -#ifdef DEBUG 224 + #ifdef DEBUG
227 _st_clist_t thread_q; /* all threads of this vp */ 225 _st_clist_t thread_q; /* all threads of this vp */
228 -#endif 226 + #endif
229 int pagesize; 227 int pagesize;
230 228
231 _st_thread_t *sleep_q; /* sleep queue for this vp */ 229 _st_thread_t *sleep_q; /* sleep queue for this vp */
232 int sleepq_size; /* number of threads on sleep queue */ 230 int sleepq_size; /* number of threads on sleep queue */
233 231
234 -#ifdef ST_SWITCH_CB 232 + #ifdef ST_SWITCH_CB
235 st_switch_cb_t switch_out_cb; /* called when a thread is switched out */ 233 st_switch_cb_t switch_out_cb; /* called when a thread is switched out */
236 st_switch_cb_t switch_in_cb; /* called when a thread is switched in */ 234 st_switch_cb_t switch_in_cb; /* called when a thread is switched in */
237 -#endif 235 + #endif
238 } _st_vp_t; 236 } _st_vp_t;
239 237
240 238
@@ -265,7 +263,7 @@ extern _st_eventsys_t *_st_eventsys; @@ -265,7 +263,7 @@ extern _st_eventsys_t *_st_eventsys;
265 #define _ST_IOQ (_st_this_vp.io_q) 263 #define _ST_IOQ (_st_this_vp.io_q)
266 #define _ST_ZOMBIEQ (_st_this_vp.zombie_q) 264 #define _ST_ZOMBIEQ (_st_this_vp.zombie_q)
267 #ifdef DEBUG 265 #ifdef DEBUG
268 -#define _ST_THREADQ (_st_this_vp.thread_q) 266 + #define _ST_THREADQ (_st_this_vp.thread_q)
269 #endif 267 #endif
270 268
271 #define _ST_PAGE_SIZE (_st_this_vp.pagesize) 269 #define _ST_PAGE_SIZE (_st_this_vp.pagesize)
@@ -293,8 +291,8 @@ extern _st_eventsys_t *_st_eventsys; @@ -293,8 +291,8 @@ extern _st_eventsys_t *_st_eventsys;
293 #define _ST_DEL_ZOMBIEQ(_thr) ST_REMOVE_LINK(&(_thr)->links) 291 #define _ST_DEL_ZOMBIEQ(_thr) ST_REMOVE_LINK(&(_thr)->links)
294 292
295 #ifdef DEBUG 293 #ifdef DEBUG
296 -#define _ST_ADD_THREADQ(_thr) ST_APPEND_LINK(&(_thr)->tlink, &_ST_THREADQ)  
297 -#define _ST_DEL_THREADQ(_thr) ST_REMOVE_LINK(&(_thr)->tlink) 294 + #define _ST_ADD_THREADQ(_thr) ST_APPEND_LINK(&(_thr)->tlink, &_ST_THREADQ)
  295 + #define _ST_DEL_THREADQ(_thr) ST_REMOVE_LINK(&(_thr)->tlink)
298 #endif 296 #endif
299 297
300 298
@@ -317,13 +315,12 @@ extern _st_eventsys_t *_st_eventsys; @@ -317,13 +315,12 @@ extern _st_eventsys_t *_st_eventsys;
317 #define _ST_FL_INTERRUPT 0x08 315 #define _ST_FL_INTERRUPT 0x08
318 #define _ST_FL_TIMEDOUT 0x10 316 #define _ST_FL_TIMEDOUT 0x10
319 317
320 -  
321 /***************************************** 318 /*****************************************
322 * Pointer conversion 319 * Pointer conversion
323 */ 320 */
324 321
325 #ifndef offsetof 322 #ifndef offsetof
326 -#define offsetof(type, identifier) ((size_t)&(((type *)0)->identifier)) 323 + #define offsetof(type, identifier) ((size_t)&(((type *)0)->identifier))
327 #endif 324 #endif
328 325
329 #define _ST_THREAD_PTR(_qp) \ 326 #define _ST_THREAD_PTR(_qp) \
@@ -339,7 +336,7 @@ extern _st_eventsys_t *_st_eventsys; @@ -339,7 +336,7 @@ extern _st_eventsys_t *_st_eventsys;
339 ((_st_pollq_t *)((char *)(_qp) - offsetof(_st_pollq_t, links))) 336 ((_st_pollq_t *)((char *)(_qp) - offsetof(_st_pollq_t, links)))
340 337
341 #ifdef DEBUG 338 #ifdef DEBUG
342 -#define _ST_THREAD_THREADQ_PTR(_qp) \ 339 + #define _ST_THREAD_THREADQ_PTR(_qp) \
343 ((_st_thread_t *)((char *)(_qp) - offsetof(_st_thread_t, tlink))) 340 ((_st_thread_t *)((char *)(_qp) - offsetof(_st_thread_t, tlink)))
344 #endif 341 #endif
345 342
@@ -349,21 +346,21 @@ extern _st_eventsys_t *_st_eventsys; @@ -349,21 +346,21 @@ extern _st_eventsys_t *_st_eventsys;
349 */ 346 */
350 347
351 #ifndef ST_UTIME_NO_TIMEOUT 348 #ifndef ST_UTIME_NO_TIMEOUT
352 -#define ST_UTIME_NO_TIMEOUT ((st_utime_t) -1LL) 349 + #define ST_UTIME_NO_TIMEOUT ((st_utime_t) -1LL)
353 #endif 350 #endif
354 351
355 #ifndef __ia64__ 352 #ifndef __ia64__
356 -#define ST_DEFAULT_STACK_SIZE (64*1024) 353 + #define ST_DEFAULT_STACK_SIZE (64*1024)
357 #else 354 #else
358 -#define ST_DEFAULT_STACK_SIZE (128*1024) /* Includes register stack size */ 355 + #define ST_DEFAULT_STACK_SIZE (128*1024) /* Includes register stack size */
359 #endif 356 #endif
360 357
361 #ifndef ST_KEYS_MAX 358 #ifndef ST_KEYS_MAX
362 -#define ST_KEYS_MAX 16 359 + #define ST_KEYS_MAX 16
363 #endif 360 #endif
364 361
365 #ifndef ST_MIN_POLLFDS_SIZE 362 #ifndef ST_MIN_POLLFDS_SIZE
366 -#define ST_MIN_POLLFDS_SIZE 64 363 + #define ST_MIN_POLLFDS_SIZE 64
367 #endif 364 #endif
368 365
369 366
@@ -372,28 +369,28 @@ extern _st_eventsys_t *_st_eventsys; @@ -372,28 +369,28 @@ extern _st_eventsys_t *_st_eventsys;
372 */ 369 */
373 370
374 #ifdef DEBUG 371 #ifdef DEBUG
375 -void _st_iterate_threads(void);  
376 -#define ST_DEBUG_ITERATE_THREADS() _st_iterate_threads() 372 + void _st_iterate_threads(void);
  373 + #define ST_DEBUG_ITERATE_THREADS() _st_iterate_threads()
377 #else 374 #else
378 -#define ST_DEBUG_ITERATE_THREADS() 375 + #define ST_DEBUG_ITERATE_THREADS()
379 #endif 376 #endif
380 377
381 #ifdef ST_SWITCH_CB 378 #ifdef ST_SWITCH_CB
382 -#define ST_SWITCH_OUT_CB(_thread) \ 379 + #define ST_SWITCH_OUT_CB(_thread) \
383 if (_st_this_vp.switch_out_cb != NULL && \ 380 if (_st_this_vp.switch_out_cb != NULL && \
384 _thread != _st_this_vp.idle_thread && \ 381 _thread != _st_this_vp.idle_thread && \
385 _thread->state != _ST_ST_ZOMBIE) { \ 382 _thread->state != _ST_ST_ZOMBIE) { \
386 _st_this_vp.switch_out_cb(); \ 383 _st_this_vp.switch_out_cb(); \
387 } 384 }
388 -#define ST_SWITCH_IN_CB(_thread) \ 385 + #define ST_SWITCH_IN_CB(_thread) \
389 if (_st_this_vp.switch_in_cb != NULL && \ 386 if (_st_this_vp.switch_in_cb != NULL && \
390 _thread != _st_this_vp.idle_thread && \ 387 _thread != _st_this_vp.idle_thread && \
391 _thread->state != _ST_ST_ZOMBIE) { \ 388 _thread->state != _ST_ST_ZOMBIE) { \
392 _st_this_vp.switch_in_cb(); \ 389 _st_this_vp.switch_in_cb(); \
393 } 390 }
394 #else 391 #else
395 -#define ST_SWITCH_OUT_CB(_thread)  
396 -#define ST_SWITCH_IN_CB(_thread) 392 + #define ST_SWITCH_OUT_CB(_thread)
  393 + #define ST_SWITCH_IN_CB(_thread)
397 #endif 394 #endif
398 395
399 /* 396 /*
@@ -424,9 +421,9 @@ void _st_iterate_threads(void); @@ -424,9 +421,9 @@ void _st_iterate_threads(void);
424 * Initialize the thread context preparing it to execute _main 421 * Initialize the thread context preparing it to execute _main
425 */ 422 */
426 #ifdef MD_INIT_CONTEXT 423 #ifdef MD_INIT_CONTEXT
427 -#define _ST_INIT_CONTEXT MD_INIT_CONTEXT 424 + #define _ST_INIT_CONTEXT MD_INIT_CONTEXT
428 #else 425 #else
429 -#error Unknown OS 426 + #error Unknown OS
430 #endif 427 #endif
431 428
432 /* 429 /*
@@ -456,11 +453,9 @@ int st_cond_destroy(_st_cond_t *cvar); @@ -456,11 +453,9 @@ int st_cond_destroy(_st_cond_t *cvar);
456 int st_cond_timedwait(_st_cond_t *cvar, st_utime_t timeout); 453 int st_cond_timedwait(_st_cond_t *cvar, st_utime_t timeout);
457 int st_cond_signal(_st_cond_t *cvar); 454 int st_cond_signal(_st_cond_t *cvar);
458 ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout); 455 ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout);
459 -ssize_t st_write(_st_netfd_t *fd, const void *buf, size_t nbyte,  
460 - st_utime_t timeout); 456 +ssize_t st_write(_st_netfd_t *fd, const void *buf, size_t nbyte, st_utime_t timeout);
461 int st_poll(struct pollfd *pds, int npds, st_utime_t timeout); 457 int st_poll(struct pollfd *pds, int npds, st_utime_t timeout);
462 -_st_thread_t *st_thread_create(void *(*start)(void *arg), void *arg,  
463 - int joinable, int stk_size); 458 +_st_thread_t *st_thread_create(void *(*start)(void *arg), void *arg, int joinable, int stk_size);
464 459
465 #endif /* !__ST_COMMON_H__ */ 460 #endif /* !__ST_COMMON_H__ */
466 461
@@ -43,163 +43,157 @@ @@ -43,163 +43,157 @@
43 #define __ST_MD_H__ 43 #define __ST_MD_H__
44 44
45 #if defined(ETIMEDOUT) && !defined(ETIME) 45 #if defined(ETIMEDOUT) && !defined(ETIME)
46 -#define ETIME ETIMEDOUT 46 + #define ETIME ETIMEDOUT
47 #endif 47 #endif
48 48
49 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) 49 #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
50 -#define MAP_ANON MAP_ANONYMOUS 50 + #define MAP_ANON MAP_ANONYMOUS
51 #endif 51 #endif
52 52
53 #ifndef MAP_FAILED 53 #ifndef MAP_FAILED
54 -#define MAP_FAILED -1 54 + #define MAP_FAILED -1
55 #endif 55 #endif
56 56
57 /***************************************** 57 /*****************************************
58 * Platform specifics 58 * Platform specifics
59 */ 59 */
60 -  
61 #if defined (AIX) 60 #if defined (AIX)
  61 + #define MD_STACK_GROWS_DOWN
  62 + #define MD_USE_SYSV_ANON_MMAP
  63 + #define MD_ACCEPT_NB_INHERITED
  64 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
62 65
63 -#define MD_STACK_GROWS_DOWN  
64 -#define MD_USE_SYSV_ANON_MMAP  
65 -#define MD_ACCEPT_NB_INHERITED  
66 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
67 -  
68 -#ifndef MD_HAVE_SOCKLEN_T  
69 -#define MD_HAVE_SOCKLEN_T  
70 -#define socklen_t unsigned long  
71 -#endif 66 + #ifndef MD_HAVE_SOCKLEN_T
  67 + #define MD_HAVE_SOCKLEN_T
  68 + #define socklen_t unsigned long
  69 + #endif
72 70
73 -#define MD_SETJMP(env) _setjmp(env)  
74 -#define MD_LONGJMP(env, val) _longjmp(env, val) 71 + #define MD_SETJMP(env) _setjmp(env)
  72 + #define MD_LONGJMP(env, val) _longjmp(env, val)
75 73
76 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 74 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
77 ST_BEGIN_MACRO \ 75 ST_BEGIN_MACRO \
78 if (MD_SETJMP((_thread)->context)) \ 76 if (MD_SETJMP((_thread)->context)) \
79 _main(); \ 77 _main(); \
80 (_thread)->context[3] = (long) (_sp); \ 78 (_thread)->context[3] = (long) (_sp); \
81 ST_END_MACRO 79 ST_END_MACRO
82 80
83 -#define MD_GET_UTIME() \ 81 + #define MD_GET_UTIME() \
84 timebasestruct_t rt; \ 82 timebasestruct_t rt; \
85 (void) read_real_time(&rt, TIMEBASE_SZ); \ 83 (void) read_real_time(&rt, TIMEBASE_SZ); \
86 (void) time_base_to_time(&rt, TIMEBASE_SZ); \ 84 (void) time_base_to_time(&rt, TIMEBASE_SZ); \
87 return (rt.tb_high * 1000000LL + rt.tb_low / 1000) 85 return (rt.tb_high * 1000000LL + rt.tb_low / 1000)
88 86
89 #elif defined (CYGWIN) 87 #elif defined (CYGWIN)
  88 + #define MD_STACK_GROWS_DOWN
  89 + #define MD_USE_BSD_ANON_MMAP
  90 + #define MD_ACCEPT_NB_NOT_INHERITED
  91 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
90 92
91 -#define MD_STACK_GROWS_DOWN  
92 -#define MD_USE_BSD_ANON_MMAP  
93 -#define MD_ACCEPT_NB_NOT_INHERITED  
94 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT 93 + #define MD_SETJMP(env) setjmp(env)
  94 + #define MD_LONGJMP(env, val) longjmp(env, val)
95 95
96 -#define MD_SETJMP(env) setjmp(env)  
97 -#define MD_LONGJMP(env, val) longjmp(env, val) 96 + #define MD_JB_SP 7
98 97
99 -#define MD_JB_SP 7 98 + #define MD_GET_SP(_t) (_t)->context[MD_JB_SP]
100 99
101 -#define MD_GET_SP(_t) (_t)->context[MD_JB_SP]  
102 -  
103 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 100 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
104 ST_BEGIN_MACRO \ 101 ST_BEGIN_MACRO \
105 if (MD_SETJMP((_thread)->context)) \ 102 if (MD_SETJMP((_thread)->context)) \
106 _main(); \ 103 _main(); \
107 MD_GET_SP(_thread) = (long) (_sp); \ 104 MD_GET_SP(_thread) = (long) (_sp); \
108 ST_END_MACRO 105 ST_END_MACRO
109 106
110 -#define MD_GET_UTIME() \ 107 + #define MD_GET_UTIME() \
111 struct timeval tv; \ 108 struct timeval tv; \
112 (void) gettimeofday(&tv, NULL); \ 109 (void) gettimeofday(&tv, NULL); \
113 return (tv.tv_sec * 1000000LL + tv.tv_usec) 110 return (tv.tv_sec * 1000000LL + tv.tv_usec)
114 111
115 #elif defined (DARWIN) 112 #elif defined (DARWIN)
116 -  
117 -#define MD_STACK_GROWS_DOWN  
118 -#define MD_USE_BSD_ANON_MMAP  
119 -#define MD_ACCEPT_NB_INHERITED  
120 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
121 -#define MD_HAVE_SOCKLEN_T  
122 -  
123 -#define MD_SETJMP(env) _setjmp(env)  
124 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
125 -  
126 -#if defined(__ppc__)  
127 -#define MD_JB_SP 0  
128 -#elif defined(__i386__)  
129 -#define MD_JB_SP 9  
130 -#elif defined(__x86_64__)  
131 -#define MD_JB_SP 4  
132 -#else  
133 -#error Unknown CPU architecture  
134 -#endif  
135 -  
136 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 113 + #define MD_STACK_GROWS_DOWN
  114 + #define MD_USE_BSD_ANON_MMAP
  115 + #define MD_ACCEPT_NB_INHERITED
  116 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
  117 + #define MD_HAVE_SOCKLEN_T
  118 +
  119 + #define MD_SETJMP(env) _setjmp(env)
  120 + #define MD_LONGJMP(env, val) _longjmp(env, val)
  121 +
  122 + #if defined(__ppc__)
  123 + #define MD_JB_SP 0
  124 + #elif defined(__i386__)
  125 + #define MD_JB_SP 9
  126 + #elif defined(__x86_64__)
  127 + #define MD_JB_SP 4
  128 + #else
  129 + #error Unknown CPU architecture
  130 + #endif
  131 +
  132 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
137 ST_BEGIN_MACRO \ 133 ST_BEGIN_MACRO \
138 if (MD_SETJMP((_thread)->context)) \ 134 if (MD_SETJMP((_thread)->context)) \
139 _main(); \ 135 _main(); \
140 *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \ 136 *((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \
141 ST_END_MACRO 137 ST_END_MACRO
142 138
143 -#define MD_GET_UTIME() \ 139 + #define MD_GET_UTIME() \
144 struct timeval tv; \ 140 struct timeval tv; \
145 (void) gettimeofday(&tv, NULL); \ 141 (void) gettimeofday(&tv, NULL); \
146 return (tv.tv_sec * 1000000LL + tv.tv_usec) 142 return (tv.tv_sec * 1000000LL + tv.tv_usec)
147 143
148 #elif defined (FREEBSD) 144 #elif defined (FREEBSD)
149 -  
150 -#define MD_STACK_GROWS_DOWN  
151 -#define MD_USE_BSD_ANON_MMAP  
152 -#define MD_ACCEPT_NB_INHERITED  
153 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
154 -  
155 -#define MD_SETJMP(env) _setjmp(env)  
156 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
157 -  
158 -#if defined(__i386__)  
159 -#define MD_JB_SP 2  
160 -#elif defined(__alpha__)  
161 -#define MD_JB_SP 34  
162 -#elif defined(__amd64__)  
163 -#define MD_JB_SP 2  
164 -#else  
165 -#error Unknown CPU architecture  
166 -#endif  
167 -  
168 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 145 + #define MD_STACK_GROWS_DOWN
  146 + #define MD_USE_BSD_ANON_MMAP
  147 + #define MD_ACCEPT_NB_INHERITED
  148 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
  149 +
  150 + #define MD_SETJMP(env) _setjmp(env)
  151 + #define MD_LONGJMP(env, val) _longjmp(env, val)
  152 +
  153 + #if defined(__i386__)
  154 + #define MD_JB_SP 2
  155 + #elif defined(__alpha__)
  156 + #define MD_JB_SP 34
  157 + #elif defined(__amd64__)
  158 + #define MD_JB_SP 2
  159 + #else
  160 + #error Unknown CPU architecture
  161 + #endif
  162 +
  163 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
169 ST_BEGIN_MACRO \ 164 ST_BEGIN_MACRO \
170 if (MD_SETJMP((_thread)->context)) \ 165 if (MD_SETJMP((_thread)->context)) \
171 _main(); \ 166 _main(); \
172 (_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \ 167 (_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \
173 ST_END_MACRO 168 ST_END_MACRO
174 169
175 -#define MD_GET_UTIME() \ 170 + #define MD_GET_UTIME() \
176 struct timeval tv; \ 171 struct timeval tv; \
177 (void) gettimeofday(&tv, NULL); \ 172 (void) gettimeofday(&tv, NULL); \
178 return (tv.tv_sec * 1000000LL + tv.tv_usec) 173 return (tv.tv_sec * 1000000LL + tv.tv_usec)
179 174
180 #elif defined (HPUX) 175 #elif defined (HPUX)
  176 + #define MD_STACK_GROWS_UP
  177 + #define MD_USE_BSD_ANON_MMAP
  178 + #define MD_ACCEPT_NB_INHERITED
  179 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
181 180
182 -#define MD_STACK_GROWS_UP  
183 -#define MD_USE_BSD_ANON_MMAP  
184 -#define MD_ACCEPT_NB_INHERITED  
185 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT 181 + #define MD_SETJMP(env) _setjmp(env)
  182 + #define MD_LONGJMP(env, val) _longjmp(env, val)
186 183
187 -#define MD_SETJMP(env) _setjmp(env)  
188 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
189 -  
190 -#ifndef __LP64__  
191 -/* 32-bit mode (ILP32 data model) */  
192 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 184 + #ifndef __LP64__
  185 + /* 32-bit mode (ILP32 data model) */
  186 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
193 ST_BEGIN_MACRO \ 187 ST_BEGIN_MACRO \
194 if (MD_SETJMP((_thread)->context)) \ 188 if (MD_SETJMP((_thread)->context)) \
195 _main(); \ 189 _main(); \
196 ((long *)((_thread)->context))[1] = (long) (_sp); \ 190 ((long *)((_thread)->context))[1] = (long) (_sp); \
197 ST_END_MACRO 191 ST_END_MACRO
198 -#else  
199 -/* 64-bit mode (LP64 data model) */  
200 -#define MD_STACK_PAD_SIZE 256  
201 -/* Last stack frame must be preserved */  
202 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 192 + #else
  193 + /* 64-bit mode (LP64 data model) */
  194 + #define MD_STACK_PAD_SIZE 256
  195 + /* Last stack frame must be preserved */
  196 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
203 ST_BEGIN_MACRO \ 197 ST_BEGIN_MACRO \
204 if (MD_SETJMP((_thread)->context)) \ 198 if (MD_SETJMP((_thread)->context)) \
205 _main(); \ 199 _main(); \
@@ -208,33 +202,32 @@ @@ -208,33 +202,32 @@
208 MD_STACK_PAD_SIZE); \ 202 MD_STACK_PAD_SIZE); \
209 ((long *)((_thread)->context))[1] = (long) (_sp); \ 203 ((long *)((_thread)->context))[1] = (long) (_sp); \
210 ST_END_MACRO 204 ST_END_MACRO
211 -#endif /* !__LP64__ */ 205 + #endif /* !__LP64__ */
212 206
213 -#define MD_GET_UTIME() \ 207 + #define MD_GET_UTIME() \
214 struct timeval tv; \ 208 struct timeval tv; \
215 (void) gettimeofday(&tv, NULL); \ 209 (void) gettimeofday(&tv, NULL); \
216 return (tv.tv_sec * 1000000LL + tv.tv_usec) 210 return (tv.tv_sec * 1000000LL + tv.tv_usec)
217 211
218 #elif defined (IRIX) 212 #elif defined (IRIX)
  213 + #include <sys/syssgi.h>
219 214
220 -#include <sys/syssgi.h> 215 + #define MD_STACK_GROWS_DOWN
  216 + #define MD_USE_SYSV_ANON_MMAP
  217 + #define MD_ACCEPT_NB_INHERITED
  218 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
221 219
222 -#define MD_STACK_GROWS_DOWN  
223 -#define MD_USE_SYSV_ANON_MMAP  
224 -#define MD_ACCEPT_NB_INHERITED  
225 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT 220 + #define MD_SETJMP(env) setjmp(env)
  221 + #define MD_LONGJMP(env, val) longjmp(env, val)
226 222
227 -#define MD_SETJMP(env) setjmp(env)  
228 -#define MD_LONGJMP(env, val) longjmp(env, val)  
229 -  
230 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 223 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
231 ST_BEGIN_MACRO \ 224 ST_BEGIN_MACRO \
232 (void) MD_SETJMP((_thread)->context); \ 225 (void) MD_SETJMP((_thread)->context); \
233 (_thread)->context[JB_SP] = (long) (_sp); \ 226 (_thread)->context[JB_SP] = (long) (_sp); \
234 (_thread)->context[JB_PC] = (long) _main; \ 227 (_thread)->context[JB_PC] = (long) _main; \
235 ST_END_MACRO 228 ST_END_MACRO
236 229
237 -#define MD_GET_UTIME() \ 230 + #define MD_GET_UTIME() \
238 static int inited = 0; \ 231 static int inited = 0; \
239 static clockid_t clock_id = CLOCK_SGI_CYCLE; \ 232 static clockid_t clock_id = CLOCK_SGI_CYCLE; \
240 struct timespec ts; \ 233 struct timespec ts; \
@@ -246,7 +239,7 @@ @@ -246,7 +239,7 @@
246 (void) clock_gettime(clock_id, &ts); \ 239 (void) clock_gettime(clock_id, &ts); \
247 return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000) 240 return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000)
248 241
249 -/* 242 + /*
250 * Cap the stack by zeroing out the saved return address register 243 * Cap the stack by zeroing out the saved return address register
251 * value. This allows libexc, used by SpeedShop, to know when to stop 244 * value. This allows libexc, used by SpeedShop, to know when to stop
252 * backtracing since it won't find main, start, or any other known 245 * backtracing since it won't find main, start, or any other known
@@ -257,38 +250,37 @@ @@ -257,38 +250,37 @@
257 * automatic variables are added to the _st_thread_main() routine, because 250 * automatic variables are added to the _st_thread_main() routine, because
258 * the address where ra is stored will change. 251 * the address where ra is stored will change.
259 */ 252 */
260 -#if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32  
261 -#define MD_CAP_STACK(var_addr) \ 253 + #if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
  254 + #define MD_CAP_STACK(var_addr) \
262 (((volatile __uint64_t *)(var_addr))[1] = 0) 255 (((volatile __uint64_t *)(var_addr))[1] = 0)
263 -#endif 256 + #endif
264 257
265 #elif defined (LINUX) 258 #elif defined (LINUX)
266 -  
267 -/* 259 + /*
268 * These are properties of the linux kernel and are the same on every 260 * These are properties of the linux kernel and are the same on every
269 * flavor and architecture. 261 * flavor and architecture.
270 */ 262 */
271 -#define MD_USE_BSD_ANON_MMAP  
272 -#define MD_ACCEPT_NB_NOT_INHERITED  
273 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
274 -/* 263 + #define MD_USE_BSD_ANON_MMAP
  264 + #define MD_ACCEPT_NB_NOT_INHERITED
  265 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
  266 + /*
275 * Modern GNU/Linux is Posix.1g compliant. 267 * Modern GNU/Linux is Posix.1g compliant.
276 */ 268 */
277 -#define MD_HAVE_SOCKLEN_T 269 + #define MD_HAVE_SOCKLEN_T
278 270
279 -/* 271 + /*
280 * All architectures and flavors of linux have the gettimeofday 272 * All architectures and flavors of linux have the gettimeofday
281 * function but if you know of a faster way, use it. 273 * function but if you know of a faster way, use it.
282 */ 274 */
283 -#define MD_GET_UTIME() \ 275 + #define MD_GET_UTIME() \
284 struct timeval tv; \ 276 struct timeval tv; \
285 (void) gettimeofday(&tv, NULL); \ 277 (void) gettimeofday(&tv, NULL); \
286 return (tv.tv_sec * 1000000LL + tv.tv_usec) 278 return (tv.tv_sec * 1000000LL + tv.tv_usec)
287 279
288 -#if defined(__ia64__)  
289 -#define MD_STACK_GROWS_DOWN 280 + #if defined(__ia64__)
  281 + #define MD_STACK_GROWS_DOWN
290 282
291 -/* 283 + /*
292 * IA-64 architecture. Besides traditional memory call stack, IA-64 284 * IA-64 architecture. Besides traditional memory call stack, IA-64
293 * uses general register stack. Thus each thread needs a backing store 285 * uses general register stack. Thus each thread needs a backing store
294 * for register stack in addition to memory stack. Standard 286 * for register stack in addition to memory stack. Standard
@@ -296,14 +288,14 @@ @@ -296,14 +288,14 @@
296 * because their implementation implicitly assumes that only one 288 * because their implementation implicitly assumes that only one
297 * register stack exists. 289 * register stack exists.
298 */ 290 */
299 -#ifdef USE_LIBC_SETJMP  
300 -#undef USE_LIBC_SETJMP  
301 -#endif  
302 -#define MD_USE_BUILTIN_SETJMP  
303 -  
304 -#define MD_STACK_PAD_SIZE 128  
305 -/* Last register stack frame must be preserved */  
306 -#define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \ 291 + #ifdef USE_LIBC_SETJMP
  292 + #undef USE_LIBC_SETJMP
  293 + #endif
  294 + #define MD_USE_BUILTIN_SETJMP
  295 +
  296 + #define MD_STACK_PAD_SIZE 128
  297 + /* Last register stack frame must be preserved */
  298 + #define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \
307 ST_BEGIN_MACRO \ 299 ST_BEGIN_MACRO \
308 if (MD_SETJMP((_thread)->context)) \ 300 if (MD_SETJMP((_thread)->context)) \
309 _main(); \ 301 _main(); \
@@ -313,28 +305,24 @@ @@ -313,28 +305,24 @@
313 (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \ 305 (_thread)->context[0].__jmpbuf[0] = (long) (_sp); \
314 (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \ 306 (_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \
315 ST_END_MACRO 307 ST_END_MACRO
  308 + #elif defined(__mips__)
  309 + #define MD_STACK_GROWS_DOWN
316 310
317 -#elif defined(__mips__)  
318 -#define MD_STACK_GROWS_DOWN  
319 -  
320 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 311 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
321 ST_BEGIN_MACRO \ 312 ST_BEGIN_MACRO \
322 MD_SETJMP((_thread)->context); \ 313 MD_SETJMP((_thread)->context); \
323 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \ 314 _thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
324 _thread->context[0].__jmpbuf[0].__sp = _sp; \ 315 _thread->context[0].__jmpbuf[0].__sp = _sp; \
325 ST_END_MACRO 316 ST_END_MACRO
326 -  
327 -#else /* Not IA-64 or mips */  
328 -  
329 -/* 317 + #else /* Not IA-64 or mips */
  318 + /*
330 * On linux, there are a few styles of jmpbuf format. These vary based 319 * On linux, there are a few styles of jmpbuf format. These vary based
331 * on architecture/glibc combination. 320 * on architecture/glibc combination.
332 * 321 *
333 * Most of the glibc based toggles were lifted from: 322 * Most of the glibc based toggles were lifted from:
334 * mozilla/nsprpub/pr/include/md/_linux.h 323 * mozilla/nsprpub/pr/include/md/_linux.h
335 */ 324 */
336 -  
337 -/* 325 + /*
338 * Starting with glibc 2.4, JB_SP definitions are not public anymore. 326 * Starting with glibc 2.4, JB_SP definitions are not public anymore.
339 * They, however, can still be found in glibc source tree in 327 * They, however, can still be found in glibc source tree in
340 * architecture-specific "jmpbuf-offsets.h" files. 328 * architecture-specific "jmpbuf-offsets.h" files.
@@ -345,282 +333,270 @@ @@ -345,282 +333,270 @@
345 * functions as a setjmp/longjmp replacement wherever they are available 333 * functions as a setjmp/longjmp replacement wherever they are available
346 * unless USE_LIBC_SETJMP is defined. 334 * unless USE_LIBC_SETJMP is defined.
347 */ 335 */
348 -  
349 -#if defined(__powerpc__)  
350 -#define MD_STACK_GROWS_DOWN  
351 -  
352 -#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)  
353 -#ifndef JB_GPR1  
354 -#define JB_GPR1 0  
355 -#endif  
356 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]  
357 -#else  
358 -/* not an error but certainly cause for caution */  
359 -#error "Untested use of old glibc on powerpc"  
360 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]  
361 -#endif /* glibc 2.1 or later */  
362 -  
363 -#elif defined(__alpha)  
364 -#define MD_STACK_GROWS_DOWN  
365 -  
366 -#if defined(__GLIBC__) && __GLIBC__ >= 2  
367 -#ifndef JB_SP  
368 -#define JB_SP 8  
369 -#endif  
370 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]  
371 -#else  
372 -/* not an error but certainly cause for caution */  
373 -#error "Untested use of old glibc on alpha"  
374 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp  
375 -#endif  
376 -  
377 -#elif defined(__mc68000__)  
378 -#define MD_STACK_GROWS_DOWN  
379 -  
380 -/* m68k still uses old style sigjmp_buf */  
381 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp  
382 -  
383 -#elif defined(__sparc__)  
384 -#define MD_STACK_GROWS_DOWN  
385 -  
386 -#if defined(__GLIBC__) && __GLIBC__ >= 2  
387 -#ifndef JB_SP  
388 -#define JB_SP 0  
389 -#endif  
390 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]  
391 -#else  
392 -/* not an error but certainly cause for caution */  
393 -#error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"  
394 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp  
395 -#endif  
396 -  
397 -#elif defined(__i386__)  
398 -#define MD_STACK_GROWS_DOWN  
399 -#define MD_USE_BUILTIN_SETJMP  
400 -  
401 -#if defined(__GLIBC__) && __GLIBC__ >= 2  
402 -#ifndef JB_SP  
403 -#define JB_SP 4  
404 -#endif  
405 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]  
406 -#else  
407 -/* not an error but certainly cause for caution */  
408 -#error "Untested use of old glibc on i386"  
409 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp  
410 -#endif  
411 -  
412 -#elif defined(__amd64__) || defined(__x86_64__)  
413 -#define MD_STACK_GROWS_DOWN  
414 -#define MD_USE_BUILTIN_SETJMP  
415 -  
416 -#ifndef JB_RSP  
417 -#define JB_RSP 6  
418 -#endif  
419 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]  
420 -  
421 -#elif defined(__arm__)  
422 -#define MD_STACK_GROWS_DOWN  
423 -  
424 -#if defined(__GLIBC__) && __GLIBC__ >= 2  
425 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[20]  
426 -#else  
427 -#error "ARM/Linux pre-glibc2 not supported yet"  
428 -#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */  
429 -  
430 -#elif defined(__s390__)  
431 -#define MD_STACK_GROWS_DOWN  
432 -  
433 -/* There is no JB_SP in glibc at this time. (glibc 2.2.5) 336 + #if defined(__powerpc__)
  337 + #define MD_STACK_GROWS_DOWN
  338 +
  339 + #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
  340 + #ifndef JB_GPR1
  341 + #define JB_GPR1 0
  342 + #endif
  343 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]
  344 + #else
  345 + /* not an error but certainly cause for caution */
  346 + #error "Untested use of old glibc on powerpc"
  347 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]
  348 + #endif /* glibc 2.1 or later */
  349 + #elif defined(__alpha)
  350 + #define MD_STACK_GROWS_DOWN
  351 +
  352 + #if defined(__GLIBC__) && __GLIBC__ >= 2
  353 + #ifndef JB_SP
  354 + #define JB_SP 8
  355 + #endif
  356 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
  357 + #else
  358 + /* not an error but certainly cause for caution */
  359 + #error "Untested use of old glibc on alpha"
  360 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
  361 + #endif
  362 + #elif defined(__mc68000__)
  363 + #define MD_STACK_GROWS_DOWN
  364 +
  365 + /* m68k still uses old style sigjmp_buf */
  366 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
  367 + #elif defined(__sparc__)
  368 + #define MD_STACK_GROWS_DOWN
  369 +
  370 + #if defined(__GLIBC__) && __GLIBC__ >= 2
  371 + #ifndef JB_SP
  372 + #define JB_SP 0
  373 + #endif
  374 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
  375 + #else
  376 + /* not an error but certainly cause for caution */
  377 + #error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"
  378 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp
  379 + #endif
  380 + #elif defined(__i386__)
  381 + #define MD_STACK_GROWS_DOWN
  382 + #define MD_USE_BUILTIN_SETJMP
  383 +
  384 + #if defined(__GLIBC__) && __GLIBC__ >= 2
  385 + #ifndef JB_SP
  386 + #define JB_SP 4
  387 + #endif
  388 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
  389 + #else
  390 + /* not an error but certainly cause for caution */
  391 + #error "Untested use of old glibc on i386"
  392 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
  393 + #endif
  394 + #elif defined(__amd64__) || defined(__x86_64__)
  395 + #define MD_STACK_GROWS_DOWN
  396 + #define MD_USE_BUILTIN_SETJMP
  397 +
  398 + #ifndef JB_RSP
  399 + #define JB_RSP 6
  400 + #endif
  401 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]
  402 + #elif defined(__arm__)
  403 + #define MD_STACK_GROWS_DOWN
  404 +
  405 + #if defined(__GLIBC__) && __GLIBC__ >= 2
  406 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[8]
  407 + #else
  408 + #error "ARM/Linux pre-glibc2 not supported yet"
  409 + #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
  410 + #elif defined(__s390__)
  411 + #define MD_STACK_GROWS_DOWN
  412 +
  413 + /* There is no JB_SP in glibc at this time. (glibc 2.2.5)
434 */ 414 */
435 -#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]  
436 -  
437 -#elif defined(__hppa__)  
438 -#define MD_STACK_GROWS_UP 415 + #define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]
  416 + #elif defined(__hppa__)
  417 + #define MD_STACK_GROWS_UP
439 418
440 -/* yes, this is gross, unfortunately at the moment (2002/08/01) there is 419 + /* yes, this is gross, unfortunately at the moment (2002/08/01) there is
441 * a bug in hppa's glibc header definition for JB_SP, so we can't 420 * a bug in hppa's glibc header definition for JB_SP, so we can't
442 * use that... 421 * use that...
443 */ 422 */
444 -#define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76)) 423 + #define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))
  424 + #else
  425 + #error "Unknown CPU architecture"
  426 + #endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
445 427
446 -#else  
447 -#error "Unknown CPU architecture"  
448 -#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */  
449 -  
450 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 428 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
451 ST_BEGIN_MACRO \ 429 ST_BEGIN_MACRO \
452 if (MD_SETJMP((_thread)->context)) \ 430 if (MD_SETJMP((_thread)->context)) \
453 _main(); \ 431 _main(); \
454 MD_GET_SP(_thread) = (long) (_sp); \ 432 MD_GET_SP(_thread) = (long) (_sp); \
455 ST_END_MACRO 433 ST_END_MACRO
  434 + #endif /* Cases with different MD_INIT_CONTEXT */
456 435
457 -#endif /* Cases with different MD_INIT_CONTEXT */  
458 -  
459 -#if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)  
460 -#define MD_SETJMP(env) _st_md_cxt_save(env)  
461 -#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val) 436 + #if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
  437 + #define MD_SETJMP(env) _st_md_cxt_save(env)
  438 + #define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
462 439
463 -extern int _st_md_cxt_save(jmp_buf env);  
464 -extern void _st_md_cxt_restore(jmp_buf env, int val);  
465 -#else  
466 -#define MD_SETJMP(env) setjmp(env)  
467 -#define MD_LONGJMP(env, val) longjmp(env, val)  
468 -#endif 440 + extern int _st_md_cxt_save(jmp_buf env);
  441 + extern void _st_md_cxt_restore(jmp_buf env, int val);
  442 + #else
  443 + #define MD_SETJMP(env) setjmp(env)
  444 + #define MD_LONGJMP(env, val) longjmp(env, val)
  445 + #endif
469 446
470 #elif defined (NETBSD) 447 #elif defined (NETBSD)
471 -  
472 -#define MD_STACK_GROWS_DOWN  
473 -#define MD_USE_BSD_ANON_MMAP  
474 -#define MD_ACCEPT_NB_INHERITED  
475 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
476 -#define MD_HAVE_SOCKLEN_T  
477 -  
478 -#define MD_SETJMP(env) _setjmp(env)  
479 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
480 -  
481 -#if defined(__i386__)  
482 -#define MD_JB_SP 2  
483 -#elif defined(__alpha__)  
484 -#define MD_JB_SP 34  
485 -#elif defined(__sparc__)  
486 -#define MD_JB_SP 0  
487 -#elif defined(__vax__)  
488 -#define MD_JB_SP 2  
489 -#else  
490 -#error Unknown CPU architecture  
491 -#endif  
492 -  
493 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 448 + #define MD_STACK_GROWS_DOWN
  449 + #define MD_USE_BSD_ANON_MMAP
  450 + #define MD_ACCEPT_NB_INHERITED
  451 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
  452 + #define MD_HAVE_SOCKLEN_T
  453 +
  454 + #define MD_SETJMP(env) _setjmp(env)
  455 + #define MD_LONGJMP(env, val) _longjmp(env, val)
  456 +
  457 + #if defined(__i386__)
  458 + #define MD_JB_SP 2
  459 + #elif defined(__alpha__)
  460 + #define MD_JB_SP 34
  461 + #elif defined(__sparc__)
  462 + #define MD_JB_SP 0
  463 + #elif defined(__vax__)
  464 + #define MD_JB_SP 2
  465 + #else
  466 + #error Unknown CPU architecture
  467 + #endif
  468 +
  469 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
494 ST_BEGIN_MACRO \ 470 ST_BEGIN_MACRO \
495 if (MD_SETJMP((_thread)->context)) \ 471 if (MD_SETJMP((_thread)->context)) \
496 _main(); \ 472 _main(); \
497 (_thread)->context[MD_JB_SP] = (long) (_sp); \ 473 (_thread)->context[MD_JB_SP] = (long) (_sp); \
498 ST_END_MACRO 474 ST_END_MACRO
499 475
500 -#define MD_GET_UTIME() \ 476 + #define MD_GET_UTIME() \
501 struct timeval tv; \ 477 struct timeval tv; \
502 (void) gettimeofday(&tv, NULL); \ 478 (void) gettimeofday(&tv, NULL); \
503 return (tv.tv_sec * 1000000LL + tv.tv_usec) 479 return (tv.tv_sec * 1000000LL + tv.tv_usec)
504 480
505 #elif defined (OPENBSD) 481 #elif defined (OPENBSD)
506 -  
507 -#define MD_STACK_GROWS_DOWN  
508 -#define MD_USE_BSD_ANON_MMAP  
509 -#define MD_ACCEPT_NB_INHERITED  
510 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT  
511 -  
512 -#define MD_SETJMP(env) _setjmp(env)  
513 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
514 -  
515 -#if defined(__i386__)  
516 -#define MD_JB_SP 2  
517 -#elif defined(__alpha__)  
518 -#define MD_JB_SP 34  
519 -#elif defined(__sparc__)  
520 -#define MD_JB_SP 0  
521 -#elif defined(__amd64__)  
522 -#define MD_JB_SP 6  
523 -#else  
524 -#error Unknown CPU architecture  
525 -#endif  
526 -  
527 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 482 + #define MD_STACK_GROWS_DOWN
  483 + #define MD_USE_BSD_ANON_MMAP
  484 + #define MD_ACCEPT_NB_INHERITED
  485 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
  486 +
  487 + #define MD_SETJMP(env) _setjmp(env)
  488 + #define MD_LONGJMP(env, val) _longjmp(env, val)
  489 +
  490 + #if defined(__i386__)
  491 + #define MD_JB_SP 2
  492 + #elif defined(__alpha__)
  493 + #define MD_JB_SP 34
  494 + #elif defined(__sparc__)
  495 + #define MD_JB_SP 0
  496 + #elif defined(__amd64__)
  497 + #define MD_JB_SP 6
  498 + #else
  499 + #error Unknown CPU architecture
  500 + #endif
  501 +
  502 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
528 ST_BEGIN_MACRO \ 503 ST_BEGIN_MACRO \
529 if (MD_SETJMP((_thread)->context)) \ 504 if (MD_SETJMP((_thread)->context)) \
530 _main(); \ 505 _main(); \
531 (_thread)->context[MD_JB_SP] = (long) (_sp); \ 506 (_thread)->context[MD_JB_SP] = (long) (_sp); \
532 ST_END_MACRO 507 ST_END_MACRO
533 508
534 -#define MD_GET_UTIME() \ 509 + #define MD_GET_UTIME() \
535 struct timeval tv; \ 510 struct timeval tv; \
536 (void) gettimeofday(&tv, NULL); \ 511 (void) gettimeofday(&tv, NULL); \
537 return (tv.tv_sec * 1000000LL + tv.tv_usec) 512 return (tv.tv_sec * 1000000LL + tv.tv_usec)
538 513
539 #elif defined (OSF1) 514 #elif defined (OSF1)
  515 + #include <signal.h>
540 516
541 -#include <signal.h> 517 + #define MD_STACK_GROWS_DOWN
  518 + #define MD_USE_SYSV_ANON_MMAP
  519 + #define MD_ACCEPT_NB_NOT_INHERITED
  520 + #define MD_ALWAYS_UNSERIALIZED_ACCEPT
542 521
543 -#define MD_STACK_GROWS_DOWN  
544 -#define MD_USE_SYSV_ANON_MMAP  
545 -#define MD_ACCEPT_NB_NOT_INHERITED  
546 -#define MD_ALWAYS_UNSERIALIZED_ACCEPT 522 + #define MD_SETJMP(env) _setjmp(env)
  523 + #define MD_LONGJMP(env, val) _longjmp(env, val)
547 524
548 -#define MD_SETJMP(env) _setjmp(env)  
549 -#define MD_LONGJMP(env, val) _longjmp(env, val)  
550 -  
551 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 525 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
552 ST_BEGIN_MACRO \ 526 ST_BEGIN_MACRO \
553 if (MD_SETJMP((_thread)->context)) \ 527 if (MD_SETJMP((_thread)->context)) \
554 _main(); \ 528 _main(); \
555 ((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \ 529 ((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \
556 ST_END_MACRO 530 ST_END_MACRO
557 531
558 -#define MD_GET_UTIME() \ 532 + #define MD_GET_UTIME() \
559 struct timeval tv; \ 533 struct timeval tv; \
560 (void) gettimeofday(&tv, NULL); \ 534 (void) gettimeofday(&tv, NULL); \
561 return (tv.tv_sec * 1000000LL + tv.tv_usec) 535 return (tv.tv_sec * 1000000LL + tv.tv_usec)
562 536
563 #elif defined (SOLARIS) 537 #elif defined (SOLARIS)
  538 + #include <sys/filio.h>
  539 + extern int getpagesize(void);
564 540
565 -#include <sys/filio.h>  
566 -extern int getpagesize(void);  
567 -  
568 -#define MD_STACK_GROWS_DOWN  
569 -#define MD_USE_SYSV_ANON_MMAP  
570 -#define MD_ACCEPT_NB_NOT_INHERITED 541 + #define MD_STACK_GROWS_DOWN
  542 + #define MD_USE_SYSV_ANON_MMAP
  543 + #define MD_ACCEPT_NB_NOT_INHERITED
571 544
572 -#define MD_SETJMP(env) setjmp(env)  
573 -#define MD_LONGJMP(env, val) longjmp(env, val) 545 + #define MD_SETJMP(env) setjmp(env)
  546 + #define MD_LONGJMP(env, val) longjmp(env, val)
574 547
575 -#if defined(sparc) || defined(__sparc)  
576 -#ifdef _LP64  
577 -#define MD_STACK_PAD_SIZE 4095  
578 -#endif  
579 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 548 + #if defined(sparc) || defined(__sparc)
  549 + #ifdef _LP64
  550 + #define MD_STACK_PAD_SIZE 4095
  551 + #endif
  552 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
580 ST_BEGIN_MACRO \ 553 ST_BEGIN_MACRO \
581 (void) MD_SETJMP((_thread)->context); \ 554 (void) MD_SETJMP((_thread)->context); \
582 (_thread)->context[1] = (long) (_sp); \ 555 (_thread)->context[1] = (long) (_sp); \
583 (_thread)->context[2] = (long) _main; \ 556 (_thread)->context[2] = (long) _main; \
584 ST_END_MACRO 557 ST_END_MACRO
585 -#elif defined(i386) || defined(__i386)  
586 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 558 + #elif defined(i386) || defined(__i386)
  559 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
587 ST_BEGIN_MACRO \ 560 ST_BEGIN_MACRO \
588 (void) MD_SETJMP((_thread)->context); \ 561 (void) MD_SETJMP((_thread)->context); \
589 (_thread)->context[4] = (long) (_sp); \ 562 (_thread)->context[4] = (long) (_sp); \
590 (_thread)->context[5] = (long) _main; \ 563 (_thread)->context[5] = (long) _main; \
591 ST_END_MACRO 564 ST_END_MACRO
592 -#elif defined(__amd64__)  
593 -#define MD_INIT_CONTEXT(_thread, _sp, _main) \ 565 + #elif defined(__amd64__)
  566 + #define MD_INIT_CONTEXT(_thread, _sp, _main) \
594 ST_BEGIN_MACRO \ 567 ST_BEGIN_MACRO \
595 if (MD_SETJMP((_thread)->context)) \ 568 if (MD_SETJMP((_thread)->context)) \
596 _main(); \ 569 _main(); \
597 (_thread)->context[6] = (long) (_sp); \ 570 (_thread)->context[6] = (long) (_sp); \
598 ST_END_MACRO 571 ST_END_MACRO
599 -#else  
600 -#error Unknown CPU architecture  
601 -#endif 572 + #else
  573 + #error Unknown CPU architecture
  574 + #endif
602 575
603 -#define MD_GET_UTIME() \ 576 + #define MD_GET_UTIME() \
604 return (gethrtime() / 1000) 577 return (gethrtime() / 1000)
605 578
606 #else 579 #else
607 -#error Unknown OS 580 + #error Unknown OS
608 #endif /* OS */ 581 #endif /* OS */
609 582
  583 +/*****************************************
  584 + * Other defines
  585 + */
610 #if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL) 586 #if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL)
611 -#define MD_HAVE_POLL 587 + #define MD_HAVE_POLL
612 #endif 588 #endif
613 589
614 #ifndef MD_STACK_PAD_SIZE 590 #ifndef MD_STACK_PAD_SIZE
615 -#define MD_STACK_PAD_SIZE 128 591 + #define MD_STACK_PAD_SIZE 128
616 #endif 592 #endif
617 593
618 #if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t) 594 #if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t)
619 -#define socklen_t int 595 + #define socklen_t int
620 #endif 596 #endif
621 597
622 #ifndef MD_CAP_STACK 598 #ifndef MD_CAP_STACK
623 -#define MD_CAP_STACK(var_addr) 599 + #define MD_CAP_STACK(var_addr)
624 #endif 600 #endif
625 601
626 #endif /* !__ST_MD_H__ */ 602 #endif /* !__ST_MD_H__ */
@@ -129,8 +129,7 @@ extern "C" { @@ -129,8 +129,7 @@ extern "C" {
129 extern void st_netfd_free(st_netfd_t fd); 129 extern void st_netfd_free(st_netfd_t fd);
130 extern int st_netfd_close(st_netfd_t fd); 130 extern int st_netfd_close(st_netfd_t fd);
131 extern int st_netfd_fileno(st_netfd_t fd); 131 extern int st_netfd_fileno(st_netfd_t fd);
132 - extern void st_netfd_setspecific(st_netfd_t fd, void *value,  
133 - void (*destructor)(void *)); 132 + extern void st_netfd_setspecific(st_netfd_t fd, void *value, void (*destructor)(void *));
134 extern void *st_netfd_getspecific(st_netfd_t fd); 133 extern void *st_netfd_getspecific(st_netfd_t fd);
135 extern int st_netfd_serialize_accept(st_netfd_t fd); 134 extern int st_netfd_serialize_accept(st_netfd_t fd);
136 extern int st_netfd_poll(st_netfd_t fd, int how, st_utime_t timeout); 135 extern int st_netfd_poll(st_netfd_t fd, int how, st_utime_t timeout);