This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: hello gcc 4.2.1 C preprocessor question, any clues are welcome;


ignore got it

On Mon, Aug 2, 2010 at 6:55 PM, mm w <0xcafefeed@gmail.com> wrote:
> gcc -v
> Using built-in specs.
> Target: i686-apple-darwin10
> Configured with: /var/tmp/gcc/gcc-5659~1/src/configure
> --disable-checking --enable-werror --prefix=/usr --mandir=/share/man
> --enable-languages=c,objc,c++,obj-c++
> --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/
> --with-slibdir=/usr/lib --build=i686-apple-darwin10
> --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10
> --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1
> Thread model: posix
> gcc version 4.2.1 (Apple Inc. build 5659)
>
>
> -- BEGIN header OSAtomicLock.h
>
> #ifndef OSATOMICLOCK_H
> #define OSATOMICLOCK_H
>
> #if !defined(OS_INLINE)
> Â Â#if defined(__GNUC__) && (__GNUC__ == 4) && !defined(DEBUG)
> Â Â Â Â#define OS_INLINE static __inline__ __attribute__((always_inline))
> Â Â#elif defined(__GNUC__)
> Â Â Â Â#define OS_INLINE static __inline__
> Â Â#elif defined(__cplusplus)
> Â Â Â Â Â Â Â Â#define OS_INLINE static inline
> Â Â#elif defined(_MSC_VER)
> Â Â Â Â#define OS_INLINE static __inline
> Â Â#elif defined(__WIN32__)
> Â Â Â Â Â Â Â Â#define OS_INLINE static __inline__
> Â Â#endif
> #endif
>
> #if defined(__WIN32__)
> Â Â Â Âtypedef __int32 OSAtomicLockLock;
> Â Â Â Â#define OSAtomicLockInit 0
> Â Â Â ÂD_INLINE void __OSAtomicLockLock(volatile OSAtomicLock *LOCK) {
> Â Â Â Âwhile (InterlockedCompareExchange((LONG volatile *)LOCK, ~0, 0) != 0) {
> Â Â Â Â Â Â Â Â Â Â Â ÂSleep(0);
> Â Â Â Â}
> Â Â Â Â}
> Â Â Â ÂD_INLINE void __OSAtomicLockUnlock(volatile OSAtomicLock *LOCK) {
> Â Â Â Â Â Â Â ÂMemoryBarrier();
> Â Â Â Â Â Â Â Â*LOCK = 0;
> Â Â Â Â}
> #elif defined(__APPLE__)
> Â Â Â Â#include <libkern/OSAtomic.h>
> Â Â Â Âtypedef OSSpinLock OSAtomicLock;
> Â Â Â Â#define OSAtomicLockInit OS_SPINLOCK_INIT
> Â Â Â Â#define __OSAtomicLockLock(LOCK) ({ \
> Â Â Â Â Â Â Â ÂOSAtomicLock *lck_p = (LOCK); \
> Â Â Â Â Â Â Â ÂOSAtomicLock lck_v = *lck_p; \
> Â Â Â Â Â Â Â Âif (0 != lck_v && ~0 != lck_v && (uintptr_t)lck_p != (uintptr_t)lck_v) { } \
> Â Â Â Â Â Â Â ÂOSSpinLockLock(lck_p); \
> Â Â Â Â})
> Â Â Â Â#define __OSAtomicLockUnlock(LOCK) ({ \
> Â Â Â Â Â Â Â ÂOSAtomicLock *lck_p = (LOCK); \
> Â Â Â Â Â Â Â ÂOSAtomicLock lck_v = *lck_p; \
> Â Â Â Â Â Â Â Âif (~0 != lck_v && (uintptr_t)lck_p != (uintptr_t)lck_v) { } \
> Â Â Â Â Â Â Â ÂOSSpinLockUnlock(lck_p); \
> Â Â Â Â})
> #else // means posix
> Â Â Â Â#define _MULTI_THREADED
> Â Â Â Â#include <pthread.h>
> Â Â Â Â#if defined(__linux__)
> Â Â Â Â Â Â Â Â#define OSAtomicLockInit PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
> Â Â Â Â#else
> Â Â Â Â Â Â Â Â#define OSAtomicLockInit PTHREAD_MUTEX_INITIALIZER
> Â Â Â Â#endif
> Â Â Â Âtypedef pthread_mutex_t OSAtomicLock;
> Â Â Â Â#define __OSAtomicLockLock(LOCK) ({ \
> Â Â Â Â Â Â Â ÂOSAtomicLock *lck_p = (LOCK); \
> Â Â Â Â Â Â Â Âpthread_mutex_lock(lck_p); \
> Â Â Â Â})
> Â Â Â Â#define Â__OSAtomicLockUnlock(LOCK) ({ \
> Â Â Â Â Â Â Â ÂOSAtomicLock *lck_p = (LOCK); \
> Â Â Â Â Â Â Â Âpthread_mutex_unlock(lck_p); \
> Â Â Â Â})
> #endif
>
> #define OSAtomicLockInitialize(LOCK) (LOCK = OSAtomicLockInit)
> #define OSAtomicLockLock(LOCK) __OSAtomicLockLock(LOCK)
> #define OSAtomicLockUnlock(LOCK) __OSAtomicLockUnlock(LOCK)
>
> #define OSAtomicAutoLock(LOCK, BLOCK) \
> Â Â Â ÂOSAtomicLockLock(LOCK); \
> Â Â Â ÂBLOCK \
> Â Â Â ÂOSAtomicLockUnlock(LOCK);
>
> #endif // OSATOMICLOCK_H
>
> /* HOWTO
> Â Â Â Âstatic OSAtomicLock __myGlobalLock = OSAtomicLockInit;
> Â Â Â Âvoid mylocalfunc()
> Â Â Â Â{
> Â Â Â Â Â Â Â ÂOSAtomicLockLock(&__myGlobalLock);
> Â Â Â Â Â Â Â Â//do stuff
> Â Â Â Â Â Â Â ÂOSAtomicLockUnlock(&__myGlobalLock);
> Â Â Â Â}
> */
>
> -- END header OSAtomicLock.h
>
>
> -- BEGIN test1.c
>
> #include <stdio.h>
> #include "OSAtomicLock.h"
>
> static OSAtomicLock __myGlobalLock = OSAtomicLockInit;
>
> int main (int argc, const char** argv)
> {
> Â Â Â ÂOSAtomicLockLock(&__myGlobalLock);
> Â Â Â Âfprintf(stderr,"hello\n");
> Â Â Â ÂOSAtomicLockLock(&__myGlobalLock);
> Â Â Â Âreturn 0;
> }
>
> -- END test1.c
>
> -- BEGIN test2.c
>
> #include <stdio.h>
> #include "OSAtomicLock.h"
>
> static OSAtomicLock __myGlobalLock = OSAtomicLockInit;
>
> int main (int argc, const char** argv)
> {
> Â Â Â ÂOSAtomicAutoLock
> Â Â Â Â(
> Â Â Â Â Â Â Â Â&__myGlobalLock,
> Â Â Â Â Â Â Â Âfprintf(stderr,"hello\n");
> Â Â Â Â)
> Â Â Â Âreturn 0;
> }
>
> -- END test2.c
>
> and the main thread blocked;
>
> -- BEGIN test1.S
>
> L2:
> Â Â Â Â...
>    Âmovq  Â-24(%rbp), %rdi
>    Âcall  Â_OSSpinLockUnlock
>    Âmovl  Â$0, %eax
> Â Â Â Âleave
> Â Â Â Âret
>
> -- END test1.S
>
> -- BEGIN test2.S
>
>
> L2:
> Â Â Â Â...
>    Âje   ÂL5
> L5:
>    Âmovq  Â-24(%rbp), %rdi
>    Âcall  Â_OSSpinLockLock
>    Âmovl  Â$0, %eax
> Â Â Â Âleave
> Â Â Â Âret
>
> -- END test2.S
>
> and the main thread will bell;
>
> Best Regards
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]