summaryrefslogtreecommitdiffstats
path: root/chrome_frame/sync_msg_reply_dispatcher.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome_frame/sync_msg_reply_dispatcher.cc')
-rw-r--r--chrome_frame/sync_msg_reply_dispatcher.cc51
1 files changed, 28 insertions, 23 deletions
diff --git a/chrome_frame/sync_msg_reply_dispatcher.cc b/chrome_frame/sync_msg_reply_dispatcher.cc
index b301698..1b51516 100644
--- a/chrome_frame/sync_msg_reply_dispatcher.cc
+++ b/chrome_frame/sync_msg_reply_dispatcher.cc
@@ -6,56 +6,61 @@
#include "ipc/ipc_sync_message.h"
-void SyncMessageReplyDispatcher::Push(IPC::SyncMessage* msg, void* callback,
+void SyncMessageReplyDispatcher::Push(IPC::SyncMessage* msg,
+ SyncMessageCallContext* context,
void* key) {
- MessageSent pending(IPC::SyncMessage::GetMessageId(*msg),
- msg->type(), callback, key);
+ context->message_type_ = msg->type();
+ context->id_ = IPC::SyncMessage::GetMessageId(*msg);
+ context->key_ = key;
+
AutoLock lock(message_queue_lock_);
- message_queue_.push_back(pending);
+ message_queue_.push_back(context);
}
-bool SyncMessageReplyDispatcher::HandleMessageType(const IPC::Message& msg,
- const MessageSent& origin) {
+bool SyncMessageReplyDispatcher::HandleMessageType(
+ const IPC::Message& msg, SyncMessageCallContext* context) {
return false;
}
bool SyncMessageReplyDispatcher::OnMessageReceived(const IPC::Message& msg) {
- MessageSent origin;
- if (!Pop(msg, &origin)) {
+ SyncMessageCallContext* context = GetContext(msg);
+ // No context e.g. no return values and/or don't care
+ if (!context) {
return false;
}
- // No callback e.g. no return values and/or don't care
- if (origin.callback == NULL)
- return true;
-
- return HandleMessageType(msg, origin);
+ return HandleMessageType(msg, context);
}
void SyncMessageReplyDispatcher::Cancel(void* key) {
DCHECK(key != NULL);
AutoLock lock(message_queue_lock_);
- PendingSyncMessageQueue::iterator it;
- for (it = message_queue_.begin(); it != message_queue_.end(); ++it) {
- if (it->key == key) {
- it->key = NULL;
+ PendingSyncMessageQueue::iterator it = message_queue_.begin();
+ while (it != message_queue_.end()) {
+ SyncMessageCallContext* context = *it;
+ if (context->key_ == key) {
+ it = message_queue_.erase(it);
+ delete context;
+ } else {
+ ++it;
}
}
}
-bool SyncMessageReplyDispatcher::Pop(const IPC::Message& msg, MessageSent* t) {
+SyncMessageReplyDispatcher::SyncMessageCallContext*
+ SyncMessageReplyDispatcher::GetContext(const IPC::Message& msg) {
if (!msg.is_reply())
- return false;
+ return NULL;
int id = IPC::SyncMessage::GetMessageId(msg);
AutoLock lock(message_queue_lock_);
PendingSyncMessageQueue::iterator it;
for (it = message_queue_.begin(); it != message_queue_.end(); ++it) {
- if (it->id == id) {
- *t = *it;
+ SyncMessageCallContext* context = *it;
+ if (context->id_ == id) {
message_queue_.erase(it);
- return true;
+ return context;
}
}
- return false;
+ return NULL;
}