Skip to content

Commit 7673924

Browse files
xaionaro@dx.centerxaionaro@dx.center
authored andcommitted
fix: eliminate race in GetParcelableExtra, simplify HandlerThread.Close
- GetParcelableExtra: use sync.Once for thread-safe lazy method ID init instead of bare nil check (concurrent vm.Do calls could race) - HandlerThread.Close: remove redundant ensureInit (QuitSafely already calls it), avoid nested vm.Do by calling QuitSafely before DeleteGlobalRef
1 parent a5463b2 commit 7673924

2 files changed

Lines changed: 22 additions & 22 deletions

File tree

app/intent_parcelable_extra.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ package app
22

33
import (
44
"fmt"
5+
"sync"
56
"unsafe"
67

78
"github.com/AndroidGoLab/jni"
89
)
910

10-
// midIntentGetParcelableExtra is lazily initialized on first call.
11-
var midIntentGetParcelableExtra jni.MethodID
11+
var (
12+
parcelableExtraOnce sync.Once
13+
parcelableExtraMid jni.MethodID
14+
parcelableExtraErr error
15+
)
1216

1317
// GetParcelableExtra calls android.content.Intent.getParcelableExtra(String).
1418
// This method is deprecated in API 33 but remains the standard way to extract
@@ -23,17 +27,16 @@ func (m *Intent) GetParcelableExtra(
2327
return err
2428
}
2529

26-
if midIntentGetParcelableExtra == nil {
27-
mid, err := env.GetMethodID(
30+
parcelableExtraOnce.Do(func() {
31+
parcelableExtraMid, parcelableExtraErr = env.GetMethodID(
2832
(*jni.Class)(unsafe.Pointer(clsIntent)),
2933
"getParcelableExtra",
3034
"(Ljava/lang/String;)Landroid/os/Parcelable;",
3135
)
32-
if err != nil {
33-
callErr = fmt.Errorf("android.content.Intent.getParcelableExtra is not available on this device")
34-
return callErr
35-
}
36-
midIntentGetParcelableExtra = mid
36+
})
37+
if parcelableExtraErr != nil {
38+
callErr = fmt.Errorf("android.content.Intent.getParcelableExtra is not available on this device")
39+
return callErr
3740
}
3841

3942
jKey, err := env.NewStringUTF(key)
@@ -44,7 +47,7 @@ func (m *Intent) GetParcelableExtra(
4447

4548
result, callErr = env.CallObjectMethod(
4649
m.Obj,
47-
midIntentGetParcelableExtra, jni.ObjectValue(&jKey.Object),
50+
parcelableExtraMid, jni.ObjectValue(&jKey.Object),
4851
)
4952
if callErr != nil {
5053
return callErr

os/new_handler_thread.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,14 @@ func NewHandlerThread(
6161

6262
// Close quits the thread safely and releases the global reference.
6363
func (m *HandlerThread) Close() {
64-
if m.Obj != nil {
65-
_ = m.VM.Do(func(env *jni.Env) error {
66-
if err := ensureInit(env); err != nil {
67-
return err
68-
}
69-
if midHandlerThreadQuitSafely != nil {
70-
_, _ = m.QuitSafely()
71-
}
72-
env.DeleteGlobalRef(m.Obj)
73-
m.Obj = nil
74-
return nil
75-
})
64+
if m.Obj == nil {
65+
return
7666
}
67+
// QuitSafely calls ensureInit and vm.Do internally.
68+
_, _ = m.QuitSafely()
69+
_ = m.VM.Do(func(env *jni.Env) error {
70+
env.DeleteGlobalRef(m.Obj)
71+
m.Obj = nil
72+
return nil
73+
})
7774
}

0 commit comments

Comments
 (0)