mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
research st: refine the md.h
This commit is contained in:
parent
856ba07bd3
commit
0f293802c8
1 changed files with 469 additions and 491 deletions
|
@ -57,7 +57,6 @@
|
||||||
/*****************************************
|
/*****************************************
|
||||||
* Platform specifics
|
* Platform specifics
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined (AIX)
|
#if defined (AIX)
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_STACK_GROWS_DOWN
|
||||||
#define MD_USE_SYSV_ANON_MMAP
|
#define MD_USE_SYSV_ANON_MMAP
|
||||||
|
@ -86,118 +85,115 @@
|
||||||
return (rt.tb_high * 1000000LL + rt.tb_low / 1000)
|
return (rt.tb_high * 1000000LL + rt.tb_low / 1000)
|
||||||
|
|
||||||
#elif defined (CYGWIN)
|
#elif defined (CYGWIN)
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_STACK_GROWS_DOWN
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
#define MD_ACCEPT_NB_NOT_INHERITED
|
#define MD_ACCEPT_NB_NOT_INHERITED
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_SETJMP(env) setjmp(env)
|
#define MD_SETJMP(env) setjmp(env)
|
||||||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||||
|
|
||||||
#define MD_JB_SP 7
|
#define MD_JB_SP 7
|
||||||
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[MD_JB_SP]
|
#define MD_GET_SP(_t) (_t)->context[MD_JB_SP]
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
MD_GET_SP(_thread) = (long) (_sp); \
|
MD_GET_SP(_thread) = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (DARWIN)
|
#elif defined (DARWIN)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
#define MD_HAVE_SOCKLEN_T
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
#define MD_HAVE_SOCKLEN_T
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#if defined(__ppc__)
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
#define MD_JB_SP 0
|
||||||
|
#elif defined(__i386__)
|
||||||
|
#define MD_JB_SP 9
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
#define MD_JB_SP 4
|
||||||
|
#else
|
||||||
|
#error Unknown CPU architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__ppc__)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_JB_SP 0
|
|
||||||
#elif defined(__i386__)
|
|
||||||
#define MD_JB_SP 9
|
|
||||||
#elif defined(__x86_64__)
|
|
||||||
#define MD_JB_SP 4
|
|
||||||
#else
|
|
||||||
#error Unknown CPU architecture
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
*((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \
|
*((long *)&((_thread)->context[MD_JB_SP])) = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (FREEBSD)
|
#elif defined (FREEBSD)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#if defined(__i386__)
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
#define MD_JB_SP 2
|
||||||
|
#elif defined(__alpha__)
|
||||||
|
#define MD_JB_SP 34
|
||||||
|
#elif defined(__amd64__)
|
||||||
|
#define MD_JB_SP 2
|
||||||
|
#else
|
||||||
|
#error Unknown CPU architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__i386__)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_JB_SP 2
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
#define MD_JB_SP 34
|
|
||||||
#elif defined(__amd64__)
|
|
||||||
#define MD_JB_SP 2
|
|
||||||
#else
|
|
||||||
#error Unknown CPU architecture
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
(_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \
|
(_thread)->context[0]._jb[MD_JB_SP] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (HPUX)
|
#elif defined (HPUX)
|
||||||
|
#define MD_STACK_GROWS_UP
|
||||||
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_STACK_GROWS_UP
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#ifndef __LP64__
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
/* 32-bit mode (ILP32 data model) */
|
||||||
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#ifndef __LP64__
|
|
||||||
/* 32-bit mode (ILP32 data model) */
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
((long *)((_thread)->context))[1] = (long) (_sp); \
|
((long *)((_thread)->context))[1] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
#else
|
#else
|
||||||
/* 64-bit mode (LP64 data model) */
|
/* 64-bit mode (LP64 data model) */
|
||||||
#define MD_STACK_PAD_SIZE 256
|
#define MD_STACK_PAD_SIZE 256
|
||||||
/* Last stack frame must be preserved */
|
/* Last stack frame must be preserved */
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
|
@ -206,33 +202,32 @@
|
||||||
MD_STACK_PAD_SIZE); \
|
MD_STACK_PAD_SIZE); \
|
||||||
((long *)((_thread)->context))[1] = (long) (_sp); \
|
((long *)((_thread)->context))[1] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
#endif /* !__LP64__ */
|
#endif /* !__LP64__ */
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (IRIX)
|
#elif defined (IRIX)
|
||||||
|
#include <sys/syssgi.h>
|
||||||
|
|
||||||
#include <sys/syssgi.h>
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_SYSV_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) setjmp(env)
|
||||||
#define MD_USE_SYSV_ANON_MMAP
|
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) setjmp(env)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
(void) MD_SETJMP((_thread)->context); \
|
(void) MD_SETJMP((_thread)->context); \
|
||||||
(_thread)->context[JB_SP] = (long) (_sp); \
|
(_thread)->context[JB_SP] = (long) (_sp); \
|
||||||
(_thread)->context[JB_PC] = (long) _main; \
|
(_thread)->context[JB_PC] = (long) _main; \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
static int inited = 0; \
|
static int inited = 0; \
|
||||||
static clockid_t clock_id = CLOCK_SGI_CYCLE; \
|
static clockid_t clock_id = CLOCK_SGI_CYCLE; \
|
||||||
struct timespec ts; \
|
struct timespec ts; \
|
||||||
|
@ -244,7 +239,7 @@
|
||||||
(void) clock_gettime(clock_id, &ts); \
|
(void) clock_gettime(clock_id, &ts); \
|
||||||
return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000)
|
return (ts.tv_sec * 1000000LL + ts.tv_nsec / 1000)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cap the stack by zeroing out the saved return address register
|
* Cap the stack by zeroing out the saved return address register
|
||||||
* value. This allows libexc, used by SpeedShop, to know when to stop
|
* value. This allows libexc, used by SpeedShop, to know when to stop
|
||||||
* backtracing since it won't find main, start, or any other known
|
* backtracing since it won't find main, start, or any other known
|
||||||
|
@ -255,38 +250,37 @@
|
||||||
* automatic variables are added to the _st_thread_main() routine, because
|
* automatic variables are added to the _st_thread_main() routine, because
|
||||||
* the address where ra is stored will change.
|
* the address where ra is stored will change.
|
||||||
*/
|
*/
|
||||||
#if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
|
#if !defined(__GNUC__) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
|
||||||
#define MD_CAP_STACK(var_addr) \
|
#define MD_CAP_STACK(var_addr) \
|
||||||
(((volatile __uint64_t *)(var_addr))[1] = 0)
|
(((volatile __uint64_t *)(var_addr))[1] = 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined (LINUX)
|
#elif defined (LINUX)
|
||||||
|
/*
|
||||||
/*
|
|
||||||
* These are properties of the linux kernel and are the same on every
|
* These are properties of the linux kernel and are the same on every
|
||||||
* flavor and architecture.
|
* flavor and architecture.
|
||||||
*/
|
*/
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
#define MD_ACCEPT_NB_NOT_INHERITED
|
#define MD_ACCEPT_NB_NOT_INHERITED
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
/*
|
/*
|
||||||
* Modern GNU/Linux is Posix.1g compliant.
|
* Modern GNU/Linux is Posix.1g compliant.
|
||||||
*/
|
*/
|
||||||
#define MD_HAVE_SOCKLEN_T
|
#define MD_HAVE_SOCKLEN_T
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All architectures and flavors of linux have the gettimeofday
|
* All architectures and flavors of linux have the gettimeofday
|
||||||
* function but if you know of a faster way, use it.
|
* function but if you know of a faster way, use it.
|
||||||
*/
|
*/
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#if defined(__ia64__)
|
#if defined(__ia64__)
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IA-64 architecture. Besides traditional memory call stack, IA-64
|
* IA-64 architecture. Besides traditional memory call stack, IA-64
|
||||||
* uses general register stack. Thus each thread needs a backing store
|
* uses general register stack. Thus each thread needs a backing store
|
||||||
* for register stack in addition to memory stack. Standard
|
* for register stack in addition to memory stack. Standard
|
||||||
|
@ -294,14 +288,14 @@
|
||||||
* because their implementation implicitly assumes that only one
|
* because their implementation implicitly assumes that only one
|
||||||
* register stack exists.
|
* register stack exists.
|
||||||
*/
|
*/
|
||||||
#ifdef USE_LIBC_SETJMP
|
#ifdef USE_LIBC_SETJMP
|
||||||
#undef USE_LIBC_SETJMP
|
#undef USE_LIBC_SETJMP
|
||||||
#endif
|
#endif
|
||||||
#define MD_USE_BUILTIN_SETJMP
|
#define MD_USE_BUILTIN_SETJMP
|
||||||
|
|
||||||
#define MD_STACK_PAD_SIZE 128
|
#define MD_STACK_PAD_SIZE 128
|
||||||
/* Last register stack frame must be preserved */
|
/* Last register stack frame must be preserved */
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \
|
#define MD_INIT_CONTEXT(_thread, _sp, _bsp, _main) \
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
|
@ -311,28 +305,24 @@
|
||||||
(_thread)->context[0].__jmpbuf[0] = (long) (_sp); \
|
(_thread)->context[0].__jmpbuf[0] = (long) (_sp); \
|
||||||
(_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \
|
(_thread)->context[0].__jmpbuf[17] = (long) (_bsp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
#elif defined(__mips__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#elif defined(__mips__)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_STACK_GROWS_DOWN
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
MD_SETJMP((_thread)->context); \
|
MD_SETJMP((_thread)->context); \
|
||||||
_thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
|
_thread->context[0].__jmpbuf[0].__pc = (__ptr_t) _main; \
|
||||||
_thread->context[0].__jmpbuf[0].__sp = _sp; \
|
_thread->context[0].__jmpbuf[0].__sp = _sp; \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
#else /* Not IA-64 or mips */
|
||||||
#else /* Not IA-64 or mips */
|
/*
|
||||||
|
|
||||||
/*
|
|
||||||
* On linux, there are a few styles of jmpbuf format. These vary based
|
* On linux, there are a few styles of jmpbuf format. These vary based
|
||||||
* on architecture/glibc combination.
|
* on architecture/glibc combination.
|
||||||
*
|
*
|
||||||
* Most of the glibc based toggles were lifted from:
|
* Most of the glibc based toggles were lifted from:
|
||||||
* mozilla/nsprpub/pr/include/md/_linux.h
|
* mozilla/nsprpub/pr/include/md/_linux.h
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
/*
|
|
||||||
* Starting with glibc 2.4, JB_SP definitions are not public anymore.
|
* Starting with glibc 2.4, JB_SP definitions are not public anymore.
|
||||||
* They, however, can still be found in glibc source tree in
|
* They, however, can still be found in glibc source tree in
|
||||||
* architecture-specific "jmpbuf-offsets.h" files.
|
* architecture-specific "jmpbuf-offsets.h" files.
|
||||||
|
@ -343,282 +333,270 @@
|
||||||
* functions as a setjmp/longjmp replacement wherever they are available
|
* functions as a setjmp/longjmp replacement wherever they are available
|
||||||
* unless USE_LIBC_SETJMP is defined.
|
* unless USE_LIBC_SETJMP is defined.
|
||||||
*/
|
*/
|
||||||
|
#if defined(__powerpc__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#if defined(__powerpc__)
|
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
|
||||||
#define MD_STACK_GROWS_DOWN
|
#ifndef JB_GPR1
|
||||||
|
#define JB_GPR1 0
|
||||||
|
#endif
|
||||||
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]
|
||||||
|
#else
|
||||||
|
/* not an error but certainly cause for caution */
|
||||||
|
#error "Untested use of old glibc on powerpc"
|
||||||
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]
|
||||||
|
#endif /* glibc 2.1 or later */
|
||||||
|
#elif defined(__alpha)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
|
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||||
#ifndef JB_GPR1
|
#ifndef JB_SP
|
||||||
#define JB_GPR1 0
|
#define JB_SP 8
|
||||||
#endif
|
#endif
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_GPR1]
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
||||||
#else
|
#else
|
||||||
/* not an error but certainly cause for caution */
|
/* not an error but certainly cause for caution */
|
||||||
#error "Untested use of old glibc on powerpc"
|
#error "Untested use of old glibc on alpha"
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__misc[0]
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
||||||
#endif /* glibc 2.1 or later */
|
#endif
|
||||||
|
#elif defined(__mc68000__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#elif defined(__alpha)
|
/* m68k still uses old style sigjmp_buf */
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
||||||
|
#elif defined(__sparc__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||||
#ifndef JB_SP
|
#ifndef JB_SP
|
||||||
#define JB_SP 8
|
#define JB_SP 0
|
||||||
#endif
|
#endif
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
||||||
#else
|
#else
|
||||||
/* not an error but certainly cause for caution */
|
/* not an error but certainly cause for caution */
|
||||||
#error "Untested use of old glibc on alpha"
|
#error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(__i386__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BUILTIN_SETJMP
|
||||||
|
|
||||||
#elif defined(__mc68000__)
|
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||||
#define MD_STACK_GROWS_DOWN
|
#ifndef JB_SP
|
||||||
|
#define JB_SP 4
|
||||||
|
#endif
|
||||||
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
||||||
|
#else
|
||||||
|
/* not an error but certainly cause for caution */
|
||||||
|
#error "Untested use of old glibc on i386"
|
||||||
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
||||||
|
#endif
|
||||||
|
#elif defined(__amd64__) || defined(__x86_64__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BUILTIN_SETJMP
|
||||||
|
|
||||||
/* m68k still uses old style sigjmp_buf */
|
#ifndef JB_RSP
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
#define JB_RSP 6
|
||||||
|
#endif
|
||||||
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]
|
||||||
|
#elif defined(__arm__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#elif defined(__sparc__)
|
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[8]
|
||||||
|
#else
|
||||||
|
#error "ARM/Linux pre-glibc2 not supported yet"
|
||||||
|
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
|
||||||
|
#elif defined(__s390__)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
|
||||||
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
/* There is no JB_SP in glibc at this time. (glibc 2.2.5)
|
||||||
#ifndef JB_SP
|
|
||||||
#define JB_SP 0
|
|
||||||
#endif
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
|
||||||
#else
|
|
||||||
/* not an error but certainly cause for caution */
|
|
||||||
#error "Untested use of old glic on sparc -- also using odd mozilla derived __fp"
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__fp
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(__i386__)
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
|
||||||
#define MD_USE_BUILTIN_SETJMP
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
|
||||||
#ifndef JB_SP
|
|
||||||
#define JB_SP 4
|
|
||||||
#endif
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_SP]
|
|
||||||
#else
|
|
||||||
/* not an error but certainly cause for caution */
|
|
||||||
#error "Untested use of old glibc on i386"
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__sp
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(__amd64__) || defined(__x86_64__)
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
|
||||||
#define MD_USE_BUILTIN_SETJMP
|
|
||||||
|
|
||||||
#ifndef JB_RSP
|
|
||||||
#define JB_RSP 6
|
|
||||||
#endif
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[JB_RSP]
|
|
||||||
|
|
||||||
#elif defined(__arm__)
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
|
||||||
|
|
||||||
#if defined(__GLIBC__) && __GLIBC__ >= 2
|
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[20]
|
|
||||||
#else
|
|
||||||
#error "ARM/Linux pre-glibc2 not supported yet"
|
|
||||||
#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */
|
|
||||||
|
|
||||||
#elif defined(__s390__)
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
|
||||||
|
|
||||||
/* There is no JB_SP in glibc at this time. (glibc 2.2.5)
|
|
||||||
*/
|
*/
|
||||||
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]
|
#define MD_GET_SP(_t) (_t)->context[0].__jmpbuf[0].__gregs[9]
|
||||||
|
#elif defined(__hppa__)
|
||||||
|
#define MD_STACK_GROWS_UP
|
||||||
|
|
||||||
#elif defined(__hppa__)
|
/* yes, this is gross, unfortunately at the moment (2002/08/01) there is
|
||||||
#define MD_STACK_GROWS_UP
|
|
||||||
|
|
||||||
/* yes, this is gross, unfortunately at the moment (2002/08/01) there is
|
|
||||||
* a bug in hppa's glibc header definition for JB_SP, so we can't
|
* a bug in hppa's glibc header definition for JB_SP, so we can't
|
||||||
* use that...
|
* use that...
|
||||||
*/
|
*/
|
||||||
#define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))
|
#define MD_GET_SP(_t) (*(long *)(((char *)&(_t)->context[0].__jmpbuf[0]) + 76))
|
||||||
|
#else
|
||||||
|
#error "Unknown CPU architecture"
|
||||||
|
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
|
||||||
|
|
||||||
#else
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#error "Unknown CPU architecture"
|
|
||||||
#endif /* Cases with common MD_INIT_CONTEXT and different SP locations */
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
MD_GET_SP(_thread) = (long) (_sp); \
|
MD_GET_SP(_thread) = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
#endif /* Cases with different MD_INIT_CONTEXT */
|
||||||
|
|
||||||
#endif /* Cases with different MD_INIT_CONTEXT */
|
#if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
|
||||||
|
#define MD_SETJMP(env) _st_md_cxt_save(env)
|
||||||
|
#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
|
||||||
|
|
||||||
#if defined(MD_USE_BUILTIN_SETJMP) && !defined(USE_LIBC_SETJMP)
|
extern int _st_md_cxt_save(jmp_buf env);
|
||||||
#define MD_SETJMP(env) _st_md_cxt_save(env)
|
extern void _st_md_cxt_restore(jmp_buf env, int val);
|
||||||
#define MD_LONGJMP(env, val) _st_md_cxt_restore(env, val)
|
#else
|
||||||
|
#define MD_SETJMP(env) setjmp(env)
|
||||||
extern int _st_md_cxt_save(jmp_buf env);
|
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||||
extern void _st_md_cxt_restore(jmp_buf env, int val);
|
#endif
|
||||||
#else
|
|
||||||
#define MD_SETJMP(env) setjmp(env)
|
|
||||||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined (NETBSD)
|
#elif defined (NETBSD)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
#define MD_HAVE_SOCKLEN_T
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
#define MD_HAVE_SOCKLEN_T
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#if defined(__i386__)
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
#define MD_JB_SP 2
|
||||||
|
#elif defined(__alpha__)
|
||||||
|
#define MD_JB_SP 34
|
||||||
|
#elif defined(__sparc__)
|
||||||
|
#define MD_JB_SP 0
|
||||||
|
#elif defined(__vax__)
|
||||||
|
#define MD_JB_SP 2
|
||||||
|
#else
|
||||||
|
#error Unknown CPU architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__i386__)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_JB_SP 2
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
#define MD_JB_SP 34
|
|
||||||
#elif defined(__sparc__)
|
|
||||||
#define MD_JB_SP 0
|
|
||||||
#elif defined(__vax__)
|
|
||||||
#define MD_JB_SP 2
|
|
||||||
#else
|
|
||||||
#error Unknown CPU architecture
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
(_thread)->context[MD_JB_SP] = (long) (_sp); \
|
(_thread)->context[MD_JB_SP] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (OPENBSD)
|
#elif defined (OPENBSD)
|
||||||
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_BSD_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_BSD_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#if defined(__i386__)
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
#define MD_JB_SP 2
|
||||||
|
#elif defined(__alpha__)
|
||||||
|
#define MD_JB_SP 34
|
||||||
|
#elif defined(__sparc__)
|
||||||
|
#define MD_JB_SP 0
|
||||||
|
#elif defined(__amd64__)
|
||||||
|
#define MD_JB_SP 6
|
||||||
|
#else
|
||||||
|
#error Unknown CPU architecture
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__i386__)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_JB_SP 2
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
#define MD_JB_SP 34
|
|
||||||
#elif defined(__sparc__)
|
|
||||||
#define MD_JB_SP 0
|
|
||||||
#elif defined(__amd64__)
|
|
||||||
#define MD_JB_SP 6
|
|
||||||
#else
|
|
||||||
#error Unknown CPU architecture
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
(_thread)->context[MD_JB_SP] = (long) (_sp); \
|
(_thread)->context[MD_JB_SP] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (OSF1)
|
#elif defined (OSF1)
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <signal.h>
|
#define MD_STACK_GROWS_DOWN
|
||||||
|
#define MD_USE_SYSV_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_NOT_INHERITED
|
||||||
|
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) _setjmp(env)
|
||||||
#define MD_USE_SYSV_ANON_MMAP
|
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_NOT_INHERITED
|
|
||||||
#define MD_ALWAYS_UNSERIALIZED_ACCEPT
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) _setjmp(env)
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_LONGJMP(env, val) _longjmp(env, val)
|
|
||||||
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \
|
((struct sigcontext *)((_thread)->context))->sc_sp = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
struct timeval tv; \
|
struct timeval tv; \
|
||||||
(void) gettimeofday(&tv, NULL); \
|
(void) gettimeofday(&tv, NULL); \
|
||||||
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
return (tv.tv_sec * 1000000LL + tv.tv_usec)
|
||||||
|
|
||||||
#elif defined (SOLARIS)
|
#elif defined (SOLARIS)
|
||||||
|
#include <sys/filio.h>
|
||||||
|
extern int getpagesize(void);
|
||||||
|
|
||||||
#include <sys/filio.h>
|
#define MD_STACK_GROWS_DOWN
|
||||||
extern int getpagesize(void);
|
#define MD_USE_SYSV_ANON_MMAP
|
||||||
|
#define MD_ACCEPT_NB_NOT_INHERITED
|
||||||
|
|
||||||
#define MD_STACK_GROWS_DOWN
|
#define MD_SETJMP(env) setjmp(env)
|
||||||
#define MD_USE_SYSV_ANON_MMAP
|
#define MD_LONGJMP(env, val) longjmp(env, val)
|
||||||
#define MD_ACCEPT_NB_NOT_INHERITED
|
|
||||||
|
|
||||||
#define MD_SETJMP(env) setjmp(env)
|
#if defined(sparc) || defined(__sparc)
|
||||||
#define MD_LONGJMP(env, val) longjmp(env, val)
|
#ifdef _LP64
|
||||||
|
#define MD_STACK_PAD_SIZE 4095
|
||||||
#if defined(sparc) || defined(__sparc)
|
#endif
|
||||||
#ifdef _LP64
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
#define MD_STACK_PAD_SIZE 4095
|
|
||||||
#endif
|
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
(void) MD_SETJMP((_thread)->context); \
|
(void) MD_SETJMP((_thread)->context); \
|
||||||
(_thread)->context[1] = (long) (_sp); \
|
(_thread)->context[1] = (long) (_sp); \
|
||||||
(_thread)->context[2] = (long) _main; \
|
(_thread)->context[2] = (long) _main; \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
#elif defined(i386) || defined(__i386)
|
#elif defined(i386) || defined(__i386)
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
(void) MD_SETJMP((_thread)->context); \
|
(void) MD_SETJMP((_thread)->context); \
|
||||||
(_thread)->context[4] = (long) (_sp); \
|
(_thread)->context[4] = (long) (_sp); \
|
||||||
(_thread)->context[5] = (long) _main; \
|
(_thread)->context[5] = (long) _main; \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
#elif defined(__amd64__)
|
#elif defined(__amd64__)
|
||||||
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
#define MD_INIT_CONTEXT(_thread, _sp, _main) \
|
||||||
ST_BEGIN_MACRO \
|
ST_BEGIN_MACRO \
|
||||||
if (MD_SETJMP((_thread)->context)) \
|
if (MD_SETJMP((_thread)->context)) \
|
||||||
_main(); \
|
_main(); \
|
||||||
(_thread)->context[6] = (long) (_sp); \
|
(_thread)->context[6] = (long) (_sp); \
|
||||||
ST_END_MACRO
|
ST_END_MACRO
|
||||||
#else
|
#else
|
||||||
#error Unknown CPU architecture
|
#error Unknown CPU architecture
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MD_GET_UTIME() \
|
#define MD_GET_UTIME() \
|
||||||
return (gethrtime() / 1000)
|
return (gethrtime() / 1000)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error Unknown OS
|
#error Unknown OS
|
||||||
#endif /* OS */
|
#endif /* OS */
|
||||||
|
|
||||||
|
/*****************************************
|
||||||
|
* Other defines
|
||||||
|
*/
|
||||||
#if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL)
|
#if !defined(MD_HAVE_POLL) && !defined(MD_DONT_HAVE_POLL)
|
||||||
#define MD_HAVE_POLL
|
#define MD_HAVE_POLL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MD_STACK_PAD_SIZE
|
#ifndef MD_STACK_PAD_SIZE
|
||||||
#define MD_STACK_PAD_SIZE 128
|
#define MD_STACK_PAD_SIZE 128
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t)
|
#if !defined(MD_HAVE_SOCKLEN_T) && !defined(socklen_t)
|
||||||
#define socklen_t int
|
#define socklen_t int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MD_CAP_STACK
|
#ifndef MD_CAP_STACK
|
||||||
#define MD_CAP_STACK(var_addr)
|
#define MD_CAP_STACK(var_addr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* !__ST_MD_H__ */
|
#endif /* !__ST_MD_H__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue