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
14 func libc_malloc(uintptr) unsafe
.Pointer
18 func sem_init(sem
*semt
, pshared
int32, value
uint32) int32
22 func sem_wait(sem
*semt
) int32
26 func sem_post(sem
*semt
) int32
29 //extern sem_reltimedwait_np
30 func sem_reltimedwait_np(sem
*semt
, timeout
*timespec
) int32
33 func semacreate(mp
*m
) {
34 if mp
.mos
.waitsema
!= 0 {
40 // Call libc's malloc rather than malloc. This will
41 // allocate space on the C heap. We can't call malloc
42 // here because it could cause a deadlock.
43 sem
= (*semt
)(libc_malloc(unsafe
.Sizeof(*sem
)))
44 if sem_init(sem
, 0, 0) != 0 {
47 mp
.mos
.waitsema
= uintptr(unsafe
.Pointer(sem
))
51 func semasleep(ns
int64) int32 {
55 ts
.set_sec(ns
/ 1000000000)
56 ts
.set_nsec(int32(ns
% 1000000000))
58 if sem_reltimedwait_np((*semt
)(unsafe
.Pointer(_m_
.mos
.waitsema
)), &ts
) != 0 {
60 if err
== _ETIMEDOUT || err
== _EAGAIN || err
== _EINTR
{
63 throw("sem_reltimedwait_np")
68 r1
:= sem_wait((*semt
)(unsafe
.Pointer(_m_
.mos
.waitsema
)))
72 if errno() == _EINTR
{
81 func semawakeup(mp
*m
) {
82 if sem_post((*semt
)(unsafe
.Pointer(mp
.mos
.waitsema
))) != 0 {