all: use a custom sync package

The sync package is strongly tied to the runtime, so it's easier to
implement a new one. Besides, it's pretty big so it's better to replace
it.
Этот коммит содержится в:
Ayke van Laethem 2018-09-15 18:51:51 +02:00
родитель 94b18e2d79
коммит c237633d34
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED
3 изменённых файлов: 68 добавлений и 12 удалений

Просмотреть файл

@ -1,13 +1 @@
package runtime
// This file contains support code for the sync package.
//go:linkname registerPoolCleanup sync.runtime_registerPoolCleanup
func registerPoolCleanup(cleanup func()) {
// Ignore.
}
//go:linkname notifyListCheck sync.runtime_notifyListCheck
func notifyListCheck(size uintptr) {
// Ignore.
}

52
src/sync/mutex.go Обычный файл
Просмотреть файл

@ -0,0 +1,52 @@
package sync
// These mutexes assume there is only one thread of operation: no goroutines,
// interrupts or anything else.
type Mutex struct {
locked bool
}
func (m *Mutex) Lock() {
if m.locked {
panic("todo: block on locked mutex")
}
m.locked = true
}
func (m *Mutex) Unlock() {
if !m.locked {
panic("sync: unlock of unlocked Mutex")
}
m.locked = false
}
type RWMutex struct {
m Mutex
readers uint32
}
func (rw *RWMutex) Lock() {
rw.m.Lock()
}
func (rw *RWMutex) Unlock() {
rw.m.Unlock()
}
func (rw *RWMutex) RLock() {
if rw.readers == 0 {
rw.m.Lock()
}
rw.readers++
}
func (rw *RWMutex) RUnlock() {
if rw.readers == 0 {
panic("sync: unlock of unlocked RWMutex")
}
rw.readers--
if rw.readers == 0 {
rw.m.Unlock()
}
}

16
src/sync/once.go Обычный файл
Просмотреть файл

@ -0,0 +1,16 @@
package sync
type Once struct {
done bool
m Mutex
}
func (o *Once) Do(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done {
return
}
o.done = true
f()
}