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

Side by Side Diff: runtime/vm/message.h

Issue 1499853004: Adds a special case for sending an int over a port with the native API. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/message.cc » ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 #ifndef VM_MESSAGE_H_ 5 #ifndef VM_MESSAGE_H_
6 #define VM_MESSAGE_H_ 6 #define VM_MESSAGE_H_
7 7
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/globals.h" 10 #include "vm/globals.h"
(...skipping 19 matching lines...) Expand all
30 // Values defining the type of OOB messages. OOB messages can only be 30 // Values defining the type of OOB messages. OOB messages can only be
31 // fixed length arrays where the first element is a Smi with one of the 31 // fixed length arrays where the first element is a Smi with one of the
32 // valid values below. 32 // valid values below.
33 typedef enum { 33 typedef enum {
34 kIllegalOOB = 0, 34 kIllegalOOB = 0,
35 kServiceOOBMsg = 1, 35 kServiceOOBMsg = 1,
36 kIsolateLibOOBMsg = 2, 36 kIsolateLibOOBMsg = 2,
37 kDelayedIsolateLibOOBMsg = 3, 37 kDelayedIsolateLibOOBMsg = 3,
38 } OOBMsgTag; 38 } OOBMsgTag;
39 39
40 typedef enum {
41 kDataType = 0,
42 kIntegerType = 1,
43 kNumTypes = 2,
44 } MessageType;
45
40 // A port number which is never used. 46 // A port number which is never used.
41 static const Dart_Port kIllegalPort = 0; 47 static const Dart_Port kIllegalPort = 0;
42 48
43 // A new message to be sent between two isolates. The data handed to this 49 // A new message to be sent between two isolates. The data handed to this
44 // message will be disposed by calling free() once the message object is 50 // message will be disposed by calling free() once the message object is
45 // being destructed (after delivery or when the receiving port is closed). 51 // being destructed (after delivery or when the receiving port is closed).
46 Message(Dart_Port dest_port, 52 Message(Dart_Port dest_port,
47 uint8_t* data, 53 uint8_t* data,
48 intptr_t len, 54 intptr_t len,
49 Priority priority, 55 Priority priority,
50 Dart_Port delivery_failure_port = kIllegalPort) 56 Dart_Port delivery_failure_port = kIllegalPort)
51 : next_(NULL), 57 : next_(NULL),
52 dest_port_(dest_port), 58 dest_port_(dest_port),
53 delivery_failure_port_(delivery_failure_port), 59 delivery_failure_port_(delivery_failure_port),
54 data_(data), 60 priority_(priority),
55 len_(len), 61 type_(kDataType) {
56 priority_(priority) {
57 ASSERT((priority == kNormalPriority) || 62 ASSERT((priority == kNormalPriority) ||
58 (delivery_failure_port == kIllegalPort)); 63 (delivery_failure_port == kIllegalPort));
64 data_.buffer.data = data;
65 data_.buffer.len = len;
66 }
67 Message(Dart_Port dest_port,
68 intptr_t data,
69 Priority priority,
70 Dart_Port delivery_failure_port = kIllegalPort)
71 : next_(NULL),
72 dest_port_(dest_port),
73 delivery_failure_port_(delivery_failure_port),
74 priority_(priority),
75 type_(kIntegerType) {
76 ASSERT((priority == kNormalPriority) ||
77 (delivery_failure_port == kIllegalPort));
78 data_.integer = data;
59 } 79 }
60 ~Message() { 80 ~Message() {
61 ASSERT(delivery_failure_port_ == kIllegalPort); 81 ASSERT(delivery_failure_port_ == kIllegalPort);
62 free(data_); 82 if (type_ == kDataType) {
83 free(data_.buffer.data);
84 }
63 } 85 }
64 86
65 Dart_Port dest_port() const { return dest_port_; } 87 Dart_Port dest_port() const { return dest_port_; }
66 uint8_t* data() const { return data_; } 88 MessageType type() const { return type_; }
67 intptr_t len() const { return len_; } 89 uint8_t* data() const {
90 ASSERT(type_ == kDataType);
91 return data_.buffer.data;
92 }
93 intptr_t len() const {
94 ASSERT(type_ == kDataType);
95 return data_.buffer.len;
96 }
97 intptr_t integer() const {
98 ASSERT(type_ == kIntegerType);
99 return data_.integer;
100 }
68 Priority priority() const { return priority_; } 101 Priority priority() const { return priority_; }
69 102
70 bool IsOOB() const { return priority_ == Message::kOOBPriority; } 103 bool IsOOB() const { return priority_ == Message::kOOBPriority; }
71 104
72 bool RedirectToDeliveryFailurePort(); 105 bool RedirectToDeliveryFailurePort();
73 106
74 intptr_t Id() const; 107 intptr_t Id() const;
75 108
76 static const char* PriorityAsString(Priority priority); 109 static const char* PriorityAsString(Priority priority);
77 110
78 private: 111 private:
79 friend class MessageQueue; 112 friend class MessageQueue;
80 113
81 Message* next_; 114 Message* next_;
82 Dart_Port dest_port_; 115 Dart_Port dest_port_;
83 Dart_Port delivery_failure_port_; 116 Dart_Port delivery_failure_port_;
84 uint8_t* data_; 117 union {
85 intptr_t len_; 118 struct {
119 uint8_t* data;
120 intptr_t len;
121 } buffer; // Avtive when type_ == kDataType.
122 intptr_t integer; // Active when type_ == kIntegerType.
Ivan Posva 2015/12/08 08:25:55 Let's discuss this change in person to figure out
123 } data_;
86 Priority priority_; 124 Priority priority_;
125 MessageType type_;
87 126
88 DISALLOW_COPY_AND_ASSIGN(Message); 127 DISALLOW_COPY_AND_ASSIGN(Message);
89 }; 128 };
90 129
91 // There is a message queue per isolate. 130 // There is a message queue per isolate.
92 class MessageQueue { 131 class MessageQueue {
93 public: 132 public:
94 MessageQueue(); 133 MessageQueue();
95 ~MessageQueue(); 134 ~MessageQueue();
96 135
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 private: 172 private:
134 Message* head_; 173 Message* head_;
135 Message* tail_; 174 Message* tail_;
136 175
137 DISALLOW_COPY_AND_ASSIGN(MessageQueue); 176 DISALLOW_COPY_AND_ASSIGN(MessageQueue);
138 }; 177 };
139 178
140 } // namespace dart 179 } // namespace dart
141 180
142 #endif // VM_MESSAGE_H_ 181 #endif // VM_MESSAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/message.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698