Chromium Code Reviews| Index: ppapi/proxy/plugin_main_nacl.cc |
| diff --git a/ppapi/proxy/plugin_main_nacl.cc b/ppapi/proxy/plugin_main_nacl.cc |
| index f050778227cad4eef35c4f1c26f59fe1a6ccbcbe..46c988a80f3114594b1759c1890add14e32eba22 100644 |
| --- a/ppapi/proxy/plugin_main_nacl.cc |
| +++ b/ppapi/proxy/plugin_main_nacl.cc |
| @@ -12,6 +12,7 @@ |
| // ViewMsgLog et al. functions. |
| #include "base/command_line.h" |
| +#include "base/debug/trace_event.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/threading/thread.h" |
| @@ -28,6 +29,7 @@ |
| #include "ppapi/proxy/plugin_globals.h" |
| #include "ppapi/proxy/plugin_proxy_delegate.h" |
| #include "ppapi/shared_impl/ppb_audio_shared.h" |
| +#include "ppapi/shared_impl/proxy_lock.h" |
| #if defined(IPC_MESSAGE_LOG_ENABLED) |
| #include "base/containers/hash_tables.h" |
| @@ -53,6 +55,12 @@ using ppapi::proxy::SerializedHandle; |
| namespace { |
| +// Interval to check if plugin has been active and report to the browser |
| +// process. The value is somewhat arbitrary. It should be large enough to |
| +// minimize computation overhead and small enough to not add exessive latency |
| +// to detecting idle processes. |
| +const int kIdleCheckIntervalInSeconds = 5; |
| + |
| // This class manages communication between the plugin and the browser, and |
| // manages the PluginDispatcher instances for communication between the plugin |
| // and the renderer. |
| @@ -257,6 +265,24 @@ void PpapiDispatcher::OnPluginDispatcherMessageReceived( |
| dispatcher->second->OnMessageReceived(msg); |
| } |
| +void CheckActivity(bool last_was_active) { |
|
Mark Seaborn
2013/11/15 23:51:24
It looks like this will make every NaCl process wa
scheib
2013/12/11 21:35:40
Done by having the plugin only report when it is a
|
| + ppapi::ProxyAutoLock lock; |
| + if (!PluginGlobals::Get()) |
| + return; |
| + |
| + bool was_active = PluginGlobals::Get()->plugin_has_been_active(); |
| + PluginGlobals::Get()->set_plugin_has_been_active(false); |
| + |
| + if (last_was_active != was_active) { |
| + PluginGlobals::Get()->GetBrowserSender()->Send( |
| + new PpapiHostMsg_IdleStateChange(!was_active)); |
| + } |
| + |
| + base::MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| + base::Bind(&CheckActivity, was_active), |
| + base::TimeDelta::FromSeconds(kIdleCheckIntervalInSeconds)); |
| +} |
| + |
| } // namespace |
| void PpapiPluginRegisterThreadCreator( |
| @@ -289,6 +315,9 @@ int PpapiPluginMain() { |
| PpapiDispatcher ppapi_dispatcher(io_thread.message_loop_proxy()); |
| plugin_globals.set_plugin_proxy_delegate(&ppapi_dispatcher); |
| + base::MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| + base::Bind(&CheckActivity, false), |
| + base::TimeDelta::FromSeconds(kIdleCheckIntervalInSeconds)); |
| loop.Run(); |
| return 0; |