diff options
| author | Rob Pike <r@golang.org> | 2009-06-09 09:53:44 -0700 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2009-06-09 09:53:44 -0700 |
| commit | d90e7cbac65c5792ce312ee82fbe03a5dfc98c6f (patch) | |
| tree | 7032a11d0cac2ae4d3e90f7a189b575b5a50f848 /src/lib/sync | |
| parent | bf5c0c957c3c3ea9add6cfd51b90c463cb4814b5 (diff) | |
| download | go-d90e7cbac65c5792ce312ee82fbe03a5dfc98c6f.tar.xz | |
mv src/lib to src/pkg
tests: all.bash passes, gobuild still works, godoc still works.
R=rsc
OCL=30096
CL=30102
Diffstat (limited to 'src/lib/sync')
| -rw-r--r-- | src/lib/sync/Makefile | 61 | ||||
| -rw-r--r-- | src/lib/sync/asm_386.s | 23 | ||||
| -rw-r--r-- | src/lib/sync/asm_amd64.s | 23 | ||||
| -rw-r--r-- | src/lib/sync/mutex.go | 114 | ||||
| -rw-r--r-- | src/lib/sync/mutex_test.go | 53 |
5 files changed, 0 insertions, 274 deletions
diff --git a/src/lib/sync/Makefile b/src/lib/sync/Makefile deleted file mode 100644 index 566853d576..0000000000 --- a/src/lib/sync/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2009 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. - -# DO NOT EDIT. Automatically generated by gobuild. -# gobuild -m asm_${GOARCH}.s mutex.go >Makefile - -D= - -include $(GOROOT)/src/Make.$(GOARCH) -AR=gopack - -default: packages - -clean: - rm -rf *.[$(OS)] *.a [$(OS)].out _obj - -test: packages - gotest - -coverage: packages - gotest - 6cov -g `pwd` | grep -v '_test\.go:' - -%.$O: %.go - $(GC) -I_obj $*.go - -%.$O: %.c - $(CC) $*.c - -%.$O: %.s - $(AS) $*.s - -O1=\ - asm_$(GOARCH).$O\ - mutex.$O\ - - -phases: a1 -_obj$D/sync.a: phases - -a1: $(O1) - $(AR) grc _obj$D/sync.a asm_$(GOARCH).$O mutex.$O - rm -f $(O1) - - -newpkg: clean - mkdir -p _obj$D - $(AR) grc _obj$D/sync.a - -$(O1): newpkg -$(O2): a1 - -nuke: clean - rm -f $(GOROOT)/pkg/$(GOOS)_$(GOARCH)$D/sync.a - -packages: _obj$D/sync.a - -install: packages - test -d $(GOROOT)/pkg && mkdir -p $(GOROOT)/pkg/$(GOOS)_$(GOARCH)$D - cp _obj$D/sync.a $(GOROOT)/pkg/$(GOOS)_$(GOARCH)$D/sync.a diff --git a/src/lib/sync/asm_386.s b/src/lib/sync/asm_386.s deleted file mode 100644 index f71182b753..0000000000 --- a/src/lib/sync/asm_386.s +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2009 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. - -// func cas(val *int32, old, new int32) bool -// Atomically: -// if *val == old { -// *val = new; -// return true; -// }else -// return false; -TEXT sync·cas(SB), 7, $0 - MOVL 4(SP), BX - MOVL 8(SP), AX - MOVL 12(SP), CX - LOCK - CMPXCHGL CX, 0(BX) - JZ ok - MOVL $0, 16(SP) - RET -ok: - MOVL $1, 16(SP) - RET diff --git a/src/lib/sync/asm_amd64.s b/src/lib/sync/asm_amd64.s deleted file mode 100644 index 07389dd3b5..0000000000 --- a/src/lib/sync/asm_amd64.s +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2009 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. - -// func cas(val *int32, old, new int32) bool -// Atomically: -// if *val == old { -// *val = new; -// return true; -// }else -// return false; -TEXT sync·cas(SB), 7, $0 - MOVQ 8(SP), BX - MOVL 16(SP), AX - MOVL 20(SP), CX - LOCK - CMPXCHGL CX, 0(BX) - JZ ok - MOVL $0, 24(SP) - RET -ok: - MOVL $1, 24(SP) - RET diff --git a/src/lib/sync/mutex.go b/src/lib/sync/mutex.go deleted file mode 100644 index 5a6311a837..0000000000 --- a/src/lib/sync/mutex.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2009 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. - -// The sync package provides basic synchronization primitives -// such as mutual exclusion locks. These are intended for use -// by low-level library routines. Higher-level synchronization -// is better done via channels and communication. -package sync - -func cas(val *int32, old, new int32) bool -func semacquire(*int32) -func semrelease(*int32) - -// A Mutex is a mutual exclusion lock. -// Mutexes can be created as part of other structures; -// the zero value for a Mutex is an unlocked mutex. -type Mutex struct { - key int32; - sema int32; -} - -func xadd(val *int32, delta int32) (new int32) { - for { - v := *val; - if cas(val, v, v+delta) { - return v+delta; - } - } - panic("unreached") -} - -// Lock locks m. -// If the lock is already in use, the calling goroutine -// blocks until the mutex is available. -func (m *Mutex) Lock() { - if xadd(&m.key, 1) == 1 { - // changed from 0 to 1; we hold lock - return; - } - semacquire(&m.sema); -} - -// Unlock unlocks m. -// It is a run-time error if m is not locked on entry to Unlock. -// -// A locked Mutex is not associated with a particular goroutine. -// It is allowed for one goroutine to lock a Mutex and then -// arrange for another goroutine to unlock it. -func (m *Mutex) Unlock() { - if xadd(&m.key, -1) == 0 { - // changed from 1 to 0; no contention - return; - } - semrelease(&m.sema); -} - -// Stub implementation of r/w locks. -// This satisfies the semantics but -// is not terribly efficient. - -// The next comment goes in the BUGS section of the document, -// in its own paragraph, without the (rsc) tag. - -// BUG(rsc): RWMutex does not (yet) allow multiple readers; -// instead it behaves as if RLock and RUnlock were Lock and Unlock. - -// An RWMutex is a reader/writer mutual exclusion lock. -// The lock can be held by an arbitrary number of readers -// or a single writer. -// RWMutexes can be created as part of other -// structures; the zero value for a RWMutex is -// an unlocked mutex. -type RWMutex struct { - m Mutex; -} - -// RLock locks rw for reading. -// If the lock is already locked for writing or there is a writer already waiting -// to acquire the lock, RLock blocks until the writer has released the lock. -func (rw *RWMutex) RLock() { - rw.m.Lock(); -} - -// RUnlock undoes a single RLock call; -// it does not affect other simultaneous readers. -// It is a run-time error if rw is not locked for reading -// on entry to RUnlock. -func (rw *RWMutex) RUnlock() { - rw.m.Unlock(); -} - -// Lock locks rw for writing. -// If the lock is already locked for reading or writing, -// Lock blocks until the lock is available. -// To ensure that the lock eventually becomes available, -// a blocked Lock call excludes new readers from acquiring -// the lock. -func (rw *RWMutex) Lock() { - rw.m.Lock(); -} - -// Unlock unlocks rw for writing. -// It is a run-time error if rw is not locked for writing -// on entry to Unlock. -// -// Like for Mutexes, -// a locked RWMutex is not associated with a particular goroutine. -// It is allowed for one goroutine to RLock (Lock) an RWMutex and then -// arrange for another goroutine to RUnlock (Unlock) it. -func (rw *RWMutex) Unlock() { - rw.m.Unlock(); -} - diff --git a/src/lib/sync/mutex_test.go b/src/lib/sync/mutex_test.go deleted file mode 100644 index 819dbb9de5..0000000000 --- a/src/lib/sync/mutex_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2009 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. - -// GOMAXPROCS=10 gotest - -package sync - -import ( - "sync"; - "testing" -) - -func HammerSemaphore(s *int32, cdone chan bool) { - for i := 0; i < 1000; i++ { - semacquire(s); - semrelease(s); - } - cdone <- true; -} - -func TestSemaphore(t *testing.T) { - s := new(int32); - *s = 1; - c := make(chan bool); - for i := 0; i < 10; i++ { - go HammerSemaphore(s, c); - } - for i := 0; i < 10; i++ { - <-c; - } -} - - -func HammerMutex(m *Mutex, cdone chan bool) { - for i := 0; i < 1000; i++ { - m.Lock(); - m.Unlock(); - } - cdone <- true; -} - -func TestMutex(t *testing.T) { - m := new(Mutex); - c := make(chan bool); - for i := 0; i < 10; i++ { - go HammerMutex(m, c); - } - for i := 0; i < 10; i++ { - <-c; - } -} - |
