mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-02 07:57:29 +00:00
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:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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