5
/* $Id: locks.c,v 1.15.6.1 2006-12-14 13:24:36 manoj Exp $ */
16
PAD_LOCK_T *_armci_int_mutexes;
18
#if !defined(armci_die)
19
extern void armci_die(char*,int);
22
#if defined(SPINLOCK) || defined(PMUTEX) || defined(PSPIN)
28
void CreateInitLocks(int num_locks, lockset_t *plockid)
30
int locks_per_proc, size;
32
/* locks per process in the SMP node */
33
locks_per_proc = num_locks/armci_clus_info[armci_clus_me].nslave + 1;
34
locks_per_proc = num_locks; /* this is am altix hack and no clue why this is works */
35
size=locks_per_proc*sizeof(PAD_LOCK_T);
36
ptr_arr = (void**)malloc(armci_nproc*sizeof(void*));
37
PARMCI_Malloc(ptr_arr, size);
38
_armci_int_mutexes = (PAD_LOCK_T*) ptr_arr;
39
bzero((char*)ptr_arr[armci_me],size);
42
void DeleteLocks(lockset_t lockid) {
43
ptr_arr = (void**)_armci_int_mutexes;
44
PARMCI_Free(ptr_arr[armci_me]);
45
_armci_int_mutexes = (PAD_LOCK_T*)0;
50
void CreateInitLocks(int num_locks, lockset_t *plockid)
52
int locks_per_proc, size;
54
fprintf(stderr,"createinitlocks\n");
56
ptr_arr = (void**)malloc(armci_nproc*sizeof(void*));
57
locks_per_proc = (num_locks*armci_nclus)/armci_nproc + 1;
58
size=locks_per_proc*sizeof(PAD_LOCK_T);
59
PARMCI_Malloc(ptr_arr, size);
60
_armci_int_mutexes = (PAD_LOCK_T*) ptr_arr[armci_master];
62
if(!_armci_int_mutexes) armci_die("Failed to create spinlocks",size);
65
if(armci_me == armci_master) {
67
pthread_mutexattr_t pshared;
68
if(pthread_mutexattr_init(&pshared))
69
armci_die("armci_allocate_locks: could not init mutex attr",0);
71
if(pthread_mutexattr_setpshared(&pshared,PTHREAD_PROCESS_SHARED))
72
armci_die("armci_allocate_locks: could not set PROCESS_SHARED",0);
75
for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){
76
if(pthread_mutex_init(_armci_int_mutexes+i,&pshared))
77
armci_die("armci_allocate_locks: could not init mutex",i);
81
if(armci_me == armci_master) {
82
for(i=0; i< locks_per_proc*armci_clus_info[armci_clus_me].nslave; i++){
83
if(pthread_spin_init(_armci_int_mutexes+i,PTHREAD_PROCESS_SHARED))
84
armci_die("armci_allocate_locks: could not init mutex",i);
88
bzero((char*)ptr_arr[armci_me],size);
92
void InitLocks(int num_locks, lockset_t lockid)
94
/* what are you doing here ?
95
All processes should've called CreateInitLocks().
96
Check preprocessor directtives and see lock allocation in armci_init */
97
armci_die("InitLocks(): what are you doing here ?",armci_me);
101
void DeleteLocks(lockset_t lockid)
103
_armci_int_mutexes = (PAD_LOCK_T*)0;
108
/********************* all SGI systems ****************/
112
static char arena_name[FILE_LEN];
116
extern char *getenv(const char *);
118
void CreateInitLocks(int num_locks, lockset_t *lockid)
123
if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks);
124
lockset.id = (int)getpid();
125
if (!(tmp = getenv("ARENA_DIR"))) tmp = "/tmp";
126
sprintf(arena_name,"%s/armci_arena%d.%ld", tmp,armci_clus_me,lockset.id);
128
(void) usconfig(CONF_ARENATYPE, US_GENERAL);
129
(void) usconfig(CONF_INITUSERS, (unsigned int)
130
armci_clus_info[armci_clus_me].nslave+1); /* +1 for server */
131
arena_ptr = usinit(arena_name);
132
if(!arena_ptr) armci_die("Failed to Create Arena", 0);
134
for(i=0; i<num_locks; i++){
135
lockset.lock_array[i] = usnewlock(arena_ptr);
136
if(lockset.lock_array[i] == NULL) armci_die("Failed to Create Lock", i);
144
void InitLocks(int num_locks, lockset_t lockid)
149
/* if(avail) armci_die("Arena already attached", avail); */
151
if (!(tmp = getenv("ARENA_DIR"))) tmp = "/tmp";
152
sprintf(arena_name,"%s/armci_arena%d.%ld", tmp,armci_clus_me,lockset.id);
154
(void) usconfig(CONF_ARENATYPE, US_GENERAL);
155
arena_ptr = usinit(arena_name);
156
if(!arena_ptr) armci_die("Failed to Attach to Arena", lockid.id);
157
/* else fprintf(stderr, "attached arena %x\n",arena_ptr); */
159
for(i=0; i<num_locks; i++){
160
if(lockset.lock_array[i] == NULL) armci_die("Failed to Attach Lock", i);
166
void DeleteLocks(lockset_t lockid)
168
/* fprintf(stderr, "deleting arena %x\n",arena_ptr);*/
171
usdetach (arena_ptr);
173
(void)unlink(arena_name); /*ignore armci_die code:file might be already gone*/
177
/***************** Convex/HP Exemplar ****************/
178
#elif defined(CONVEX)
179
#include <sys/param.h>
180
#include <sys/file.h>
181
#include <sys/cnx_mman.h>
182
#include <sys/mman.h>
183
#include <sys/types.h>
184
#include <sys/cnx_ail.h>
188
static char file_name[FILE_LEN];
190
static unsigned shmem_size=-1;
193
void CreateInitLocks(int num_locks, lockset_t *lockid)
197
if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks);
198
*lockid = (int)getpid();
199
sprintf(file_name,"/tmp/ga.locks.%ld", *lockid);
200
if ( (fd = open(file_name, O_RDWR|O_CREAT, 0666)) < 0 )
201
armci_die("CreateInitLocks: failed to open temporary file",0);
203
shmem_size = (NUM_LOCKS)*sizeof(lock_t);
204
lock_array = (lock_t*) mmap((caddr_t) 0, shmem_size,
205
PROT_READ|PROT_WRITE,
206
MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0);
208
if(((unsigned)lock_array)%16)armci_die("CreateInitLocks: not aligned",0);
209
for (i=0; i<NUM_LOCKS; i++)
210
lock_array[i].state = 0;
214
void InitLocks(int num_locks, lockset_t lockid)
218
if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks);
219
sprintf(file_name,"/tmp/ga.locks.%ld", lockid);
220
if ( (fd = open(file_name, O_RDWR|O_CREAT, 0666)) < 0 )
221
armci_die("InitLocks: failed to open temporary file",0);
223
shmem_size = (NUM_LOCKS)*sizeof(lock_t);
224
lock_array = (lock_t*) mmap((caddr_t) 0, shmem_size,
225
PROT_READ|PROT_WRITE,
226
MAP_ANONYMOUS|CNX_MAP_SEMAPHORE|MAP_SHARED, fd, 0);
227
if(((unsigned)lock_array)%16)armci_die("InitLocks: not aligned",0);
231
void DeleteLocks(lockset_t lockid)
234
(void)unlink(file_name); /*ignore armci_die code: file might be already gone*/
235
(void)munmap((char *) shmem_size, 0);
239
void setlock(unsigned * volatile lp)
241
volatile unsigned flag;
243
flag = fetch_and_inc32(lp);
250
void unsetlock(unsigned * volatile lp)
252
(void)fetch_and_clear32(lp);
257
/****************************** Windows NT ********************************/
261
HANDLE mutex_arr[NUM_LOCKS];
262
static int parent_pid;
263
static int num_alloc_locks=0;
265
void CreateInitLocks(int num_locks, lockset_t *lockid)
268
if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks);
269
*lockid = parent_pid = _getpid();
271
InitLocks(num_locks, *lockid);
275
void InitLocks(int num_locks, lockset_t lockid)
280
for(i=0;i<num_locks;i++){
281
sprintf(lock_name,"ARMCImutex.%d.%d",(int)lockid,i);
282
mutex_arr[i] = CreateMutex(NULL, FALSE, lock_name);
283
if( mutex_arr[i] == NULL) armci_die("armci_die creating mutexes",i);
285
num_alloc_locks = num_locks;
288
void DeleteLocks(lockset_t lockid)
291
for(i=0;i<num_alloc_locks;i++)
292
(void)CloseHandle(mutex_arr[i]);
295
void setlock(int mutex)
298
if(mutex >num_alloc_locks || mutex <0)armci_die("setlock: invalid",mutex);
299
rc =WaitForSingleObject(mutex_arr[mutex],INFINITE);
302
case WAIT_OBJECT_0: /* OK */ break;
303
case WAIT_ABANDONED: /*abandoned: some process crashed holding mutex? */
304
armci_die("setlock: mutex abandoned",mutex);
305
default: /* some other problem */
306
fprintf(stderr,"WaitForSingleObject code=%d\n",rc);
307
armci_die("setlock: failed",mutex);
311
void unsetlock(int mutex)
313
if(mutex >num_alloc_locks || mutex <0)armci_die("unsetlock: invalid",mutex);
314
if(ReleaseMutex(mutex_arr[mutex])==FALSE)armci_die("unsetlock: failed",mutex);
318
#elif defined(CRAY_YMP)
320
lock_t cri_l[NUM_LOCKS];
321
#pragma _CRI common cri_l
323
void CreateInitLocks(int num_locks, lockset_t *lockid)
326
if(num_locks > NUM_LOCKS) armci_die("To many locks requested", num_locks);
328
for(i=0;i<num_locks;i++)cri_l[i]=0;
332
void InitLocks(int num_locks, lockset_t lockid)
337
void DeleteLocks(lockset_t lockid)
342
/*********************** every thing else *************************/
344
void CreateInitLocks(int num_locks, lockset_t *lockid)
347
void InitLocks(int num_locks, lockset_t lockid)
352
void DeleteLocks(lockset_t lockid)