forked from joejulian/gio
ui/app: (android) block until DataDir is ready
The app data dir is not set until after Go's init functions have run, which means that DataDir is inherently racy. Avoid that race by blocking in DataDir until it is set from Java. In other words, trade a race condition with a deadlock. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -5,13 +5,23 @@
|
||||
package app
|
||||
|
||||
import "C"
|
||||
import "sync"
|
||||
|
||||
var dataDir func() (string, error)
|
||||
var (
|
||||
dataDirOnce sync.Once
|
||||
dataDirChan = make(chan string, 1)
|
||||
dataPath string
|
||||
)
|
||||
|
||||
func dataDir() (string, error) {
|
||||
dataDirOnce.Do(func() {
|
||||
dataPath = <-dataDirChan
|
||||
})
|
||||
return dataPath, nil
|
||||
}
|
||||
|
||||
//export setDataDir
|
||||
func setDataDir(cdir *C.char, len C.int) {
|
||||
dir := C.GoStringN(cdir, len)
|
||||
dataDir = func() (string, error) {
|
||||
return dir, nil
|
||||
}
|
||||
dataDirChan <- dir
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user