1 // Copyright 2011 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.
10 waitsema
uintptr // semaphore for parking on locks
13 func getProcID() uint64 {
14 return uint64(gettid())
18 func libc_malloc(uintptr) unsafe
.Pointer
22 func sem_init(sem
*semt
, pshared
int32, value
uint32) int32
26 func sem_wait(sem
*semt
) int32
30 func sem_post(sem
*semt
) int32
33 //extern sem_reltimedwait_np
34 func sem_reltimedwait_np(sem
*semt
, timeout
*timespec
) int32
37 func semacreate(mp
*m
) {
44 // Call libc's malloc rather than malloc. This will
45 // allocate space on the C heap. We can't call malloc
46 // here because it could cause a deadlock.
47 sem
= (*semt
)(libc_malloc(unsafe
.Sizeof(*sem
)))
48 if sem_init(sem
, 0, 0) != 0 {
51 mp
.waitsema
= uintptr(unsafe
.Pointer(sem
))
55 func semasleep(ns
int64) int32 {
61 if sem_reltimedwait_np((*semt
)(unsafe
.Pointer(_m_
.waitsema
)), &ts
) != 0 {
63 if err
== _ETIMEDOUT || err
== _EAGAIN || err
== _EINTR
{
66 throw("sem_reltimedwait_np")
71 r1
:= sem_wait((*semt
)(unsafe
.Pointer(_m_
.waitsema
)))
75 if errno() == _EINTR
{
84 func semawakeup(mp
*m
) {
85 if sem_post((*semt
)(unsafe
.Pointer(mp
.waitsema
))) != 0 {