1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ppapi/proxy/resource_reply_thread_registrar.h"
7 #include "base/logging.h"
8 #include "base/message_loop/message_loop_proxy.h"
9 #include "ppapi/shared_impl/proxy_lock.h"
10 #include "ppapi/shared_impl/tracked_callback.h"
15 ResourceReplyThreadRegistrar::ResourceReplyThreadRegistrar(
16 scoped_refptr
<base::MessageLoopProxy
> default_thread
)
17 : default_thread_(default_thread
) {
20 ResourceReplyThreadRegistrar::~ResourceReplyThreadRegistrar() {
23 void ResourceReplyThreadRegistrar::Register(
25 int32_t sequence_number
,
26 scoped_refptr
<TrackedCallback
> reply_thread_hint
) {
27 ProxyLock::AssertAcquiredDebugOnly();
29 // Use the default thread if |reply_thread_hint| is NULL or blocking.
30 if (!reply_thread_hint
.get() || reply_thread_hint
->is_blocking())
33 DCHECK(reply_thread_hint
->target_loop());
34 scoped_refptr
<base::MessageLoopProxy
> reply_thread(
35 reply_thread_hint
->target_loop()->GetMessageLoopProxy());
37 base::AutoLock
auto_lock(lock_
);
39 if (reply_thread
.get() == default_thread_
.get())
42 map_
[resource
][sequence_number
] = reply_thread
;
46 void ResourceReplyThreadRegistrar::Unregister(PP_Resource resource
) {
47 base::AutoLock
auto_lock(lock_
);
51 scoped_refptr
<base::MessageLoopProxy
>
52 ResourceReplyThreadRegistrar::GetTargetThreadAndUnregister(
54 int32_t sequence_number
) {
55 base::AutoLock
auto_lock(lock_
);
56 ResourceMap::iterator resource_iter
= map_
.find(resource
);
57 if (resource_iter
== map_
.end())
58 return default_thread_
;
60 SequenceNumberMap::iterator sequence_number_iter
=
61 resource_iter
->second
.find(sequence_number
);
62 if (sequence_number_iter
== resource_iter
->second
.end())
63 return default_thread_
;
65 scoped_refptr
<base::MessageLoopProxy
> target
= sequence_number_iter
->second
;
66 resource_iter
->second
.erase(sequence_number_iter
);