#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppb_message_loop_proxy.h"
#include "ppapi/proxy/resource_reply_thread_registrar.h"
+#include "ppapi/shared_impl/ppapi_constants.h"
#include "ppapi/shared_impl/proxy_lock.h"
#include "ppapi/thunk/enter.h"
-namespace {
-
-const int kKeepaliveThrottleIntervalDefault = 5000;
-
-} // namespace
-
namespace ppapi {
namespace proxy {
virtual ~BrowserSender() {}
// IPC::Sender implementation.
- virtual bool Send(IPC::Message* msg) OVERRIDE {
+ virtual bool Send(IPC::Message* msg) override {
if (msg->is_sync()) {
// Synchronous messages might be re-entrant, so we need to drop the lock.
ProxyAutoUnlock unlock;
new ResourceReplyThreadRegistrar(GetMainThreadMessageLoop())),
plugin_recently_active_(false),
keepalive_throttle_interval_milliseconds_(
- kKeepaliveThrottleIntervalDefault),
+ ppapi::kKeepaliveThrottleIntervalDefaultMilliseconds),
weak_factory_(this) {
DCHECK(!plugin_globals_);
plugin_globals_ = this;
new ResourceReplyThreadRegistrar(GetMainThreadMessageLoop())),
plugin_recently_active_(false),
keepalive_throttle_interval_milliseconds_(
- kKeepaliveThrottleIntervalDefault),
+ kKeepaliveThrottleIntervalDefaultMilliseconds),
weak_factory_(this) {
DCHECK(!plugin_globals_);
}
options.message_loop_type = base::MessageLoop::TYPE_IO;
file_thread_->StartWithOptions(options);
}
- return file_thread_->message_loop_proxy();
+ return file_thread_->message_loop_proxy().get();
}
void PluginGlobals::MarkPluginIsActive() {
if (!GetBrowserSender() || !base::MessageLoop::current())
return;
GetBrowserSender()->Send(new PpapiHostMsg_Keepalive());
-
- GetMainThreadMessageLoop()->PostDelayedTask(FROM_HERE,
+ DCHECK(keepalive_throttle_interval_milliseconds_);
+ GetMainThreadMessageLoop()->PostDelayedTask(
+ FROM_HERE,
RunWhileLocked(base::Bind(&PluginGlobals::OnReleaseKeepaliveThrottle,
weak_factory_.GetWeakPtr())),
base::TimeDelta::FromMilliseconds(
- keepalive_throttle_interval_milliseconds()));
+ keepalive_throttle_interval_milliseconds_));
}
}
IPC::Sender* PluginGlobals::GetBrowserSender() {
- if (!browser_sender_.get()) {
- browser_sender_.reset(
- new BrowserSender(plugin_proxy_delegate_->GetBrowserSender()));
- }
-
+ // CAUTION: This function is called without the ProxyLock. See also
+ // InterfaceList::GetInterfaceForPPB.
+ //
+ // See also SetPluginProxyDelegate. That initializes browser_sender_ before
+ // the plugin can start threads, and it may be cleared after the
+ // plugin has torn down threads. So this pointer is expected to remain valid
+ // during the lifetime of the plugin.
return browser_sender_.get();
}
connection, instance, desc, prefs);
}
-MessageLoopResource* PluginGlobals::loop_for_main_thread() {
- return loop_for_main_thread_.get();
+void PluginGlobals::SetPluginProxyDelegate(PluginProxyDelegate* delegate) {
+ DCHECK(delegate && !plugin_proxy_delegate_);
+ plugin_proxy_delegate_ = delegate;
+ browser_sender_.reset(
+ new BrowserSender(plugin_proxy_delegate_->GetBrowserSender()));
+}
+
+void PluginGlobals::ResetPluginProxyDelegate() {
+ DCHECK(plugin_proxy_delegate_);
+ plugin_proxy_delegate_ = NULL;
+ browser_sender_.reset();
}
-int PluginGlobals::keepalive_throttle_interval_milliseconds() const {
- return keepalive_throttle_interval_milliseconds_;
+MessageLoopResource* PluginGlobals::loop_for_main_thread() {
+ return loop_for_main_thread_.get();
}
-void PluginGlobals::set_keepalive_throttle_interval_milliseconds(int i) {
+void PluginGlobals::set_keepalive_throttle_interval_milliseconds(unsigned i) {
keepalive_throttle_interval_milliseconds_ = i;
}