Index: mojo/dart/embedder/io/mojo_patch.dart |
diff --git a/mojo/dart/embedder/io/mojo_patch.dart b/mojo/dart/embedder/io/mojo_patch.dart |
index fc059c23639c1fe376a78f323ab22cb035e97027..fec2a3ef3a9f0b02d68f3697e9d6d4304de470fb 100644 |
--- a/mojo/dart/embedder/io/mojo_patch.dart |
+++ b/mojo/dart/embedder/io/mojo_patch.dart |
@@ -20,6 +20,187 @@ import 'dart:_mojo_services/mojo/files/directory.mojom.dart'; |
import 'dart:_mojo_services/mojo/files/ioctl.mojom.dart'; |
import 'dart:_mojo_services/mojo/files/types.mojom.dart' as types; |
+// TODO(zra): Investigate the runtime cost of using these wrapper classes. |
+// Port to use the callback API where necessary to recover performance. |
+class _NetworkServiceProxy extends FuturizedProxy<NetworkServiceProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ NetworkServiceProxy _nsProxy; |
+ |
+ _NetworkServiceProxy(NetworkServiceProxy p) : super(p) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #createTcpBoundSocket: p.createTcpBoundSocket, |
+ #createTcpConnectedSocket: p.createTcpConnectedSocket, |
+ #createHttpServer: p.createHttpServer, |
+ }; |
+ _nsProxy = p; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ Function get createUrlLoader => _nsProxy.createUrlLoader; |
+ Function get getCookieStore => _nsProxy.getCookieStore; |
+ Function get createWebSocket => _nsProxy.createWebSocket; |
+ Function get createUdpSocket => _nsProxy.createUdpSocket; |
+ Function get registerUrlLoaderInterceptor => |
+ _nsProxy.registerUrlLoaderInterceptor; |
+ Function get createHostResolver => _nsProxy.createHostResolver; |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #createTcpBoundSocket: |
+ new NetworkServiceCreateTcpBoundSocketResponseParams#init, |
+ #createTcpConnectedSocket: |
+ new NetworkServiceCreateTcpConnectedSocketResponseParams#init, |
+ #createHttpServer: |
+ new NetworkServiceCreateHttpServerResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _HostResolverProxy extends FuturizedProxy<HostResolverProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _HostResolverProxy(HostResolverProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #getHostAddresses: proxy.getHostAddresses, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ _HostResolverProxy.unbound() : this(new HostResolverProxy.unbound()); |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #getHostAddresses: new HostResolverGetHostAddressesResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _TcpBoundSocketProxy extends FuturizedProxy<TcpBoundSocketProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _TcpBoundSocketProxy(TcpBoundSocketProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #startListening: proxy.startListening, |
+ #connect: proxy.connect, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ _TcpBoundSocketProxy.unbound() : this(new TcpBoundSocketProxy.unbound()); |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #startListening: new TcpBoundSocketStartListeningResponseParams#init, |
+ #connect: new TcpBoundSocketConnectResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _TcpServerSocketProxy extends FuturizedProxy<TcpServerSocketProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _TcpServerSocketProxy(TcpServerSocketProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #accept: proxy.accept, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ _TcpServerSocketProxy.unbound() : this(new TcpServerSocketProxy.unbound()); |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #accept: new TcpServerSocketAcceptResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _FilesProxy extends FuturizedProxy<FilesProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _FilesProxy(FilesProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #openFileSystem: proxy.openFileSystem, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #openFileSystem: new FilesOpenFileSystemResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _FileProxy extends FuturizedProxy<FileProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _FileProxy(FileProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #close_: proxy.close_, |
+ #read: proxy.read, |
+ #write: proxy.write, |
+ #readToStream: proxy.readToStream, |
+ #writeFromStream: proxy.writeFromStream, |
+ #tell: proxy.tell, |
+ #seek: proxy.seek, |
+ #stat: proxy.stat, |
+ #truncate: proxy.truncate, |
+ #touch: proxy.touch, |
+ #dup: proxy.dup, |
+ #repoen: proxy.reopen, |
+ #asBuffer: proxy.asBuffer, |
+ #ioctl: proxy.ioctl, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ _FileProxy.unbound() : this(new FileProxy.unbound()); |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #close_: new FileCloseResponseParams#init, |
+ #read: new FileReadResponseParams#init, |
+ #write: new FileWriteResponseParams#init, |
+ #readToStream: new FileReadToStreamResponseParams#init, |
+ #writeFromStream: new FileWriteFromStreamResponseParams#init, |
+ #tell: new FileTellResponseParams#init, |
+ #seek: new FileSeekResponseParams#init, |
+ #stat: new FileStatResponseParams#init, |
+ #truncate: new FileTruncateResponseParams#init, |
+ #touch: new FileTouchResponseParams#init, |
+ #dup: new FileDupResponseParams#init, |
+ #repoen: new FileReopenResponseParams#init, |
+ #asBuffer: new FileAsBufferResponseParams#init, |
+ #ioctl: new FileIoctlResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
+class _DirectoryProxy extends FuturizedProxy<DirectoryProxy> { |
+ Map<Symbol, Function> _mojoMethods; |
+ |
+ _DirectoryProxy(DirectoryProxy proxy) : super(proxy) { |
+ _mojoMethods = <Symbol, Function>{ |
+ #read: proxy.read, |
+ #stat: proxy.stat, |
+ #touch: proxy.touch, |
+ #openFile: proxy.openFile, |
+ #openDirectory: proxy.openDirectory, |
+ #rename: proxy.rename, |
+ #delete: proxy.delete, |
+ }; |
+ } |
+ Map<Symbol, Function> get mojoMethods => _mojoMethods; |
+ |
+ _DirectoryProxy.unbound() : this(new DirectoryProxy.unbound()); |
+ |
+ static final Map<Symbol, Function> _mojoResponses = { |
+ #read: new DirectoryReadResponseParams#init, |
+ #stat: new DirectoryStatResponseParams#init, |
+ #touch: new DirectoryTouchResponseParams#init, |
+ #openFile: new DirectoryOpenFileResponseParams#init, |
+ #openDirectory: new DirectoryOpenDirectoryResponseParams#init, |
+ #rename: new DirectoryRenameResponseParams#init, |
+ #delete: new DirectoryDeleteResponseParams#init, |
+ }; |
+ Map<Symbol, Function> get mojoResponses => _mojoResponses; |
+} |
+ |
// When developing, set fileSystemDeveloper to true and the file system will |
// persist under ~/MojoAppPersistentCaches/. |
const bool fileSystemDeveloper = false; |
@@ -34,11 +215,11 @@ const String systemTempPath = 'tmp'; |
// |
int _networkServiceHandle; |
int _filesServiceHandle; |
-NetworkServiceProxy _networkService; |
-HostResolverProxy _hostResolver; |
-FilesProxy _files; |
-DirectoryProxy _rootDirectory; |
-DirectoryProxy _systemTempDirectory; |
+_NetworkServiceProxy _networkService; |
+_HostResolverProxy _hostResolver; |
+_FilesProxy _files; |
+_DirectoryProxy _rootDirectory; |
+_DirectoryProxy _systemTempDirectory; |
void _initialize( |
int networkServiceHandle, int filesServiceHandle, String scriptPath) { |
@@ -94,57 +275,59 @@ _closeProxies() { |
} |
/// Get the singleton NetworkServiceProxy. |
-NetworkServiceProxy _getNetworkService() { |
+_NetworkServiceProxy _getNetworkService() { |
if (_networkService != null) { |
return _networkService; |
} |
- _networkService = new NetworkServiceProxy.fromHandle( |
+ var networkService = new NetworkServiceProxy.fromHandle( |
new MojoHandle(_networkServiceHandle).pass()); |
+ _networkService = new _NetworkServiceProxy(networkService); |
_networkServiceHandle = null; |
return _networkService; |
} |
/// Get the singleton HostResolverProxy. |
-HostResolverProxy _getHostResolver() { |
+_HostResolverProxy _getHostResolver() { |
if (_hostResolver != null) { |
return _hostResolver; |
} |
- var networkService = _getNetworkService(); |
+ _NetworkServiceProxy networkService = _getNetworkService(); |
if (networkService == null) { |
return null; |
} |
- _hostResolver = new HostResolverProxy.unbound(); |
- networkService.createHostResolver(_hostResolver); |
+ _hostResolver = new _HostResolverProxy.unbound(); |
+ networkService.createHostResolver(_hostResolver.proxy); |
// Remove the host resolver's handle from the open set because it is not |
// under application control and does not affect isolate shutdown. |
- _hostResolver.ctrl.endpoint.handle.pass(); |
+ _hostResolver.proxy.ctrl.endpoint.handle.pass(); |
return _hostResolver; |
} |
/// Get the singleton FilesProxy. |
-FilesProxy _getFiles() { |
+_FilesProxy _getFiles() { |
if (_files != null) { |
return _files; |
} |
- _files = new FilesProxy.fromHandle( |
+ var files = new FilesProxy.fromHandle( |
new MojoHandle(_filesServiceHandle).pass()); |
+ _files = new _FilesProxy(files); |
_filesServiceHandle = null; |
return _files; |
} |
/// Get the singleton DirectoryProxy for the root directory. |
-Future<DirectoryProxy> _getRootDirectory() async { |
+Future<_DirectoryProxy> _getRootDirectory() async { |
if (_rootDirectory != null) { |
return _rootDirectory; |
} |
- FilesProxy files = _getFiles(); |
+ _FilesProxy files = _getFiles(); |
assert(files != null); |
- _rootDirectory = new DirectoryProxy.unbound(); |
+ _rootDirectory = new _DirectoryProxy.unbound(); |
var response = |
- await files.openFileSystem(fileSystemName, _rootDirectory); |
+ await files.openFileSystem(fileSystemName, _rootDirectory.proxy); |
// Remove the root directory's handle from the open set because it is not |
// under application control and does not affect isolate shutdown. |
- _rootDirectory.ctrl.endpoint.handle.pass(); |
+ _rootDirectory.proxy.ctrl.endpoint.handle.pass(); |
// Ensure system temporary directory exists before returning the root |
// directory. |
@@ -153,23 +336,23 @@ Future<DirectoryProxy> _getRootDirectory() async { |
} |
/// Get the singleton DirectoryProxy for the system temp directory. |
-Future<DirectoryProxy> _getSystemTempDirectory() async { |
+Future<_DirectoryProxy> _getSystemTempDirectory() async { |
if (_systemTempDirectory != null) { |
return _systempTempDirectory; |
} |
- DirectoryProxy rootDirectory = await _getRootDirectory(); |
+ _DirectoryProxy rootDirectory = await _getRootDirectory(); |
int flags = types.kOpenFlagRead | |
types.kOpenFlagWrite | |
types.kOpenFlagCreate; |
- _systemTempDirectory = new DirectoryProxy.unbound(); |
+ _systemTempDirectory = new _DirectoryProxy.unbound(); |
var response = |
await rootDirectory.openDirectory(systemTempPath, |
- _systemTempDirectory, |
+ _systemTempDirectory.proxy, |
flags); |
assert(response.error == types.Error.ok); |
// Remove the system temp directory's handle from the open set because it |
// is not under application control and does not affect isolate shutdown. |
- _systemTempDirectory.ctrl.endpoint.handle.pass(); |
+ _systemTempDirectory.proxy.ctrl.endpoint.handle.pass(); |
return _systemTempDirectory; |
} |