PAPI 7.1.0.0
Loading...
Searching...
No Matches
darwin-lock.h
Go to the documentation of this file.
1#ifndef _DARWIN_LOCK_H
2#define _DARWIN_LOCK_H
3
4#include "mb.h"
5
6/* Locking functions */
7
8#if defined(USE_PTHREAD_MUTEXES)
9
10#include <pthread.h>
11
13
14#define _papi_hwd_lock(lck) \
15do \
16{ \
17 pthread_mutex_lock (&_papi_hwd_lock_data[lck]); \
18} while(0)
19#define _papi_hwd_unlock(lck) \
20do \
21{ \
22 pthread_mutex_unlock(&_papi_hwd_lock_data[lck]); \
23} while(0)
24
25
26#else
27
28extern volatile unsigned int _papi_hwd_lock_data[PAPI_MAX_LOCK];
29#define MUTEX_OPEN 0
30#define MUTEX_CLOSED 1
31
32#define _papi_hwd_lock(lck) \
33do \
34{ \
35 unsigned int res = 0; \
36 do { \
37 __asm__ __volatile__ ("lock ; " "cmpxchg %1,%2" : "=a"(res) : "q"(MUTEX_CLOSED), "m"(_papi_hwd_lock_data[lck]), "0"(MUTEX_OPEN) : "memory"); \
38 } while(res != (unsigned int)MUTEX_OPEN); \
39} while(0)
40#define _papi_hwd_unlock(lck) \
41do \
42{ \
43 unsigned int res = 0; \
44 __asm__ __volatile__ ("xchg %0,%1" : "=r"(res) : "m"(_papi_hwd_lock_data[lck]), "0"(MUTEX_OPEN) : "memory"); \
45} while(0)
46
47#endif
48#endif
volatile unsigned int _papi_hwd_lock_data[PAPI_MAX_LOCK]
Definition: darwin-common.c:32
#define PAPI_MAX_LOCK
Definition: papi_lock.h:18