summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
authormarshall@chromium.org <marshall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-16 14:24:35 +0000
committermarshall@chromium.org <marshall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-16 14:24:35 +0000
commitce0afe43c8cfaef0d642f77a625ec63eca5b6a3d (patch)
treea2aba942f78ea19b92436fa5bc32c7ee3552a59c /webkit/glue
parent857693556e84098953c3a309168a4096ae6070c3 (diff)
downloadchromium_src-ce0afe43c8cfaef0d642f77a625ec63eca5b6a3d.zip
chromium_src-ce0afe43c8cfaef0d642f77a625ec63eca5b6a3d.tar.gz
chromium_src-ce0afe43c8cfaef0d642f77a625ec63eca5b6a3d.tar.bz2
Don't call NP_Shutdown in FreePluginLibraryTask if the library has already been reloaded.
BUG=63213 TEST=PluginTest.ForceReload Review URL: http://codereview.chromium.org/5020001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66269 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue')
-rw-r--r--webkit/glue/plugins/plugin_lib.cc27
1 files changed, 22 insertions, 5 deletions
diff --git a/webkit/glue/plugins/plugin_lib.cc b/webkit/glue/plugins/plugin_lib.cc
index ee613c1..292cd63 100644
--- a/webkit/glue/plugins/plugin_lib.cc
+++ b/webkit/glue/plugins/plugin_lib.cc
@@ -235,25 +235,41 @@ bool PluginLib::Load() {
// This class implements delayed NP_Shutdown and FreeLibrary on the plugin dll.
class FreePluginLibraryTask : public Task {
public:
- FreePluginLibraryTask(base::NativeLibrary library,
+ FreePluginLibraryTask(const FilePath& path,
+ base::NativeLibrary library,
NP_ShutdownFunc shutdown_func)
- : library_(library),
+ : path_(path),
+ library_(library),
NP_Shutdown_(shutdown_func) {
}
~FreePluginLibraryTask() {}
void Run() {
- if (NP_Shutdown_)
- NP_Shutdown_();
+ if (NP_Shutdown_) {
+ // Don't call NP_Shutdown if the library has been reloaded since this task
+ // was posted.
+ bool reloaded = false;
+ if (g_loaded_libs) {
+ for (size_t i = 0; i < g_loaded_libs->size(); ++i) {
+ if ((*g_loaded_libs)[i]->plugin_info().path == path_)
+ reloaded = true;
+ }
+ }
+ if (!reloaded)
+ NP_Shutdown_();
+ }
if (library_) {
+ // Always call base::UnloadNativeLibrary so that the system reference
+ // count is decremented.
base::UnloadNativeLibrary(library_);
library_ = NULL;
}
}
private:
+ FilePath path_;
base::NativeLibrary library_;
NP_ShutdownFunc NP_Shutdown_;
DISALLOW_COPY_AND_ASSIGN(FreePluginLibraryTask);
@@ -277,7 +293,8 @@ void PluginLib::Unload() {
if (defer_unload) {
FreePluginLibraryTask* free_library_task =
- new FreePluginLibraryTask(skip_unload_ ? NULL : library_,
+ new FreePluginLibraryTask(web_plugin_info_.path,
+ skip_unload_ ? NULL : library_,
entry_points_.np_shutdown);
LOG_IF(ERROR, PluginList::DebugPluginLoading())
<< "Scheduling delayed unload for plugin "