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.
Этот коммит содержится в:
родитель
94b18e2d79
коммит
c237633d34
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
Обычный файл
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
Обычный файл
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()
|
||||
}
|
Загрузка…
Создание таблицы
Сослаться в новой задаче