2f7cff7170
- Log the parameters to RPCs
- Display messages like stack frames
- handler function and script visible
- message preview instead of local variables
- Expanded and previewed messages do not collapse when stepping within the existing message
- Mark patch classes as finalized to avoid ASSERT on class_finalizer.cc:2358 **
- Support iterating over message queues
- Support printing the message queue as JSON
- Inhibit OOB messages from being handled if we are iterating over the message queue
- avoids dead lock when looking up port handler (done in Dart code with message handler locked) and a stack overflow trigger to handle OOB messages
- make getObject understand message ids
- Fix dartbug.com/23355
** Need to discuss with Ivan and Matthias (reviewed code differs from committed code but matches my fix):
https://codereview.chromium.org//828353002
https://code.google.com/p/dart/source/detail?r=42612
R=turnidge@google.com
Review URL: https://codereview.chromium.org//1122503003
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@45505 260f80e4-7a28-3924-810f-c04153c831b5
143 lines
3.5 KiB
C++
143 lines
3.5 KiB
C++
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef VM_MESSAGE_H_
|
|
#define VM_MESSAGE_H_
|
|
|
|
#include "platform/assert.h"
|
|
#include "vm/allocation.h"
|
|
#include "vm/globals.h"
|
|
|
|
// Duplicated from dart_api.h to avoid including the whole header.
|
|
typedef int64_t Dart_Port;
|
|
|
|
namespace dart {
|
|
|
|
class JSONStream;
|
|
|
|
class Message {
|
|
public:
|
|
typedef enum {
|
|
kNormalPriority = 0, // Deliver message when idle.
|
|
kOOBPriority = 1, // Deliver message asap.
|
|
|
|
// Iteration.
|
|
kFirstPriority = 0,
|
|
kNumPriorities = 2,
|
|
} Priority;
|
|
|
|
// Values defining the type of OOB messages. OOB messages can only be
|
|
// fixed length arrays where the first element is a Smi with one of the
|
|
// valid values below.
|
|
typedef enum {
|
|
kIllegalOOB = 0,
|
|
kServiceOOBMsg = 1,
|
|
kIsolateLibOOBMsg = 2,
|
|
kDelayedIsolateLibOOBMsg = 3,
|
|
} OOBMsgTag;
|
|
|
|
// A port number which is never used.
|
|
static const Dart_Port kIllegalPort = 0;
|
|
|
|
// A new message to be sent between two isolates. The data handed to this
|
|
// message will be disposed by calling free() once the message object is
|
|
// being destructed (after delivery or when the receiving port is closed).
|
|
Message(Dart_Port dest_port,
|
|
uint8_t* data,
|
|
intptr_t len,
|
|
Priority priority,
|
|
Dart_Port delivery_failure_port = kIllegalPort)
|
|
: next_(NULL),
|
|
dest_port_(dest_port),
|
|
delivery_failure_port_(delivery_failure_port),
|
|
data_(data),
|
|
len_(len),
|
|
priority_(priority) {
|
|
ASSERT((priority == kNormalPriority) ||
|
|
(delivery_failure_port == kIllegalPort));
|
|
}
|
|
~Message() {
|
|
ASSERT(delivery_failure_port_ == kIllegalPort);
|
|
free(data_);
|
|
}
|
|
|
|
Dart_Port dest_port() const { return dest_port_; }
|
|
uint8_t* data() const { return data_; }
|
|
intptr_t len() const { return len_; }
|
|
Priority priority() const { return priority_; }
|
|
|
|
bool IsOOB() const { return priority_ == Message::kOOBPriority; }
|
|
|
|
bool RedirectToDeliveryFailurePort();
|
|
|
|
intptr_t Id() const;
|
|
|
|
static const char* PriorityAsString(Priority priority);
|
|
|
|
private:
|
|
friend class MessageQueue;
|
|
|
|
Message* next_;
|
|
Dart_Port dest_port_;
|
|
Dart_Port delivery_failure_port_;
|
|
uint8_t* data_;
|
|
intptr_t len_;
|
|
Priority priority_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Message);
|
|
};
|
|
|
|
// There is a message queue per isolate.
|
|
class MessageQueue {
|
|
public:
|
|
MessageQueue();
|
|
~MessageQueue();
|
|
|
|
void Enqueue(Message* msg, bool before_events);
|
|
|
|
// Gets the next message from the message queue or NULL if no
|
|
// message is available. This function will not block.
|
|
Message* Dequeue();
|
|
|
|
bool IsEmpty() { return head_ == NULL; }
|
|
|
|
// Clear all messages from the message queue.
|
|
void Clear();
|
|
|
|
// Iterator class.
|
|
class Iterator : public ValueObject {
|
|
public:
|
|
explicit Iterator(const MessageQueue* queue);
|
|
virtual ~Iterator();
|
|
|
|
void Reset(const MessageQueue* queue);
|
|
|
|
// Returns false when there are no more messages left.
|
|
bool HasNext();
|
|
|
|
// Returns the current message and moves forward.
|
|
Message* Next();
|
|
|
|
private:
|
|
Message* next_;
|
|
};
|
|
|
|
intptr_t Length() const;
|
|
|
|
// Returns the message with id or NULL.
|
|
Message* FindMessageById(intptr_t id);
|
|
|
|
void PrintJSON(JSONStream* stream);
|
|
|
|
private:
|
|
Message* head_;
|
|
Message* tail_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(MessageQueue);
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // VM_MESSAGE_H_
|