15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/resource_reply_thread_registrar.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ipc/ipc_message.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/proxy/resource_message_params.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ppapi {
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace proxy {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::ResourceReplyThreadRegistrar(
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_refptr<base::MessageLoopProxy> main_thread)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : main_thread_(main_thread) {
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::~ResourceReplyThreadRegistrar() {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Register(
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PP_Resource resource,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32_t sequence_number,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<TrackedCallback> reply_thread_hint) {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ProxyLock::AssertAcquiredDebugOnly();
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Use the main thread if |reply_thread_hint| is NULL or blocking.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!reply_thread_hint.get() || reply_thread_hint->is_blocking())
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(reply_thread_hint->target_loop());
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> reply_thread(
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reply_thread_hint->target_loop()->GetMessageLoopProxy());
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::AutoLock auto_lock(lock_);
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (reply_thread.get() == main_thread_.get())
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    map_[resource][sequence_number] = reply_thread;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Unregister(PP_Resource resource) {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  map_.erase(resource);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourceReplyThreadRegistrar::HandleOnIOThread(uint32 nested_msg_type) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock auto_lock(lock_);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  io_thread_message_types_.insert(nested_msg_type);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<base::MessageLoopProxy>
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourceReplyThreadRegistrar::GetTargetThread(
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ResourceMessageReplyParams& reply_params,
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const IPC::Message& nested_msg) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ResourceMap::iterator resource_iter = map_.find(reply_params.pp_resource());
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (resource_iter != map_.end()) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SequenceThreadMap::iterator sequence_thread_iter =
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        resource_iter->second.find(reply_params.sequence());
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (sequence_thread_iter != resource_iter->second.end()) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_refptr<base::MessageLoopProxy> target =
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          sequence_thread_iter->second;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      resource_iter->second.erase(sequence_thread_iter);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return target;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (io_thread_message_types_.count(nested_msg.type()) != 0)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return scoped_refptr<base::MessageLoopProxy>();
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return main_thread_;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace proxy
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace ppapi
83