mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
thread: Bug fix: Queue funcs instead of panic
Now the thread object is created at (*UserInterface).Run, we don't have to care whether the (main) thread is started or not when Call is called. Admit queueing the functions. Fixes #884
This commit is contained in:
parent
3eee4754c5
commit
8dc2301e54
@ -16,13 +16,11 @@ package thread
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"sync/atomic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Thread represents an OS thread.
|
// Thread represents an OS thread.
|
||||||
type Thread struct {
|
type Thread struct {
|
||||||
started int32
|
funcs chan func()
|
||||||
funcs chan func()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new thread.
|
// New creates a new thread.
|
||||||
@ -38,9 +36,6 @@ func New() *Thread {
|
|||||||
//
|
//
|
||||||
// Loop must be called on the thread.
|
// Loop must be called on the thread.
|
||||||
func (t *Thread) Loop(context context.Context) {
|
func (t *Thread) Loop(context context.Context) {
|
||||||
atomic.StoreInt32(&t.started, 1)
|
|
||||||
defer atomic.StoreInt32(&t.started, 0)
|
|
||||||
|
|
||||||
loop:
|
loop:
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@ -56,10 +51,6 @@ loop:
|
|||||||
//
|
//
|
||||||
// Do not call this from the same thread. This would block forever.
|
// Do not call this from the same thread. This would block forever.
|
||||||
func (t *Thread) Call(f func() error) error {
|
func (t *Thread) Call(f func() error) error {
|
||||||
if atomic.LoadInt32(&t.started) == 0 {
|
|
||||||
panic("thread: the thread loop is not started yet")
|
|
||||||
}
|
|
||||||
|
|
||||||
ch := make(chan struct{})
|
ch := make(chan struct{})
|
||||||
var err error
|
var err error
|
||||||
t.funcs <- func() {
|
t.funcs <- func() {
|
||||||
|
@ -172,13 +172,6 @@ func getCachedMonitor(wx, wy int) (*cachedMonitor, bool) {
|
|||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UserInterface) mainThreadLoop(context context.Context) error {
|
|
||||||
u.setRunning(true)
|
|
||||||
u.t.Loop(context)
|
|
||||||
u.setRunning(false)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *UserInterface) isRunning() bool {
|
func (u *UserInterface) isRunning() bool {
|
||||||
u.m.Lock()
|
u.m.Lock()
|
||||||
v := u.running
|
v := u.running
|
||||||
@ -575,7 +568,9 @@ func (u *UserInterface) Run(width, height int, scale float64, title string, uico
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
u.mainThreadLoop(ctx)
|
u.setRunning(true)
|
||||||
|
u.t.Loop(ctx)
|
||||||
|
u.setRunning(false)
|
||||||
return <-ch
|
return <-ch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user