Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 50bccfd

Browse files
committedNov 10, 2019
use the same task runner for platform&render tasks
This fixes the issue where on MacOS the embedder crashes during window resizing. fixes #133 This dosn't fixes the jankyness during resize. Follow flutter/flutter#44136 for more info.
1 parent 62fe831 commit 50bccfd

File tree

5 files changed

+1060
-429
lines changed

5 files changed

+1060
-429
lines changed
 

‎application.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,32 @@ func (a *Application) Run() error {
233233
}()
234234
a.window.SetUserPointer(unsafe.Pointer(&flutterEnginePointer))
235235

236+
// Init the engine
237+
result := a.engine.Init(unsafe.Pointer(&flutterEnginePointer), a.config.vmArguments)
238+
if result != embedder.ResultSuccess {
239+
switch result {
240+
case embedder.ResultInvalidLibraryVersion:
241+
fmt.Printf("go-flutter: engine.Init() returned result code %d (invalid library version)\n", result)
242+
case embedder.ResultInvalidArguments:
243+
fmt.Printf("go-flutter: engine.Init() returned result code %d (invalid arguments)\n", result)
244+
case embedder.ResultInternalInconsistency:
245+
fmt.Printf("go-flutter: engine.Init() returned result code %d (internal inconsistency)\n", result)
246+
default:
247+
fmt.Printf("go-flutter: engine.Init() returned result code %d (unknown result code)\n", result)
248+
}
249+
os.Exit(1)
250+
}
251+
236252
// Start the engine
237-
result := a.engine.Run(unsafe.Pointer(&flutterEnginePointer), a.config.vmArguments)
253+
result = a.engine.Run()
238254
if result != embedder.ResultSuccess {
239255
switch result {
240256
case embedder.ResultInvalidLibraryVersion:
241257
fmt.Printf("go-flutter: engine.Run() returned result code %d (invalid library version)\n", result)
242258
case embedder.ResultInvalidArguments:
243259
fmt.Printf("go-flutter: engine.Run() returned result code %d (invalid arguments)\n", result)
260+
case embedder.ResultInternalInconsistency:
261+
fmt.Printf("go-flutter: engine.Run() returned result code %d (internal inconsistency)\n", result)
244262
default:
245263
fmt.Printf("go-flutter: engine.Run() returned result code %d (unknown result code)\n", result)
246264
}

‎embedder/embedder.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package embedder
22

33
// #include "embedder.h"
4-
// FlutterEngineResult runFlutter(void *user_data, FlutterEngine *engine, FlutterProjectArgs * Args,
4+
// FlutterEngineResult initEngine(void *user_data, FlutterEngine *engine, FlutterProjectArgs * Args,
55
// const char *const * vmArgs, int nVmAgrs);
66
// FlutterEngineResult
77
// createMessageResponseHandle(FlutterEngine engine, void *user_data,
@@ -28,6 +28,7 @@ const (
2828
ResultSuccess Result = C.kSuccess
2929
ResultInvalidLibraryVersion Result = C.kInvalidLibraryVersion
3030
ResultInvalidArguments Result = C.kInvalidArguments
31+
ResultInternalInconsistency Result = C.kInternalInconsistency
3132
ResultEngineNotRunning Result = -1
3233
)
3334

@@ -80,8 +81,19 @@ func NewFlutterEngine() *FlutterEngine {
8081
return &FlutterEngine{}
8182
}
8283

83-
// Run launches the Flutter Engine in a background thread.
84-
func (flu *FlutterEngine) Run(userData unsafe.Pointer, vmArgs []string) Result {
84+
// Runs an initialized engine in a background thread.
85+
func (flu *FlutterEngine) Run() Result {
86+
if flu.Engine == nil {
87+
fmt.Printf("go-flutter: The engine must be ini")
88+
return ResultInvalidArguments
89+
}
90+
91+
res := C.FlutterEngineRunInitialized(flu.Engine)
92+
return (Result)(res)
93+
}
94+
95+
// Init the Flutter Engine.
96+
func (flu *FlutterEngine) Init(userData unsafe.Pointer, vmArgs []string) Result {
8597
args := C.FlutterProjectArgs{
8698
assets_path: C.CString(flu.AssetsPath),
8799
icu_data_path: C.CString(flu.IcuDataPath),
@@ -94,7 +106,7 @@ func (flu *FlutterEngine) Run(userData unsafe.Pointer, vmArgs []string) Result {
94106
C.setArrayString(cVMArgs, C.CString(s), C.int(i))
95107
}
96108

97-
res := C.runFlutter(userData, &flu.Engine, &args, cVMArgs, C.int(len(vmArgs)))
109+
res := C.initEngine(userData, &flu.Engine, &args, cVMArgs, C.int(len(vmArgs)))
98110
if flu.Engine == nil {
99111
return ResultInvalidArguments
100112
}

‎embedder/embedder.h

Lines changed: 1015 additions & 420 deletions
Large diffs are not rendered by default.

‎embedder/embedder_helper.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ void proxy_post_task_callback(FlutterTask task, uint64_t target_time_nanos,
2424
void proxy_desktop_binary_reply(const uint8_t *data, size_t data_size,
2525
void *user_data);
2626

27+
static size_t gTaskRunnerIdentifiers = 0;
28+
2729
// C helper
28-
FlutterEngineResult runFlutter(void *user_data, FlutterEngine *engine,
30+
FlutterEngineResult initEngine(void *user_data, FlutterEngine *engine,
2931
FlutterProjectArgs *Args,
3032
const char *const *vmArgs, int nVmAgrs) {
3133
FlutterRendererConfig config = {};
@@ -45,20 +47,24 @@ FlutterEngineResult runFlutter(void *user_data, FlutterEngine *engine,
4547
Args->command_line_argv = vmArgs;
4648
Args->platform_message_callback = proxy_platform_message_callback;
4749

48-
// Configure task runner interop
50+
// Configure a task runner interop
4951
FlutterTaskRunnerDescription platform_task_runner = {};
5052
platform_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription);
5153
platform_task_runner.user_data = user_data;
5254
platform_task_runner.runs_task_on_current_thread_callback =
5355
proxy_runs_task_on_current_thread_callback;
5456
platform_task_runner.post_task_callback = proxy_post_task_callback;
57+
platform_task_runner.identifier = ++gTaskRunnerIdentifiers;
5558

5659
FlutterCustomTaskRunners custom_task_runners = {};
5760
custom_task_runners.struct_size = sizeof(FlutterCustomTaskRunners);
61+
// Render task and platform task are handled by the same TaskRunner
5862
custom_task_runners.platform_task_runner = &platform_task_runner;
63+
custom_task_runners.render_task_runner = &platform_task_runner;
64+
5965
Args->custom_task_runners = &custom_task_runners;
6066

61-
return FlutterEngineRun(FLUTTER_ENGINE_VERSION, &config, Args, user_data,
67+
return FlutterEngineInitialize(FLUTTER_ENGINE_VERSION, &config, Args, user_data,
6268
engine);
6369
}
6470

‎event-loop.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
// EventLoop is a event loop for the main thread that allows for delayed task
14-
// execution.()
14+
// execution.
1515
type EventLoop struct {
1616
// store the task (event) by their priorities
1717
priorityqueue *priorityqueue.PriorityQueue

0 commit comments

Comments
 (0)
Please sign in to comment.