Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite398132

Browse files
author
Chandler Newman
committed
Split engine initialisation
1 parent9102744 commite398132

File tree

3 files changed

+140
-134
lines changed

3 files changed

+140
-134
lines changed

‎flutter-engine/src/builder.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
usecrate::{FlutterEngine,FlutterEngineHandler};
1+
usecrate::{CreateError,FlutterEngine,FlutterEngineHandler};
22
use std::path::PathBuf;
33
use std::sync::Weak;
44

55
pubstructFlutterEngineBuilder{
6-
handler:Option<Weak<dynFlutterEngineHandler>>,
7-
assets:PathBuf,
8-
args:Vec<String>,
6+
pub(crate)handler:Option<Weak<dynFlutterEngineHandler>>,
7+
pub(crate)assets:PathBuf,
8+
pub(crate)args:Vec<String>,
99
}
1010

1111
implFlutterEngineBuilder{
@@ -39,12 +39,7 @@ impl FlutterEngineBuilder {
3939
self
4040
}
4141

42-
pubfnbuild(self) ->FlutterEngine{
43-
let handler =self.handler.expect("No handler set");
44-
if !handler.upgrade().is_some(){
45-
panic!("Handler is not valid")
46-
}
47-
48-
FlutterEngine::new(handler,self.assets,self.args)
42+
pubfnbuild(self) ->Result<FlutterEngine,CreateError>{
43+
FlutterEngine::new(self)
4944
}
5045
}

‎flutter-engine/src/lib.rs

Lines changed: 130 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub mod tasks;
1212
pubmod texture_registry;
1313
pubmod utils;
1414

15+
usecrate::builder::FlutterEngineBuilder;
1516
usecrate::channel::{Channel,ChannelRegistrar};
1617
usecrate::ffi::{
1718
FlutterPointerDeviceKind,FlutterPointerMouseButtons,FlutterPointerPhase,
@@ -21,14 +22,13 @@ use crate::plugins::{Plugin, PluginRegistrar};
2122
usecrate::tasks::{TaskRunner,TaskRunnerHandler};
2223
usecrate::texture_registry::{Texture,TextureRegistry};
2324
use crossbeam_channel::{unbounded,Receiver,Sender};
24-
use flutter_engine_sys::FlutterTask;
25+
use flutter_engine_sys::{FlutterEngineResult,FlutterTask};
2526
use log::trace;
2627
use parking_lot::RwLock;
2728
use std::ffi::CString;
2829
use std::future::Future;
2930
use std::os::raw::{c_char, c_void};
3031
use std::path::{Path,PathBuf};
31-
use std::sync::atomic::{AtomicPtr,Ordering};
3232
use std::sync::{Arc,Weak};
3333
use std::time::{Instant,SystemTime,UNIX_EPOCH};
3434
use std::{mem, ptr};
@@ -45,7 +45,7 @@ pub(crate) enum MainThreadCallback {
4545

4646
structFlutterEngineInner{
4747
handler:Weak<dynFlutterEngineHandler>,
48-
engine_ptr:AtomicPtr<flutter_engine_sys::_FlutterEngine>,
48+
engine_ptr: flutter_engine_sys::FlutterEngine,
4949
plugins:RwLock<PluginRegistrar>,
5050
platform_runner:TaskRunner,
5151
_platform_runner_handler:Arc<PlatformRunnerHandler>,
@@ -142,11 +142,25 @@ impl TaskRunnerHandler for PlatformRunnerHandler {
142142
}
143143

144144
implFlutterEngine{
145-
pub(crate)fnnew(
146-
handler:Weak<dynFlutterEngineHandler>,
147-
assets:PathBuf,
148-
arguments:Vec<String>,
149-
) ->Self{
145+
pub(crate)fnnew(builder:FlutterEngineBuilder) ->Result<Self,CreateError>{
146+
// Convert arguments into flutter compatible
147+
letmut args =Vec::with_capacity(builder.args.len() +2);
148+
args.push(CString::new("flutter-rs").unwrap().into_raw());
149+
args.push(
150+
CString::new("--icu-symbol-prefix=gIcudtl")
151+
.unwrap()
152+
.into_raw(),
153+
);
154+
for argin builder.args.iter(){
155+
args.push(CString::new(arg.as_str()).unwrap().into_raw());
156+
}
157+
158+
// Extract handler
159+
let handler = builder.handler.expect("No handler set");
160+
if !handler.upgrade().is_some(){
161+
returnErr(CreateError::NoHandler);
162+
}
163+
150164
let platform_handler =Arc::new(PlatformRunnerHandler{
151165
handler: handler.clone(),
152166
});
@@ -156,7 +170,7 @@ impl FlutterEngine {
156170
let engine =Self{
157171
inner:Arc::new(FlutterEngineInner{
158172
handler,
159-
engine_ptr:AtomicPtr::new(ptr::null_mut()),
173+
engine_ptr: ptr::null_mut(),
160174
plugins:RwLock::new(PluginRegistrar::new()),
161175
platform_runner:TaskRunner::new(
162176
Arc::downgrade(&platform_handler)asWeak<dynTaskRunnerHandler>
@@ -165,107 +179,16 @@ impl FlutterEngine {
165179
platform_receiver: main_rx,
166180
platform_sender: main_tx,
167181
texture_registry:TextureRegistry::new(),
168-
assets,
169-
arguments,
182+
assets: builder.assets,
183+
arguments: builder.args,
170184
}),
171185
};
172186

173187
let inner =&engine.inner;
174188
inner.plugins.write().init(engine.downgrade());
175189
inner.platform_runner.init(engine.downgrade());
176190

177-
engine
178-
}
179-
180-
#[inline]
181-
pubfnengine_ptr(&self) -> flutter_engine_sys::FlutterEngine{
182-
self.inner.engine_ptr.load(Ordering::Relaxed)
183-
}
184-
185-
pubfnadd_plugin<P>(&self,plugin:P) ->&Self
186-
where
187-
P:Plugin +'static,
188-
{
189-
self.inner.plugins.write().add_plugin(plugin);
190-
self
191-
}
192-
193-
pubfnwith_plugin<F,P>(&self,f:F)
194-
where
195-
F:FnOnce(&P),
196-
P:Plugin +'static,
197-
{
198-
self.inner.plugins.read().with_plugin(f)
199-
}
200-
201-
pubfnwith_plugin_mut<F,P>(&self,f:F)
202-
where
203-
F:FnOnce(&mutP),
204-
P:Plugin +'static,
205-
{
206-
self.inner.plugins.write().with_plugin_mut(f)
207-
}
208-
209-
pubfnremove_channel(&self,channel_name:&str) ->Option<Arc<dynChannel>>{
210-
self.inner
211-
.plugins
212-
.write()
213-
.channel_registry
214-
.remove_channel(channel_name)
215-
}
216-
217-
pubfnwith_channel<F>(&self,channel_name:&str,f:F)
218-
where
219-
F:FnOnce(&dynChannel),
220-
{
221-
self.inner
222-
.plugins
223-
.read()
224-
.channel_registry
225-
.with_channel(channel_name, f)
226-
}
227-
228-
pubfnwith_channel_registrar<F>(&self,plugin_name:&'staticstr,f:F)
229-
where
230-
F:FnOnce(&mutChannelRegistrar),
231-
{
232-
self.inner
233-
.plugins
234-
.write()
235-
.channel_registry
236-
.with_channel_registrar(plugin_name, f)
237-
}
238-
239-
pubfndowngrade(&self) ->FlutterEngineWeakRef{
240-
FlutterEngineWeakRef{
241-
inner:Arc::downgrade(&self.inner),
242-
}
243-
}
244-
245-
pubfnassets(&self) ->&Path{
246-
&self.inner.assets
247-
}
248-
249-
pubfnarguments(&self) ->&Vec<String>{
250-
&self.inner.arguments
251-
}
252-
253-
pubfnrun(&self) ->Result<(),RunError>{
254-
if !self.is_platform_thread(){
255-
returnErr(RunError::NotPlatformThread);
256-
}
257-
258-
letmut args =Vec::with_capacity(self.inner.arguments.len() +2);
259-
args.push(CString::new("flutter-rs").unwrap().into_raw());
260-
args.push(
261-
CString::new("--icu-symbol-prefix=gIcudtl")
262-
.unwrap()
263-
.into_raw(),
264-
);
265-
for arginself.inner.arguments.iter(){
266-
args.push(CString::new(arg.as_str()).unwrap().into_raw());
267-
}
268-
191+
// Configure renderer
269192
let renderer_config = flutter_engine_sys::FlutterRendererConfig{
270193
type_: flutter_engine_sys::FlutterRendererType::kOpenGL,
271194
__bindgen_anon_1: flutter_engine_sys::FlutterRendererConfig__bindgen_ty_1{
@@ -287,9 +210,10 @@ impl FlutterEngine {
287210
},
288211
};
289212

213+
// Configure engine threads
290214
// TODO: Should be downgraded to a weak once weak::into_raw lands in stable
291215
let runner_ptr ={
292-
let arc =self.inner.platform_runner.clone().inner;
216+
let arc = inner.platform_runner.clone().inner;
293217
Arc::into_raw(arc)as*mut std::ffi::c_void
294218
};
295219

@@ -310,9 +234,10 @@ impl FlutterEngine {
310234
as*const flutter_engine_sys::FlutterTaskRunnerDescription,
311235
};
312236

237+
// Configure engine
313238
let project_args = flutter_engine_sys::FlutterProjectArgs{
314239
struct_size: std::mem::size_of::<flutter_engine_sys::FlutterProjectArgs>(),
315-
assets_path:path_to_cstring(self.assets()).into_raw(),
240+
assets_path:path_to_cstring(&inner.assets).into_raw(),
316241
main_path__unused__: std::ptr::null(),
317242
packages_path__unused__: std::ptr::null(),
318243
icu_data_path: std::ptr::null(),
@@ -340,25 +265,111 @@ impl FlutterEngine {
340265
compositor: std::ptr::null(),
341266
};
342267

268+
// Initialise engine
343269
unsafe{
344270
// TODO: Should be downgraded to a weak once weak::into_raw lands in stable
345-
let inner_ptr =Arc::into_raw(self.inner.clone())as*mut std::ffi::c_void;
271+
let inner_ptr =Arc::into_raw(inner.clone())as*mut std::ffi::c_void;
346272

347-
let engine_ptr: flutter_engine_sys::FlutterEngine = std::ptr::null_mut();
348-
if flutter_engine_sys::FlutterEngineRun(
273+
if flutter_engine_sys::FlutterEngineInitialize(
349274
1,
350275
&renderer_config,
351276
&project_args,
352277
inner_ptr,
353-
&engine_ptras*const flutter_engine_sys::FlutterEngine
278+
&inner.engine_ptras*const flutter_engine_sys::FlutterEngine
354279
as*mut flutter_engine_sys::FlutterEngine,
355280
) != flutter_engine_sys::FlutterEngineResult::kSuccess
356-
|| engine_ptr.is_null()
281+
||inner.engine_ptr.is_null()
357282
{
358-
Err(RunError::EnginePtrNull)
283+
Err(CreateError::EnginePtrNull)
359284
}else{
360-
self.inner.engine_ptr.store(engine_ptr,Ordering::Relaxed);
361-
Ok(())
285+
Ok(engine)
286+
}
287+
}
288+
}
289+
290+
#[inline]
291+
pubfnengine_ptr(&self) -> flutter_engine_sys::FlutterEngine{
292+
self.inner.engine_ptr
293+
}
294+
295+
pubfnadd_plugin<P>(&self,plugin:P) ->&Self
296+
where
297+
P:Plugin +'static,
298+
{
299+
self.inner.plugins.write().add_plugin(plugin);
300+
self
301+
}
302+
303+
pubfnwith_plugin<F,P>(&self,f:F)
304+
where
305+
F:FnOnce(&P),
306+
P:Plugin +'static,
307+
{
308+
self.inner.plugins.read().with_plugin(f)
309+
}
310+
311+
pubfnwith_plugin_mut<F,P>(&self,f:F)
312+
where
313+
F:FnOnce(&mutP),
314+
P:Plugin +'static,
315+
{
316+
self.inner.plugins.write().with_plugin_mut(f)
317+
}
318+
319+
pubfnremove_channel(&self,channel_name:&str) ->Option<Arc<dynChannel>>{
320+
self.inner
321+
.plugins
322+
.write()
323+
.channel_registry
324+
.remove_channel(channel_name)
325+
}
326+
327+
pubfnwith_channel<F>(&self,channel_name:&str,f:F)
328+
where
329+
F:FnOnce(&dynChannel),
330+
{
331+
self.inner
332+
.plugins
333+
.read()
334+
.channel_registry
335+
.with_channel(channel_name, f)
336+
}
337+
338+
pubfnwith_channel_registrar<F>(&self,plugin_name:&'staticstr,f:F)
339+
where
340+
F:FnOnce(&mutChannelRegistrar),
341+
{
342+
self.inner
343+
.plugins
344+
.write()
345+
.channel_registry
346+
.with_channel_registrar(plugin_name, f)
347+
}
348+
349+
pubfndowngrade(&self) ->FlutterEngineWeakRef{
350+
FlutterEngineWeakRef{
351+
inner:Arc::downgrade(&self.inner),
352+
}
353+
}
354+
355+
pubfnassets(&self) ->&Path{
356+
&self.inner.assets
357+
}
358+
359+
pubfnarguments(&self) ->&Vec<String>{
360+
&self.inner.arguments
361+
}
362+
363+
pubfnrun(&self) ->Result<(),()>{
364+
if !self.is_platform_thread(){
365+
panic!("Not on platform thread");
366+
}
367+
368+
// TODO: Safeguard, process results
369+
unsafe{
370+
match flutter_engine_sys::FlutterEngineRunInitialized(self.engine_ptr()){
371+
FlutterEngineResult::kSuccess =>Ok(()),
372+
_ =>Err(()),
362373
}
363374
}
364375
}
@@ -587,19 +598,19 @@ fn path_to_cstring(path: &Path) -> CString {
587598
}
588599

589600
#[derive(Debug,Eq,PartialEq)]
590-
pubenumRunError{
591-
NotPlatformThread,
601+
pubenumCreateError{
602+
NoHandler,
592603
EnginePtrNull,
593604
}
594605

595-
impl core::fmt::DisplayforRunError{
606+
impl core::fmt::DisplayforCreateError{
596607
fnfmt(&self,f:&mut core::fmt::Formatter) -> core::fmt::Result{
597608
let msg =matchself{
598-
RunError::NotPlatformThread =>"Not on platform thread.",
599-
RunError::EnginePtrNull =>"Engine ptr is null.",
609+
CreateError::NoHandler =>"No handler set.",
610+
CreateError::EnginePtrNull =>"Engine ptr is null.",
600611
};
601612
writeln!(f,"{}", msg)
602613
}
603614
}
604615

605-
impl std::error::ErrorforRunError{}
616+
impl std::error::ErrorforCreateError{}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp