1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
9 runtime_initlock(Lock
*l
)
12 if(sem_init(&l
->sem
, 0, 0) != 0)
13 runtime_throw("sem_init failed");
17 runtime_xadd(uint32
volatile *val
, int32 delta
)
24 if(runtime_cas(val
, oval
, nval
))
29 // noinline so that runtime_lock doesn't have to split the stack.
30 static void runtime_lock_full(Lock
*l
) __attribute__ ((noinline
));
33 runtime_lock_full(Lock
*l
)
35 if(sem_wait(&l
->sem
) != 0)
36 runtime_throw("sem_wait failed");
44 runtime_throw("lock count");
48 if(runtime_xadd(&l
->key
, 1) > 1) // someone else has it; wait
52 static void runtime_unlock_full(Lock
*l
) __attribute__ ((noinline
));
55 runtime_unlock_full(Lock
*l
)
57 if(sem_post(&l
->sem
) != 0)
58 runtime_throw("sem_post failed");
62 runtime_unlock(Lock
*l
)
67 runtime_throw("lock count");
70 if(runtime_xadd(&l
->key
, -1) > 0) // someone else is waiting
71 runtime_unlock_full(l
);
75 runtime_destroylock(Lock
*l
)
80 #ifndef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
82 // For targets which don't have the required sync support. Really
83 // this should be provided by gcc itself. FIXME.
85 static pthread_mutex_t sync_lock
= PTHREAD_MUTEX_INITIALIZER
;
88 __sync_bool_compare_and_swap_4(uint32
*, uint32
, uint32
)
89 __attribute__((visibility("hidden")));
92 __sync_bool_compare_and_swap_4(uint32
* ptr
, uint32 old
, uint32
new)
97 i
= pthread_mutex_lock(&sync_lock
);
107 i
= pthread_mutex_unlock(&sync_lock
);