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:
Elias Naur
2019-07-22 09:33:53 +02:00
parent 1ee8c08f3b
commit 4e0d820a5b
2 changed files with 17 additions and 4 deletions
+3
View File
@@ -121,6 +121,9 @@ func init() {
// On desktop systems, DataDir use os.UserConfigDir.
// On iOS NSDocumentDirectory is queried.
// For Android Context.getFilesDir is used.
//
// BUG: DataDir blocks on Android until init functions
// have completed.
func DataDir() (string, error) {
return dataDir()
}
+14 -4
View File
@@ -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
}