libgo: Solaris and x/sys/cpu compatibility fixes
Restore Solaris compatibility fixes lost when internal/x/net/lif moved to golang.org/x/net/lif. Also fix the Makefile for x/net/lif and x/net/route. Change x/sys/cpu to get the cache line size from goarch.sh as the gofrontend version of internal/cpu does. Partially based on work by Rainer Orth. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/194438 From-SVN: r275611
This commit is contained in:
parent
4d7bfeec42
commit
efc864927f
16 changed files with 50 additions and 121 deletions
|
@ -1,4 +1,4 @@
|
|||
2f6dd921a21351e94f55a5365a3176af563b5945
|
||||
bf4832d604e7522dee78fca76de220b62a131d54
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -510,6 +510,14 @@ s-cpu: Makefile
|
|||
$(SHELL) $(srcdir)/mvifdiff.sh cpugen.go.tmp cpugen.go
|
||||
$(STAMP) $@
|
||||
|
||||
gcpugen.go: s-gcpu; @true
|
||||
s-gcpu: Makefile
|
||||
rm -f gcpugen.go.tmp
|
||||
echo "package cpu" > gcpugen.go.tmp
|
||||
echo "const cacheLineSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) cachelinesize`" >> gcpugen.go.tmp
|
||||
$(SHELL) $(srcdir)/mvifdiff.sh gcpugen.go.tmp gcpugen.go
|
||||
$(STAMP) $@
|
||||
|
||||
objabi.go: s-objabi; @true
|
||||
s-objabi: Makefile
|
||||
rm -f objabi.go.tmp
|
||||
|
@ -773,7 +781,7 @@ GOLINK = $(LIBTOOL) --tag GO --mode-link $(GOC) \
|
|||
BUILDDEPS = \
|
||||
$(MKDIR_P) $(@D); \
|
||||
dir=`echo $@ | sed -e 's/.lo.dep$$//'`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$$dir --extrafiles="$(extra_go_files_$(subst /,_,$(subst .lo.dep,,$@)))" $(matchargs_$(subst /,_,$(subst .lo.dep,,$@)))`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$$dir --extrafiles="$(extra_go_files_$(subst .,_,$(subst /,_,$(subst .lo.dep,,$@))))" $(matchargs_$(subst /,_,$(subst .lo.dep,,$@)))`; \
|
||||
$(SHELL) $(srcdir)/godeps.sh `echo $@ | sed -e 's/.dep$$//'` $$files > $@.tmp; \
|
||||
if ! cmp $@.tmp $@ >/dev/null 2>/dev/null; then \
|
||||
rm -f `echo $@ | sed -e 's/\.dep$$//'`; \
|
||||
|
@ -804,7 +812,7 @@ GOBENCH =
|
|||
CHECK = \
|
||||
GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \
|
||||
export GC; \
|
||||
GOLIBS="$(extra_check_libs_$(subst /,_,$(@D))) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
|
||||
GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
|
||||
export GOLIBS; \
|
||||
RUNTESTFLAGS="$(RUNTESTFLAGS)"; \
|
||||
export RUNTESTFLAGS; \
|
||||
|
@ -818,7 +826,7 @@ CHECK = \
|
|||
export LD_LIBRARY_PATH; \
|
||||
$(MKDIR_P) $(@D); \
|
||||
rm -f $@-testsum $@-testlog; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$(@D) --extrafiles="$(extra_go_files_$(subst /,_,$(@D)))" $(matchargs_$(subst /,_,$(@D)))`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$(@D) --extrafiles="$(extra_go_files_$(subst .,_,$(subst /,_,$(@D))))" $(matchargs_$(subst /,_,$(@D)))`; \
|
||||
if test "$(USE_DEJAGNU)" = "yes"; then \
|
||||
$(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$$files" --testname="$(@D)" $(GOTESTFLAGS); \
|
||||
elif test "$(GOBENCH)" != ""; then \
|
||||
|
@ -951,6 +959,9 @@ runtime/internal/sys.lo.dep: $(extra_go_files_runtime_internal_sys)
|
|||
extra_go_files_internal_cpu = cpugen.go
|
||||
internal/cpu.lo.dep: $(extra_go_files_internal_cpu)
|
||||
|
||||
extra_go_files_golang_org_x_sys_cpu = gcpugen.go
|
||||
golang.org/x/sys/cpu.lo.dep: $(extra_go_files_golang_org_x_sys_cpu)
|
||||
|
||||
extra_go_files_internal_goroot = zstdpkglist.go
|
||||
internal/goroot.lo.dep: $(extra_go_files_internal_goroot)
|
||||
|
||||
|
@ -1047,34 +1058,27 @@ endif
|
|||
|
||||
if LIBGO_IS_BSD
|
||||
|
||||
# Build internal/x/net/route only on BSD systems.
|
||||
# Build golang.org/x/net/route only on BSD systems.
|
||||
|
||||
$(eval $(call PACKAGE_template,internal/x/net/route))
|
||||
$(eval $(call PACKAGE_template,golang.org/x/net/route))
|
||||
|
||||
golangorg_x_net_route_lo = \
|
||||
golang.org/net/route.lo
|
||||
golangorg_x_net_route_check = \
|
||||
golang.org/x/net/route/check
|
||||
|
||||
endif
|
||||
|
||||
if LIBGO_IS_SOLARIS
|
||||
|
||||
# Build internal/x/net/lif only on Solaris systems.
|
||||
# Build golang.org/x/net/lif only on Solaris systems.
|
||||
|
||||
$(eval $(call PACKAGE_template,internal/x/net/lif))
|
||||
$(eval $(call PACKAGE_template,golang.org/x/net/lif))
|
||||
|
||||
golangorg_x_net_lif_lo = \
|
||||
golang.org/x/net/lif.lo
|
||||
golangorg_x_net_lif_check = \
|
||||
golang.org/x/net/lif/check
|
||||
|
||||
endif
|
||||
|
||||
TPACKAGES = $(shell cat $(srcdir)/check-packages.txt)
|
||||
TEST_PACKAGES = $(addsuffix /check,$(TPACKAGES)) \
|
||||
$(golangorg_x_net_lif_check) \
|
||||
$(golangorg_x_net_route_check)
|
||||
TEST_PACKAGES = $(addsuffix /check,$(shell cat $(srcdir)/check-packages.txt))
|
||||
|
||||
check: check-tail
|
||||
check-recursive: check-head
|
||||
|
|
|
@ -973,7 +973,7 @@ GOLINK = $(LIBTOOL) --tag GO --mode-link $(GOC) \
|
|||
BUILDDEPS = \
|
||||
$(MKDIR_P) $(@D); \
|
||||
dir=`echo $@ | sed -e 's/.lo.dep$$//'`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$$dir --extrafiles="$(extra_go_files_$(subst /,_,$(subst .lo.dep,,$@)))" $(matchargs_$(subst /,_,$(subst .lo.dep,,$@)))`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$$dir --extrafiles="$(extra_go_files_$(subst .,_,$(subst /,_,$(subst .lo.dep,,$@))))" $(matchargs_$(subst /,_,$(subst .lo.dep,,$@)))`; \
|
||||
$(SHELL) $(srcdir)/godeps.sh `echo $@ | sed -e 's/.dep$$//'` $$files > $@.tmp; \
|
||||
if ! cmp $@.tmp $@ >/dev/null 2>/dev/null; then \
|
||||
rm -f `echo $@ | sed -e 's/\.dep$$//'`; \
|
||||
|
@ -1006,7 +1006,7 @@ GOBENCH =
|
|||
CHECK = \
|
||||
GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \
|
||||
export GC; \
|
||||
GOLIBS="$(extra_check_libs_$(subst /,_,$(@D))) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
|
||||
GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \
|
||||
export GOLIBS; \
|
||||
RUNTESTFLAGS="$(RUNTESTFLAGS)"; \
|
||||
export RUNTESTFLAGS; \
|
||||
|
@ -1020,7 +1020,7 @@ CHECK = \
|
|||
export LD_LIBRARY_PATH; \
|
||||
$(MKDIR_P) $(@D); \
|
||||
rm -f $@-testsum $@-testlog; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$(@D) --extrafiles="$(extra_go_files_$(subst /,_,$(@D)))" $(matchargs_$(subst /,_,$(@D)))`; \
|
||||
files=`$(SHELL) $(srcdir)/match.sh --goarch=$(GOARCH) --goos=$(GOOS) --srcdir=$(srcdir)/go/$(@D) --extrafiles="$(extra_go_files_$(subst .,_,$(subst /,_,$(@D))))" $(matchargs_$(subst /,_,$(@D)))`; \
|
||||
if test "$(USE_DEJAGNU)" = "yes"; then \
|
||||
$(SHELL) $(srcdir)/testsuite/gotest --goarch=$(GOARCH) --goos=$(GOOS) --dejagnu=yes --basedir=$(srcdir) --srcdir=$(srcdir)/go/$(@D) --pkgpath="$(@D)" --pkgfiles="$$files" --testname="$(@D)" $(GOTESTFLAGS); \
|
||||
elif test "$(GOBENCH)" != ""; then \
|
||||
|
@ -1091,6 +1091,7 @@ runtime_internal_sys_lo_check_GOCFLAGS = -fgo-compiling-runtime
|
|||
runtime_pprof_check_GOCFLAGS = -static-libgo -fno-inline
|
||||
extra_go_files_runtime_internal_sys = version.go
|
||||
extra_go_files_internal_cpu = cpugen.go
|
||||
extra_go_files_golang_org_x_sys_cpu = gcpugen.go
|
||||
extra_go_files_internal_goroot = zstdpkglist.go
|
||||
extra_go_files_go_types = gccgosizes.go
|
||||
extra_go_files_cmd_internal_objabi = objabi.go
|
||||
|
@ -1121,20 +1122,10 @@ extra_check_libs_cmd_vet_internal_cfg = $(abs_builddir)/libgotool.a
|
|||
@LIBGO_IS_BSD_TRUE@golangorg_x_net_route_lo = \
|
||||
@LIBGO_IS_BSD_TRUE@ golang.org/net/route.lo
|
||||
|
||||
@LIBGO_IS_BSD_TRUE@golangorg_x_net_route_check = \
|
||||
@LIBGO_IS_BSD_TRUE@ golang.org/x/net/route/check
|
||||
|
||||
@LIBGO_IS_SOLARIS_TRUE@golangorg_x_net_lif_lo = \
|
||||
@LIBGO_IS_SOLARIS_TRUE@ golang.org/x/net/lif.lo
|
||||
|
||||
@LIBGO_IS_SOLARIS_TRUE@golangorg_x_net_lif_check = \
|
||||
@LIBGO_IS_SOLARIS_TRUE@ golang.org/x/net/lif/check
|
||||
|
||||
TPACKAGES = $(shell cat $(srcdir)/check-packages.txt)
|
||||
TEST_PACKAGES = $(addsuffix /check,$(TPACKAGES)) \
|
||||
$(golangorg_x_net_lif_check) \
|
||||
$(golangorg_x_net_route_check)
|
||||
|
||||
TEST_PACKAGES = $(addsuffix /check,$(shell cat $(srcdir)/check-packages.txt))
|
||||
MOSTLYCLEANFILES = \
|
||||
s-runtime_sysinfo s-sigtab s-runtime-inc s-zstdpkglist \
|
||||
s-libcalls s-libcalls-list s-syscall_arch s-gen-sysinfo s-sysinfo \
|
||||
|
@ -2629,6 +2620,14 @@ s-cpu: Makefile
|
|||
$(SHELL) $(srcdir)/mvifdiff.sh cpugen.go.tmp cpugen.go
|
||||
$(STAMP) $@
|
||||
|
||||
gcpugen.go: s-gcpu; @true
|
||||
s-gcpu: Makefile
|
||||
rm -f gcpugen.go.tmp
|
||||
echo "package cpu" > gcpugen.go.tmp
|
||||
echo "const cacheLineSize = `$(SHELL) $(srcdir)/goarch.sh $(GOARCH) cachelinesize`" >> gcpugen.go.tmp
|
||||
$(SHELL) $(srcdir)/mvifdiff.sh gcpugen.go.tmp gcpugen.go
|
||||
$(STAMP) $@
|
||||
|
||||
objabi.go: s-objabi; @true
|
||||
s-objabi: Makefile
|
||||
rm -f objabi.go.tmp
|
||||
|
@ -2830,6 +2829,7 @@ runtime.lo.dep: $(extra_go_files_runtime)
|
|||
syscall.lo.dep: $(extra_go_files_syscall)
|
||||
runtime/internal/sys.lo.dep: $(extra_go_files_runtime_internal_sys)
|
||||
internal/cpu.lo.dep: $(extra_go_files_internal_cpu)
|
||||
golang.org/x/sys/cpu.lo.dep: $(extra_go_files_golang_org_x_sys_cpu)
|
||||
internal/goroot.lo.dep: $(extra_go_files_internal_goroot)
|
||||
go/types.lo.dep: $(extra_go_files_go_types)
|
||||
cmd/internal/objabi.lo.dep: $(extra_go_files_cmd_internal_objabi)
|
||||
|
@ -2886,13 +2886,13 @@ golang.org/x/sys/cpu_gccgo.lo: go/golang.org/x/sys/cpu/cpu_gccgo.c runtime.inc
|
|||
@$(MKDIR_P) golang.org/x/sys
|
||||
$(LTCOMPILE) -c -o $@ $(srcdir)/go/golang.org/x/sys/cpu/cpu_gccgo.c
|
||||
|
||||
# Build internal/x/net/route only on BSD systems.
|
||||
# Build golang.org/x/net/route only on BSD systems.
|
||||
|
||||
@LIBGO_IS_BSD_TRUE@$(eval $(call PACKAGE_template,internal/x/net/route))
|
||||
@LIBGO_IS_BSD_TRUE@$(eval $(call PACKAGE_template,golang.org/x/net/route))
|
||||
|
||||
# Build internal/x/net/lif only on Solaris systems.
|
||||
# Build golang.org/x/net/lif only on Solaris systems.
|
||||
|
||||
@LIBGO_IS_SOLARIS_TRUE@$(eval $(call PACKAGE_template,internal/x/net/lif))
|
||||
@LIBGO_IS_SOLARIS_TRUE@$(eval $(call PACKAGE_template,golang.org/x/net/lif))
|
||||
|
||||
check: check-tail
|
||||
check-recursive: check-head
|
||||
|
|
|
@ -11,18 +11,12 @@ import (
|
|||
"unsafe"
|
||||
)
|
||||
|
||||
//go:cgo_import_dynamic libc_ioctl ioctl "libc.so"
|
||||
|
||||
//go:linkname procIoctl libc_ioctl
|
||||
|
||||
var procIoctl uintptr
|
||||
|
||||
func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno)
|
||||
//extern __go_ioctl_ptr
|
||||
func libc_ioctl(int32, int32, unsafe.Pointer) int32
|
||||
|
||||
func ioctl(s, ioc uintptr, arg unsafe.Pointer) error {
|
||||
_, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0)
|
||||
if errno != 0 {
|
||||
return error(errno)
|
||||
if libc_ioctl(int32(s), int32(ioc), arg) < 0 {
|
||||
return syscall.GetErrno()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
package lif
|
||||
|
||||
import "unsafe"
|
||||
|
||||
const (
|
||||
sysAF_UNSPEC = 0x0
|
||||
sysAF_INET = 0x2
|
||||
|
@ -67,7 +69,6 @@ const (
|
|||
|
||||
type lifnum struct {
|
||||
Family uint16
|
||||
Pad_cgo_0 [2]byte
|
||||
Flags int32
|
||||
Count int32
|
||||
}
|
||||
|
@ -81,16 +82,13 @@ type lifreq struct {
|
|||
|
||||
type lifconf struct {
|
||||
Family uint16
|
||||
Pad_cgo_0 [2]byte
|
||||
Flags int32
|
||||
Len int32
|
||||
Pad_cgo_1 [4]byte
|
||||
Lifcu [8]byte
|
||||
Lifcu [unsafe.Sizeof(unsafe.Pointer(nil))]byte
|
||||
}
|
||||
|
||||
type lifIfinfoReq struct {
|
||||
Maxhops uint8
|
||||
Pad_cgo_0 [3]byte
|
||||
Reachtime uint32
|
||||
Reachretrans uint32
|
||||
Maxmtu uint32
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 128
|
||||
|
||||
const (
|
||||
// getsystemcfg constants
|
||||
_SC_IMPL = 2
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 32
|
||||
|
||||
func doinit() {}
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 64
|
||||
|
||||
// HWCAP/HWCAP2 bits. These are exposed by Linux.
|
||||
const (
|
||||
hwcap_FP = 1 << 0
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 128
|
||||
|
||||
// HWCAP/HWCAP2 bits. These are exposed by the kernel.
|
||||
const (
|
||||
// ISA Level
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 256
|
||||
|
||||
const (
|
||||
// bit mask values from /usr/include/bits/hwcap.h
|
||||
hwcap_ZARCH = 2
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build mips64 mips64le
|
||||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 32
|
||||
|
||||
func doinit() {}
|
|
@ -1,11 +0,0 @@
|
|||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build mips mipsle
|
||||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 32
|
||||
|
||||
func doinit() {}
|
|
@ -1,11 +0,0 @@
|
|||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build !linux,arm64
|
||||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 64
|
||||
|
||||
func doinit() {}
|
|
@ -1,15 +0,0 @@
|
|||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// +build wasm
|
||||
|
||||
package cpu
|
||||
|
||||
// We're compiling the cpu package for an unknown (software-abstracted) CPU.
|
||||
// Make CacheLinePad an empty struct and hope that the usual struct alignment
|
||||
// rules are good enough.
|
||||
|
||||
const cacheLineSize = 0
|
||||
|
||||
func doinit() {}
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
package cpu
|
||||
|
||||
const cacheLineSize = 64
|
||||
|
||||
func init() {
|
||||
Initialized = true
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ func sem_reltimedwait_np(sem *semt, timeout *timespec) int32
|
|||
|
||||
//go:nosplit
|
||||
func semacreate(mp *m) {
|
||||
if mp.mos.waitsema != 0 {
|
||||
if mp.waitsema != 0 {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,7 @@ func semacreate(mp *m) {
|
|||
if sem_init(sem, 0, 0) != 0 {
|
||||
throw("sem_init")
|
||||
}
|
||||
mp.mos.waitsema = uintptr(unsafe.Pointer(sem))
|
||||
mp.waitsema = uintptr(unsafe.Pointer(sem))
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
|
@ -54,7 +54,7 @@ func semasleep(ns int64) int32 {
|
|||
var ts timespec
|
||||
ts.setNsec(ns)
|
||||
|
||||
if sem_reltimedwait_np((*semt)(unsafe.Pointer(_m_.mos.waitsema)), &ts) != 0 {
|
||||
if sem_reltimedwait_np((*semt)(unsafe.Pointer(_m_.waitsema)), &ts) != 0 {
|
||||
err := errno()
|
||||
if err == _ETIMEDOUT || err == _EAGAIN || err == _EINTR {
|
||||
return -1
|
||||
|
@ -64,7 +64,7 @@ func semasleep(ns int64) int32 {
|
|||
return 0
|
||||
}
|
||||
for {
|
||||
r1 := sem_wait((*semt)(unsafe.Pointer(_m_.mos.waitsema)))
|
||||
r1 := sem_wait((*semt)(unsafe.Pointer(_m_.waitsema)))
|
||||
if r1 == 0 {
|
||||
break
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ func semasleep(ns int64) int32 {
|
|||
|
||||
//go:nosplit
|
||||
func semawakeup(mp *m) {
|
||||
if sem_post((*semt)(unsafe.Pointer(mp.mos.waitsema))) != 0 {
|
||||
if sem_post((*semt)(unsafe.Pointer(mp.waitsema))) != 0 {
|
||||
throw("sem_post")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue