Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Side by Side Diff: runtime/bin/io_service_patch.dart

Issue 834233003: Fix for issue 21398 (only send "literal like" objects across isolates spawned using spawnURI (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/dartutils.h ('k') | runtime/include/dart_native_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class _IOService { 5 patch class _IOService {
6 // Lazy initialize service ports, 32 per isolate. 6 // Lazy initialize service ports, 32 per isolate.
7 static const int _SERVICE_PORT_COUNT = 32; 7 static const int _SERVICE_PORT_COUNT = 32;
8 static List<SendPort> _servicePort = new List(_SERVICE_PORT_COUNT); 8 static List<SendPort> _servicePort = new List(_SERVICE_PORT_COUNT);
9 static RawReceivePort _receivePort; 9 static RawReceivePort _receivePort;
10 static SendPort _replyToPort; 10 static SendPort _replyToPort;
11 static Map<int, Completer> _messageMap = {}; 11 static Map<int, Completer> _messageMap = {};
12 static int _id = 0; 12 static int _id = 0;
13 13
14 /* patch */ static Future dispatch(int request, List data) { 14 /* patch */ static Future dispatch(int request, List data) {
15 int id; 15 int id;
16 do { 16 do {
17 id = _getNextId(); 17 id = _getNextId();
18 } while (_messageMap.containsKey(id)); 18 } while (_messageMap.containsKey(id));
19 int index = id % _SERVICE_PORT_COUNT; 19 int index = id % _SERVICE_PORT_COUNT;
20 _initialize(index); 20 _initialize(index);
21 var completer = new Completer(); 21 var completer = new Completer();
22 _messageMap[id] = completer; 22 _messageMap[id] = completer;
23 _servicePort[index].send([id, _replyToPort, request, data]); 23 try {
24 _servicePort[index].send([id, _replyToPort, request, data]);
25 } catch (error) {
26 _messageMap.remove(id).complete(error);
27 if (_messageMap.length == 0) {
28 _finalize();
29 }
30 }
24 return completer.future; 31 return completer.future;
25 } 32 }
26 33
27 static void _initialize(int index) { 34 static void _initialize(int index) {
28 if (_servicePort[index] == null) { 35 if (_servicePort[index] == null) {
29 _servicePort[index] = _newServicePort(); 36 _servicePort[index] = _newServicePort();
30 } 37 }
31 if (_receivePort == null) { 38 if (_receivePort == null) {
32 _receivePort = new RawReceivePort(); 39 _receivePort = new RawReceivePort();
33 _replyToPort = _receivePort.sendPort; 40 _replyToPort = _receivePort.sendPort;
34 _receivePort.handler = (data) { 41 _receivePort.handler = (data) {
35 assert(data is List && data.length == 2); 42 assert(data is List && data.length == 2);
36 _messageMap.remove(data[0]).complete(data[1]); 43 _messageMap.remove(data[0]).complete(data[1]);
37 if (_messageMap.length == 0) { 44 if (_messageMap.length == 0) {
38 _id = 0; 45 _finalize();
39 _receivePort.close();
40 _receivePort = null;
41 } 46 }
42 }; 47 };
43 } 48 }
44 } 49 }
45 50
51 static void _finalize() {
52 _id = 0;
53 _receivePort.close();
54 _receivePort = null;
55 }
56
46 static int _getNextId() { 57 static int _getNextId() {
47 if (_id == 0x7FFFFFFF) _id = 0; 58 if (_id == 0x7FFFFFFF) _id = 0;
48 return _id++; 59 return _id++;
49 } 60 }
50 61
51 static SendPort _newServicePort() native "IOService_NewServicePort"; 62 static SendPort _newServicePort() native "IOService_NewServicePort";
52 } 63 }
OLDNEW
« no previous file with comments | « runtime/bin/dartutils.h ('k') | runtime/include/dart_native_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698