Files

88 lines
1.7 KiB
Go
Raw Permalink Normal View History

2023-01-18 21:42:49 +11:00
package application
import (
"sync"
)
var mainThreadFunctionStore = make(map[uint]func())
var mainThreadFunctionStoreLock sync.RWMutex
func generateFunctionStoreID() uint {
startID := 0
for {
if _, ok := mainThreadFunctionStore[uint(startID)]; !ok {
return uint(startID)
}
startID++
if startID == 0 {
Fatal("Too many functions have been dispatched to the main thread")
}
}
}
2023-09-24 08:57:22 +10:00
func InvokeSync(fn func()) {
var wg sync.WaitGroup
wg.Add(1)
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
fn()
wg.Done()
})
wg.Wait()
}
func InvokeSyncWithResult[T any](fn func() T) (res T) {
var wg sync.WaitGroup
wg.Add(1)
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
res = fn()
wg.Done()
})
wg.Wait()
return res
}
func InvokeSyncWithError(fn func() error) (err error) {
var wg sync.WaitGroup
wg.Add(1)
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
err = fn()
wg.Done()
})
wg.Wait()
return
}
func InvokeSyncWithResultAndError[T any](fn func() (T, error)) (res T, err error) {
var wg sync.WaitGroup
wg.Add(1)
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
res, err = fn()
wg.Done()
})
wg.Wait()
return res, err
}
2023-10-02 20:47:04 +11:00
func InvokeSyncWithResultAndOther[T any, U any](fn func() (T, U)) (res T, other U) {
var wg sync.WaitGroup
wg.Add(1)
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
res, other = fn()
wg.Done()
})
wg.Wait()
return res, other
}
2023-09-24 08:57:22 +10:00
func InvokeAsync(fn func()) {
globalApplication.dispatchOnMainThread(func() {
defer processPanicHandlerRecover()
fn()
})
}