1
/* $Id: locks.h,v 1.28.2.4 2006-12-21 23:50:48 manoj Exp $ */
2
#ifndef _ARMCI_LOCKS_H_
3
#define _ARMCI_LOCKS_H_
6
#define NUM_LOCKS MAX_LOCKS
12
#include <elan/elan.h>
15
#if !defined(CYGNUS) && !defined(QUADRICS) || defined(ELAN_ACC)
20
/* code disabled until more tests of pthread locking is done */
21
#if !defined(SPINLOCK) && (defined(SGI) || defined(DECOSF)) && defined(PTHREADS)
22
/* check if Pthreads locks in Posix 1003.1c support processes*/
25
#ifdef _POSIX_THREAD_PROCESS_SHARED
32
#if defined(PTHREADS) && !(defined(PMUTEXES) || defined(SPINLOCK)||defined(QUADRICS))
33
# if defined(LINUX) && defined(__sparc__) && defined(GM)
42
#if (defined(SPINLOCK) || defined(PMUTEXES) || defined(HITACHI)\
47
long idlist[SHMIDLEN];
49
extern lockset_t lockid;
51
typedef int lockset_t;
59
# define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)(((void**)_armci_int_mutexes)[]))
60
# define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)(((void**)_armci_int_mutexes)[x]))
62
# define NAT_LOCK(x,p) \
63
armci_acquire_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x ))
64
# define NAT_UNLOCK(x,p) \
65
armci_release_spinlock((LOCK_T*)( ((PAD_LOCK_T*)(((void**)_armci_int_mutexes)[p]))+x ))
66
EXTERN PAD_LOCK_T *_armci_int_mutexes;
68
# define NAT_LOCK(x,p) armci_acquire_spinlock((LOCK_T*)(_armci_int_mutexes+(x)))
69
# define NAT_UNLOCK(x,p) armci_release_spinlock((LOCK_T*)(_armci_int_mutexes+(x)))
70
EXTERN PAD_LOCK_T *_armci_int_mutexes;
73
#elif defined(PMUTEXES)
75
# define NAT_LOCK(x,p) pthread_mutex_lock(_armci_int_mutexes +x)
76
# define NAT_UNLOCK(x,p) pthread_mutex_unlock(_armci_int_mutexes +x)
77
# define LOCK_T pthread_mutex_t
78
# define PAD_LOCK_T LOCK_T
79
EXTERN PAD_LOCK_T *_armci_int_mutexes;
81
#elif defined(HITACHI)
83
extern void armcill_lock(int mutex, int proc);
84
extern void armcill_unlock(int mutex, int proc);
87
# define PAD_LOCK_T LOCK_T
88
# define NAT_LOCK(x,p) armcill_lock((x),(p))
89
# define NAT_UNLOCK(x,p) armcill_unlock((x),(p))
90
EXTERN PAD_LOCK_T *_armci_int_mutexes;
94
# define SGI_SPINS 100
99
ulock_t * lock_array[NUM_LOCKS];
102
extern lockset_t lockset;
103
# define NAT_LOCK(x,p) (void) uswsetlock(lockset.lock_array[(x)],SGI_SPINS)
104
# define NAT_UNLOCK(x,p) (void) usunsetlock(lockset.lock_array[(x)])
106
#elif defined(CONVEX)
108
# include <sys/cnx_ail.h>
114
typedef int lockset_t;
115
extern lock_t *lock_array;
116
extern void setlock(unsigned * volatile lp);
117
extern void unsetlock(unsigned * volatile lp);
118
# define NAT_LOCK(x,p) (void) setlock(&lock_array[x].state)
119
# define NAT_UNLOCK(x,p) (void) unsetlock(&lock_array[(x)].state)
123
typedef int lockset_t;
124
extern void setlock(int);
125
extern void unsetlock(int);
126
# define NAT_LOCK(x,p) setlock(x)
127
# define NAT_UNLOCK(x,p) unsetlock(x)
129
#elif defined(CRAY_YMP) && !defined(__crayx1)
132
typedef int lockset_t;
133
extern lock_t cri_l[NUM_LOCKS];
134
# pragma _CRI common cri_l
136
# define NAT_LOCK(x,p) t_lock(cri_l+(x))
137
# define NAT_UNLOCK(x,p) t_unlock(cri_l+(x))
139
#elif defined(QUADRICS) && defined(_ELAN_LOCK_H)
141
extern void armcill_allocate_locks(int);
142
extern void armcill_lock(int m, int proc);
143
extern void armcill_unlock(int m, int proc);
146
# define NAT_LOCK armcill_lock
147
# define NAT_UNLOCK armcill_unlock
148
typedef int lockset_t;
151
#elif defined(CRAY_T3E) || defined(QUADRICS) || defined(__crayx1)\
152
|| defined(CATAMOUNT) || defined(CRAY_SHMEM)
154
# if defined(CRAY) || defined(CRAY_SHMEM)
155
# include <mpp/shmem.h>
157
#if defined(DECOSF) || defined(LINUX64) || defined(__crayx1)\
158
|| defined(CATAMOUNT)
159
# define _INT_MIN_64 (LONG_MAX-1)
163
static long armci_lock_var[4]={0,0,0,0};
164
typedef int lockset_t;
165
# define INVALID (long)(_INT_MIN_64 +1)
166
# define NAT_LOCK(x,p) while( shmem_swap(armci_lock_var+(x),INVALID,(p)) )
167
# define NAT_UNLOCK(x,p) shmem_swap(armci_lock_var+(x), 0, (p))
170
#elif defined(SYSV) && defined(LAPI) && defined(AIX)
172
int **_armci_int_mutexes;
173
# define NAT_LOCK(x,p) armci_lapi_lock(_armci_int_mutexes[armci_master]+(x))
174
# define NAT_UNLOCK(x,p) armci_lapi_unlock(_armci_int_mutexes[armci_master]+(x))
175
typedef int lockset_t;
177
#elif defined(CYGNUS)
179
typedef int lockset_t;
180
# define NAT_LOCK(x,p) armci_die("does not run in parallel",0)
181
# define NAT_UNLOCK(x,p) armci_die("does not run in parallel",0)
183
#elif defined(LAPI) && !defined (LINUX)
185
# include <pthread.h>
186
typedef int lockset_t;
187
extern pthread_mutex_t _armci_mutex_thread;
188
# define NAT_LOCK(x,p) pthread_mutex_lock(&_armci_mutex_thread)
189
# define NAT_UNLOCK(x,p) pthread_mutex_unlock(&_armci_mutex_thread)
192
#elif defined(FUJITSU)
193
typedef int lockset_t;
194
# include "fujitsu-vpp.h"
196
#elif defined(SYSV) ||defined(MACX)
198
# include "semaphores.h"
200
# define NUM_LOCKS ((MAX_LOCKS< SEMMSL) ? MAX_LOCKS:SEMMSL)
202
# define NAT_LOCK(x,p) P_semaphore(x)
203
# define NAT_UNLOCK(x,p) V_semaphore(x)
206
#define CreateInitLocks Sem_CreateInitLocks
207
#define InitLocks Sem_InitLocks
208
#define DeleteLocks Sem_DeleteLocks
213
typedef int lockset_t;
214
# define NAT_LOCK(x,p) crap
215
# define NAT_UNLOCK(x,p) crap2
216
# error "no spin lock?"
220
extern void CreateInitLocks(int num, lockset_t *id);
221
extern void InitLocks(int num , lockset_t id);
222
extern void DeleteLocks(lockset_t id);
225
#define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(p); }
226
#define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(p); }
228
#define NATIVE_LOCK(x,p) if(armci_nproc>1) { NAT_LOCK(x,p); }
229
#define NATIVE_UNLOCK(x,p) if(armci_nproc>1) { NAT_UNLOCK(x,p); }