Skip to content

Commit 686b0b7

Browse files
GeertJohanPierre Champion
authored and
Pierre Champion
committed
Fix two race conditions and a type conversion mistake (#70)
1 parent 65060fb commit 686b0b7

File tree

3 files changed

+73
-47
lines changed

3 files changed

+73
-47
lines changed

flutter/flutter.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ package flutter
88
import "C"
99
import (
1010
"encoding/json"
11+
"sync"
1112
"unsafe"
1213
)
1314

1415
// the current FlutterEngine running (associated with his callback)
1516
var flutterEngines []*EngineOpenGL
17+
var flutterEnginesLock sync.RWMutex
1618

1719
// SelectEngine return a EngineOpenGL from an index
1820
func SelectEngine(index int) *EngineOpenGL {
19-
return flutterEngines[index]
21+
flutterEnginesLock.RLock()
22+
engine := flutterEngines[index]
23+
flutterEnginesLock.RUnlock()
24+
return engine
2025
}
2126

2227
// NumberOfEngines return the number of engine registered into this embedder
@@ -40,6 +45,9 @@ type EngineOpenGL struct {
4045
// Flutter Engine.
4146
Engine C.FlutterEngine
4247

48+
// index of the engine in the global flutterEngines slice
49+
index int
50+
4351
// Necessary callbacks for rendering.
4452
FMakeCurrent func(v unsafe.Pointer) bool
4553
FClearCurrent func(v unsafe.Pointer) bool
@@ -56,11 +64,24 @@ type EngineOpenGL struct {
5664
IcuDataPath string
5765
}
5866

59-
// Run launches the Flutter Engine in a background thread.
60-
func (flu *EngineOpenGL) Run(window uintptr, vmArgs []string) Result {
61-
67+
// NewEngineOpenGL creates an empty EngineOpenGL
68+
// and assigns it an index for global lookup.
69+
func NewEngineOpenGL() *EngineOpenGL {
70+
flu := &EngineOpenGL{}
71+
flutterEnginesLock.Lock()
6272
flutterEngines = append(flutterEngines, flu)
73+
flu.index = len(flutterEngines) - 1
74+
flutterEnginesLock.Unlock()
75+
return flu
76+
}
6377

78+
// Index returns the index of the engine in the global flutterEngines slice
79+
func (flu *EngineOpenGL) Index() int {
80+
return flu.index
81+
}
82+
83+
// Run launches the Flutter Engine in a background thread.
84+
func (flu *EngineOpenGL) Run(window uintptr, vmArgs []string) Result {
6485
args := C.FlutterProjectArgs{
6586
assets_path: C.CString(flu.AssetsPath),
6687
main_path: C.CString(""),

flutter/flutter_proxy_glfw.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
// C proxies
1919

2020
//export proxy_on_platform_message
21-
func proxy_on_platform_message(message *C.FlutterPlatformMessage, userPointer unsafe.Pointer) C.bool {
21+
func proxy_on_platform_message(message *C.FlutterPlatformMessage, window unsafe.Pointer) C.bool {
2222
if message.message != nil {
2323
str := C.GoStringN(C.c_str(message.message), C.int(message.message_size))
2424

@@ -30,45 +30,51 @@ func proxy_on_platform_message(message *C.FlutterPlatformMessage, userPointer un
3030
Channel: C.GoString(message.channel),
3131
ResponseHandle: message.response_handle,
3232
}
33-
return C.bool(flutterEngines[0].FPlatfromMessage(FlutterPlatformMessage, userPointer))
33+
index := *(*int)(glfw.GoWindow(window).GetUserPointer())
34+
engine := SelectEngine(index)
35+
return C.bool(engine.FPlatfromMessage(FlutterPlatformMessage, window))
3436
}
3537
return C.bool(false)
36-
3738
}
3839

3940
//export proxy_make_current
4041
func proxy_make_current(v unsafe.Pointer) C.bool {
4142
w := glfw.GoWindow(v)
42-
index := *(*C.int)(w.GetUserPointer())
43-
return C.bool(flutterEngines[index].FMakeCurrent(v))
43+
index := *(*int)(w.GetUserPointer())
44+
engine := SelectEngine(index)
45+
return C.bool(engine.FMakeCurrent(v))
4446
}
4547

4648
//export proxy_clear_current
4749
func proxy_clear_current(v unsafe.Pointer) C.bool {
4850
w := glfw.GoWindow(v)
49-
index := *(*C.int)(w.GetUserPointer())
50-
return C.bool(flutterEngines[index].FClearCurrent(v))
51+
index := *(*int)(w.GetUserPointer())
52+
engine := SelectEngine(index)
53+
return C.bool(engine.FClearCurrent(v))
5154
}
5255

5356
//export proxy_present
5457
func proxy_present(v unsafe.Pointer) C.bool {
5558
w := glfw.GoWindow(v)
56-
index := *(*C.int)(w.GetUserPointer())
57-
return C.bool(flutterEngines[index].FPresent(v))
59+
index := *(*int)(w.GetUserPointer())
60+
engine := SelectEngine(index)
61+
return C.bool(engine.FPresent(v))
5862
}
5963

6064
//export proxy_fbo_callback
6165
func proxy_fbo_callback(v unsafe.Pointer) C.uint32_t {
6266
w := glfw.GoWindow(v)
63-
index := *(*C.int)(w.GetUserPointer())
64-
return C.uint32_t(flutterEngines[index].FFboCallback(v))
67+
index := *(*int)(w.GetUserPointer())
68+
engine := SelectEngine(index)
69+
return C.uint32_t(engine.FFboCallback(v))
6570
}
6671

6772
//export proxy_make_resource_current
6873
func proxy_make_resource_current(v unsafe.Pointer) C.bool {
6974
w := glfw.GoWindow(v)
70-
index := *(*C.int)(w.GetUserPointer())
71-
return C.bool(flutterEngines[index].FMakeResourceCurrent(v))
75+
index := *(*int)(w.GetUserPointer())
76+
engine := SelectEngine(index)
77+
return C.bool(engine.FMakeResourceCurrent(v))
7278
}
7379

7480
//export proxy_gl_proc_resolver

gutter.go

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -184,33 +184,32 @@ func glfwCharCallback(w *glfw.Window, char rune) {
184184
// Flutter Engine
185185
func runFlutter(window *glfw.Window, c config) *flutter.EngineOpenGL {
186186

187-
flutterOGL := flutter.EngineOpenGL{
188-
// Engine arguments
189-
AssetsPath: c.AssetPath,
190-
IcuDataPath: c.ICUDataPath,
191-
// Render callbacks
192-
FMakeCurrent: func(v unsafe.Pointer) bool {
193-
w := glfw.GoWindow(v)
194-
w.MakeContextCurrent()
195-
return true
196-
},
197-
FClearCurrent: func(v unsafe.Pointer) bool {
198-
glfw.DetachCurrentContext()
199-
return true
200-
},
201-
FPresent: func(v unsafe.Pointer) bool {
202-
w := glfw.GoWindow(v)
203-
w.SwapBuffers()
204-
return true
205-
},
206-
FFboCallback: func(v unsafe.Pointer) int32 {
207-
return 0
208-
},
209-
FMakeResourceCurrent: func(v unsafe.Pointer) bool {
210-
return false
211-
},
212-
PixelRatio: c.PixelRatio,
187+
flutterOGL := flutter.NewEngineOpenGL()
188+
// Engine arguments
189+
flutterOGL.AssetsPath = c.AssetPath
190+
flutterOGL.IcuDataPath = c.ICUDataPath
191+
// Render callbacks
192+
flutterOGL.FMakeCurrent = func(v unsafe.Pointer) bool {
193+
w := glfw.GoWindow(v)
194+
w.MakeContextCurrent()
195+
return true
213196
}
197+
flutterOGL.FClearCurrent = func(v unsafe.Pointer) bool {
198+
glfw.DetachCurrentContext()
199+
return true
200+
}
201+
flutterOGL.FPresent = func(v unsafe.Pointer) bool {
202+
w := glfw.GoWindow(v)
203+
w.SwapBuffers()
204+
return true
205+
}
206+
flutterOGL.FFboCallback = func(v unsafe.Pointer) int32 {
207+
return 0
208+
}
209+
flutterOGL.FMakeResourceCurrent = func(v unsafe.Pointer) bool {
210+
return false
211+
}
212+
flutterOGL.PixelRatio = c.PixelRatio
214213

215214
// PlatformMessage
216215
flutterOGL.FPlatfromMessage = func(platMessage *flutter.PlatformMessage, window unsafe.Pointer) bool {
@@ -221,7 +220,7 @@ func runFlutter(window *glfw.Window, c config) *flutter.EngineOpenGL {
221220
// Dispatch the message from the Flutter Engine, to all of the PluginReceivers
222221
// having the same flutter.PlatformMessage.Channel name
223222
for _, receivers := range c.PlatformMessageReceivers[platMessage.Channel] {
224-
hasDispatched = receivers(platMessage, &flutterOGL, windows) || hasDispatched
223+
hasDispatched = receivers(platMessage, flutterOGL, windows) || hasDispatched
225224
}
226225

227226
return hasDispatched
@@ -232,8 +231,8 @@ func runFlutter(window *glfw.Window, c config) *flutter.EngineOpenGL {
232231
updateEditingState(window)
233232
}
234233

235-
NbEngine := flutter.NumberOfEngines()
236-
window.SetUserPointer(unsafe.Pointer(&NbEngine))
234+
flutterOGLIndex := flutterOGL.Index()
235+
window.SetUserPointer(unsafe.Pointer(&flutterOGLIndex))
237236
result := flutterOGL.Run(window.GLFWWindow(), c.VMArguments)
238237

239238
if result != flutter.KSuccess {
@@ -255,7 +254,7 @@ func runFlutter(window *glfw.Window, c config) *flutter.EngineOpenGL {
255254
window.SetFramebufferSizeCallback(glfwWindowSizeCallback)
256255
window.SetMouseButtonCallback(glfwMouseButtonCallback)
257256
window.SetCharCallback(glfwCharCallback)
258-
return &flutterOGL
257+
return flutterOGL
259258
}
260259

261260
// Update the TextInput with the current state

0 commit comments

Comments
 (0)