Commit 678a3e51 authored by Pedro Gonnet's avatar Pedro Gonnet
Browse files

initial upload.


Former-commit-id: 69c24986807d41147285800a5608a59cbc7001e4
parent e89c3a07
CC=gcc
FC=gfortran
OPTS=-DTIMER -DCOUNTER -DCPU_TPS=2.67e9
CFLAGS=-O3 -g -std=gnu99 -Wall -Werror -march=native -mtune=native -ffast-math -fomit-frame-pointer -malign-double -fstrict-aliasing -fopenmp
# CFLAGS=-O0 -g -std=gnu99 -Wall -Werror -fopenmp
LDFLAGS=-lm -lpthread -fopenmp
FFLAGS=$(CFLAGS)
OBJS=space.o runner.o test.o
default: all
depfile: $(wildcard *.c) $(wildcard *.h)
$(CC) -MM *.c *.h > depfile
include depfile
%.o: Makefile
%.o: %.c Makefile
$(CC) -c $(CFLAGS) $(OPTS) $< -o $@
# $(CC) -c $(CFLAGS) $(OPTS) $< -dA -S
test: $(OBJS)
gcc $^ $(LDFLAGS) -o test
all: test
clean:
rm -f $(OBJS) test
4725.400 5722.778 8400.450 3194.839 120.059 105.812 56.976 5.655 0.000 0.000 19072.309 0.000 0.000
4919.301 5755.781 8710.699 3294.436 145.669 130.172 68.079 5.951 0.989 1.456 9838.910 0.000 0.000
4986.648 5794.996 8912.560 3360.085 198.966 178.689 108.065 6.243 5.700 7.087 6702.370 0.000 0.000
5259.090 5782.343 9050.539 3391.693 206.106 186.435 105.906 6.455 5.320 5.107 5129.911 0.000 0.000
5069.935 5801.673 9141.677 3427.429 254.263 228.474 140.110 6.954 12.026 13.356 4109.165 0.000 0.000
5144.622 5772.367 9238.842 3460.168 240.814 217.191 127.767 6.964 10.301 10.270 3450.979 0.000 0.000
5154.364 5800.711 9217.054 3457.825 310.817 271.857 166.828 7.499 31.194 33.498 2972.789 0.000 0.000
5134.256 5778.530 9162.365 3433.527 274.115 242.285 143.293 7.479 19.334 19.719 2583.830 0.000 0.000
5157.989 5803.972 9253.761 3458.642 345.791 303.071 185.356 8.256 38.970 41.899 2332.102 0.000 0.000
5238.888 5784.603 9245.546 3459.337 304.001 263.466 158.093 8.064 26.586 26.403 2093.112 0.000 0.000
5194.632 5806.809 9286.337 3476.360 386.899 326.131 197.683 8.884 60.838 64.860 1917.308 0.000 0.000
5177.886 5780.655 9305.192 3478.527 351.232 291.278 170.044 8.479 55.968 57.658 1752.747 0.000 0.000
5282.438 5814.123 9370.344 3487.279 439.419 354.893 209.715 9.268 90.429 96.766 1643.057 0.000 0.000
5282.634 5785.133 9380.112 3494.921 368.999 309.481 184.850 8.954 50.828 50.418 1519.213 0.000 0.000
5299.171 5814.226 9353.443 3493.089 501.669 374.055 221.973 9.862 132.895 138.850 1431.006 0.000 0.000
5353.611 5783.394 9414.077 3502.090 404.104 325.553 197.225 9.566 67.871 67.871 1348.012 0.000 0.000
5348.965 5817.267 9426.694 3506.508 490.604 375.330 226.972 10.119 110.522 113.377 1271.295 0.000 0.000
5482.762 5794.389 9596.688 3515.471 456.408 346.792 208.519 9.985 99.973 99.417 1214.456 0.000 0.000
5510.358 5821.199 9434.239 3515.476 541.956 392.489 238.131 10.826 137.361 139.270 1151.907 0.000 0.000
5473.950 5784.403 9555.850 3524.260 521.190 362.134 215.772 10.350 151.132 151.251 1095.725 0.000 0.000
5451.099 5823.864 9470.511 3526.494 604.650 407.376 247.352 11.149 187.478 191.021 1046.104 0.000 0.000
5505.379 5797.034 9522.470 3532.581 525.123 382.731 230.351 10.745 135.603 132.723 998.445 0.000 0.000
5477.417 5828.421 9518.820 3535.798 656.047 441.104 265.603 12.163 204.144 206.721 962.972 0.000 0.000
5583.622 5806.082 9566.668 3544.756 557.810 391.739 239.332 11.165 152.257 148.435 923.460 0.000 0.000
5515.739 5836.443 9570.943 3550.382 748.315 463.250 275.140 12.299 276.417 278.800 895.218 0.000 0.000
5587.893 5817.037 9645.617 3558.896 595.736 409.485 250.071 11.453 173.158 168.782 859.240 0.000 0.000
5542.670 5842.593 9748.742 3572.753 770.110 473.833 286.208 12.795 276.521 276.787 839.777 0.000 0.000
5701.095 5822.677 9928.963 3604.407 651.649 436.940 264.515 12.132 205.074 198.781 816.121 0.000 0.000
5657.524 5849.707 9725.956 3586.328 773.924 487.765 294.339 13.456 254.027 251.461 786.797 0.000 0.000
5777.192 5822.372 9935.261 3617.644 743.599 456.303 276.207 12.457 279.953 272.829 768.997 0.000 0.000
5660.033 5851.597 9713.186 3599.779 820.166 493.151 295.179 13.596 301.961 298.833 738.352 0.000 0.000
5640.843 5807.036 9798.463 3591.253 629.146 351.585 180.046 14.269 265.955 256.574 709.472 0.000 0.000
5714.651 5851.018 9832.902 3614.952 772.222 401.663 197.861 17.038 337.647 332.804 695.977 0.000 0.000
5724.058 5807.343 9806.919 3602.480 656.785 355.842 183.545 14.471 288.564 277.148 668.951 0.000 0.000
5681.948 5852.792 9813.468 3623.392 877.910 416.657 201.330 17.454 430.776 425.555 669.068 0.000 0.000
6265.551 5826.791 9949.478 3645.344 1030.717 661.847 208.148 17.762 568.915 424.458 663.718 0.000 0.000
5763.804 5862.045 10168.989 3683.041 966.853 442.515 222.032 19.469 485.971 479.159 650.065 0.000 0.000
5932.583 5822.891 10004.099 3656.150 763.985 405.568 205.704 17.345 343.667 327.326 624.866 0.000 0.000
5890.683 5882.241 10203.252 3737.363 979.443 468.428 233.404 21.593 474.652 465.229 613.284 0.000 0.000
5907.127 5828.063 9983.026 3645.104 777.450 422.543 212.224 18.077 338.502 320.211 593.760 0.000 0.000
5973.892 5878.569 10414.183 3776.429 988.204 502.585 245.691 23.177 452.688 437.958 593.734 0.000 0.000
5999.062 5843.136 10431.820 3776.043 886.512 466.573 244.742 21.303 401.304 379.597 584.426 0.000 0.000
5802.772 5879.462 10255.706 3782.129 1131.678 511.443 243.752 23.627 582.060 569.901 569.950 0.000 0.000
6040.364 5838.864 10172.545 3704.922 927.791 486.075 238.959 21.438 423.612 400.392 545.770 0.000 0.000
5974.247 5889.443 10785.004 3906.344 1201.819 582.030 286.344 28.453 581.319 563.692 565.256 0.000 0.000
6185.360 5871.308 10675.076 3862.395 1044.241 524.659 278.511 25.544 497.958 468.343 551.707 0.000 0.000
6098.932 5901.716 10787.633 3909.595 1242.428 582.900 286.725 28.737 615.565 592.976 536.952 0.000 0.000
6237.389 5863.149 10836.057 3899.096 1144.514 553.592 292.793 27.093 571.810 539.514 527.113 0.000 0.000
/*
* Copyright (c) 2003, 2007-8 Matteo Frigo
* Copyright (c) 2003, 2007-8 Massachusetts Institute of Technology
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
/* machine-dependent cycle counters code. Needs to be inlined. */
/***************************************************************************/
/* To use the cycle counters in your code, simply #include "cycle.h" (this
file), and then use the functions/macros:
ticks getticks(void);
ticks is an opaque typedef defined below, representing the current time.
You extract the elapsed time between two calls to gettick() via:
double elapsed(ticks t1, ticks t0);
which returns a double-precision variable in arbitrary units. You
are not expected to convert this into human units like seconds; it
is intended only for *comparisons* of time intervals.
(In order to use some of the OS-dependent timer routines like
Solaris' gethrtime, you need to paste the autoconf snippet below
into your configure.ac file and #include "config.h" before cycle.h,
or define the relevant macros manually if you are not using autoconf.)
*/
/***************************************************************************/
/* This file uses macros like HAVE_GETHRTIME that are assumed to be
defined according to whether the corresponding function/type/header
is available on your system. The necessary macros are most
conveniently defined if you are using GNU autoconf, via the tests:
dnl ---------------------------------------------------------------------
AC_C_INLINE
AC_HEADER_TIME
AC_CHECK_HEADERS([sys/time.h c_asm.h intrinsics.h mach/mach_time.h])
AC_CHECK_TYPE([hrtime_t],[AC_DEFINE(HAVE_HRTIME_T, 1, [Define to 1 if hrtime_t is defined in <sys/time.h>])],,[#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif])
AC_CHECK_FUNCS([gethrtime read_real_time time_base_to_time clock_gettime mach_absolute_time])
dnl Cray UNICOS _rtc() (real-time clock) intrinsic
AC_MSG_CHECKING([for _rtc intrinsic])
rtc_ok=yes
AC_TRY_LINK([#ifdef HAVE_INTRINSICS_H
#include <intrinsics.h>
#endif], [_rtc()], [AC_DEFINE(HAVE__RTC,1,[Define if you have the UNICOS _rtc() intrinsic.])], [rtc_ok=no])
AC_MSG_RESULT($rtc_ok)
dnl ---------------------------------------------------------------------
*/
/***************************************************************************/
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
#define INLINE_ELAPSED(INL) static INL double elapsed(ticks t1, ticks t0) \
{ \
return (double)t1 - (double)t0; \
}
/*----------------------------------------------------------------*/
/* Solaris */
#if defined(HAVE_GETHRTIME) && defined(HAVE_HRTIME_T) && !defined(HAVE_TICK_COUNTER)
typedef hrtime_t ticks;
#define getticks gethrtime
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/* AIX v. 4+ routines to read the real-time clock or time-base register */
#if defined(HAVE_READ_REAL_TIME) && defined(HAVE_TIME_BASE_TO_TIME) && !defined(HAVE_TICK_COUNTER)
typedef timebasestruct_t ticks;
static __inline ticks getticks(void)
{
ticks t;
read_real_time(&t, TIMEBASE_SZ);
return t;
}
static __inline double elapsed(ticks t1, ticks t0) /* time in nanoseconds */
{
time_base_to_time(&t1, TIMEBASE_SZ);
time_base_to_time(&t0, TIMEBASE_SZ);
return (((double)t1.tb_high - (double)t0.tb_high) * 1.0e9 +
((double)t1.tb_low - (double)t0.tb_low));
}
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/*
* PowerPC ``cycle'' counter using the time base register.
*/
#if ((((defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))) || (defined(__MWERKS__) && defined(macintosh)))) || (defined(__IBM_GCC_ASM) && (defined(__powerpc__) || defined(__ppc__)))) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long long ticks;
static __inline__ ticks getticks(void)
{
unsigned int tbl, tbu0, tbu1;
do {
__asm__ __volatile__ ("mftbu %0" : "=r"(tbu0));
__asm__ __volatile__ ("mftb %0" : "=r"(tbl));
__asm__ __volatile__ ("mftbu %0" : "=r"(tbu1));
} while (tbu0 != tbu1);
return (((unsigned long long)tbu0) << 32) | tbl;
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/* MacOS/Mach (Darwin) time-base register interface (unlike UpTime,
from Carbon, requires no additional libraries to be linked). */
#if defined(HAVE_MACH_ABSOLUTE_TIME) && defined(HAVE_MACH_MACH_TIME_H) && !defined(HAVE_TICK_COUNTER)
#include <mach/mach_time.h>
typedef uint64_t ticks;
#define getticks mach_absolute_time
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/*
* Pentium cycle counter
*/
#if (defined(__GNUC__) || defined(__ICC)) && defined(__i386__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long long ticks;
#ifndef INLINE
# if __GNUC__ && !__GNUC_STDC_INLINE__
# define INLINE extern inline
# else
# define INLINE inline
# endif
#endif
INLINE ticks getticks(void)
{
ticks ret;
__asm__ __volatile__("rdtsc": "=A" (ret));
/* no input, nothing else clobbered */
return ret;
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */
#endif
/* Visual C++ -- thanks to Morten Nissov for his help with this */
#if _MSC_VER >= 1200 && _M_IX86 >= 500 && !defined(HAVE_TICK_COUNTER)
#include <windows.h>
typedef LARGE_INTEGER ticks;
#define RDTSC __asm __emit 0fh __asm __emit 031h /* hack for VC++ 5.0 */
static __inline ticks getticks(void)
{
ticks retval;
__asm {
RDTSC
mov retval.HighPart, edx
mov retval.LowPart, eax
}
return retval;
}
static __inline double elapsed(ticks t1, ticks t0)
{
return (double)t1.QuadPart - (double)t0.QuadPart;
}
#define HAVE_TICK_COUNTER
#define TIME_MIN 5000.0 /* unreliable pentium IV cycle counter */
#endif
/*----------------------------------------------------------------*/
/*
* X86-64 cycle counter
*/
#if (defined(__GNUC__) || defined(__ICC) || defined(__SUNPRO_C)) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long long ticks;
#ifndef INLINE
# if __GNUC__ && !__GNUC_STDC_INLINE__
# define INLINE extern inline
# else
# define INLINE inline
# endif
#endif
INLINE ticks getticks(void)
{
unsigned a, d;
asm volatile("rdtsc" : "=a" (a), "=d" (d));
return ((ticks)a) | (((ticks)d) << 32);
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/* PGI compiler, courtesy Cristiano Calonaci, Andrea Tarsi, & Roberto Gori.
NOTE: this code will fail to link unless you use the -Masmkeyword compiler
option (grrr). */
#if defined(__PGI) && defined(__x86_64__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long long ticks;
static ticks getticks(void)
{
asm(" rdtsc; shl $0x20,%rdx; mov %eax,%eax; or %rdx,%rax; ");
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/* Visual C++, courtesy of Dirk Michaelis */
#if _MSC_VER >= 1400 && (defined(_M_AMD64) || defined(_M_X64)) && !defined(HAVE_TICK_COUNTER)
#include <intrin.h>
#pragma intrinsic(__rdtsc)
typedef unsigned __int64 ticks;
#define getticks __rdtsc
INLINE_ELAPSED(__inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/*
* IA64 cycle counter
*/
/* intel's icc/ecc compiler */
#if (defined(__EDG_VERSION) || defined(__ECC)) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long ticks;
#include <ia64intrin.h>
static __inline__ ticks getticks(void)
{
return __getReg(_IA64_REG_AR_ITC);
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/* gcc */
#if defined(__GNUC__) && defined(__ia64__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long ticks;
static __inline__ ticks getticks(void)
{
ticks ret;
__asm__ __volatile__ ("mov %0=ar.itc" : "=r"(ret));
return ret;
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/* HP/UX IA64 compiler, courtesy Teresa L. Johnson: */
#if defined(__hpux) && defined(__ia64) && !defined(HAVE_TICK_COUNTER)
#include <machine/sys/inline.h>
typedef unsigned long ticks;
static inline ticks getticks(void)
{
ticks ret;
ret = _Asm_mov_from_ar (_AREG_ITC);
return ret;
}
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
/* Microsoft Visual C++ */
#if defined(_MSC_VER) && defined(_M_IA64) && !defined(HAVE_TICK_COUNTER)
typedef unsigned __int64 ticks;
# ifdef __cplusplus
extern "C"
# endif
ticks __getReg(int whichReg);
#pragma intrinsic(__getReg)
static __inline ticks getticks(void)
{
volatile ticks temp;
temp = __getReg(3116);
return temp;
}
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/*
* PA-RISC cycle counter
*/
#if defined(__hppa__) || defined(__hppa) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long ticks;
# ifdef __GNUC__
static __inline__ ticks getticks(void)
{
ticks ret;
__asm__ __volatile__("mfctl 16, %0": "=r" (ret));
/* no input, nothing else clobbered */
return ret;
}
# else
# include <machine/inline.h>
static inline unsigned long getticks(void)
{
register ticks ret;
_MFCTL(16, ret);
return ret;
}
# endif
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/* S390, courtesy of James Treacy */
#if defined(__GNUC__) && defined(__s390__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long long ticks;
static __inline__ ticks getticks(void)
{
ticks cycles;
__asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc");
return cycles;
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
#if defined(__GNUC__) && defined(__alpha__) && !defined(HAVE_TICK_COUNTER)
/*
* The 32-bit cycle counter on alpha overflows pretty quickly,
* unfortunately. A 1GHz machine overflows in 4 seconds.
*/
typedef unsigned int ticks;
static __inline__ ticks getticks(void)
{
unsigned long cc;
__asm__ __volatile__ ("rpcc %0" : "=r"(cc));
return (cc & 0xFFFFFFFF);
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
#if defined(__GNUC__) && defined(__sparc_v9__) && !defined(HAVE_TICK_COUNTER)
typedef unsigned long ticks;
static __inline__ ticks getticks(void)
{
ticks ret;
__asm__ __volatile__("rd %%tick, %0" : "=r" (ret));
return ret;
}
INLINE_ELAPSED(__inline__)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
#if (defined(__DECC) || defined(__DECCXX)) && defined(__alpha) && defined(HAVE_C_ASM_H) && !defined(HAVE_TICK_COUNTER)
# include <c_asm.h>
typedef unsigned int ticks;
static __inline ticks getticks(void)
{
unsigned long cc;
cc = asm("rpcc %v0");
return (cc & 0xFFFFFFFF);
}
INLINE_ELAPSED(__inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/* SGI/Irix */
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) && !defined(HAVE_TICK_COUNTER)
typedef struct timespec ticks;
static inline ticks getticks(void)
{
struct timespec t;
clock_gettime(CLOCK_SGI_CYCLE, &t);
return t;
}
static inline double elapsed(ticks t1, ticks t0)
{
return ((double)t1.tv_sec - (double)t0.tv_sec) * 1.0E9 +
((double)t1.tv_nsec - (double)t0.tv_nsec);
}
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/* Cray UNICOS _rtc() intrinsic function */
#if defined(HAVE__RTC) && !defined(HAVE_TICK_COUNTER)
#ifdef HAVE_INTRINSICS_H
# include <intrinsics.h>
#endif
typedef long long ticks;
#define getticks _rtc
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
/*----------------------------------------------------------------*/
/* MIPS ZBus */
#if HAVE_MIPS_ZBUS_TIMER
#if defined(__mips__) && !defined(HAVE_TICK_COUNTER)
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
typedef uint64_t ticks;
static inline ticks getticks(void)
{
static uint64_t* addr = 0;
if (addr == 0)
{
uint32_t rq_addr = 0x10030000;
int fd;
int pgsize;
pgsize = getpagesize();
fd = open ("/dev/mem", O_RDONLY | O_SYNC, 0);
if (fd < 0) {
perror("open");
return NULL;
}
addr = mmap(0, pgsize, PROT_READ, MAP_SHARED, fd, rq_addr);
close(fd);
if (addr == (uint64_t *)-1) {
perror("mmap");
return NULL;
}
}
return *addr;
}
INLINE_ELAPSED(inline)
#define HAVE_TICK_COUNTER
#endif
#endif /* HAVE_MIPS_ZBUS_TIMER */
3afe2c7e0c425a30cdd406cfb93f305b5a55dafd
\ No newline at end of file
98c93e9342eca73ce75144010612d4e0d47e3650
\ No newline at end of file
d57fee6402e9e77800e477525643d943f172dcbc
\ No newline at end of file
/* Get the inlining right. */
#ifndef INLINE
# if __GNUC__ && !__GNUC_STDC_INLINE__
# define INLINE extern inline
# else
# define INLINE inline
# endif
#endif
#ifdef PTHREAD_LOCK
#define lock_type pthread_spinlock_t
#define lock_init( l ) ( pthread_spin_init( l , PTHREAD_PROCESS_PRIVATE ) != 0 )
#define lock_destroy( l ) ( pthread_spin_destroy( l ) != 0 )
#define lock_lock( l ) ( pthread_spin_lock( l ) != 0 )
#define lock_trylock( l ) ( pthread_spin_lock( l ) != 0 )
#define lock_unlock( l ) ( pthread_spin_unlock( l ) != 0 )
#else
#define lock_type volatile int
#define lock_init( l ) ( *l = 0 )
#define lock_destroy( l ) 0
INLINE int lock_lock ( volatile int *l ) {
while ( __sync_val_compare_and_swap( l , 0 , 1 ) != 0 )
while( *l );
return 0;
}
#define lock_trylock( l ) ( ( *(l) ) ? 1 : __sync_val_compare_and_swap( l , 0 , 1 ) )
#define lock_unlock( l ) ( *l = 0 )
#endif