Группа :: Сети/WWW
Пакет: nspluginwrapper
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: nspluginwrapper-1.4.4-restart.patch
Скачать
Скачать
diff -up nspluginwrapper-1.4.4/src/npw-wrapper.c.restart nspluginwrapper-1.4.4/src/npw-wrapper.c
--- nspluginwrapper-1.4.4/src/npw-wrapper.c.restart 2011-07-01 05:18:57.000000000 +0200
+++ nspluginwrapper-1.4.4/src/npw-wrapper.c 2012-07-18 15:49:11.329877655 +0200
@@ -115,6 +115,7 @@ static void plugin_exit(void);
static void plugin_kill_cb(rpc_connection_t *connection, void *user_data);
static NPError plugin_start(void);
static NPError plugin_start_if_needed(void);
+static void plugin_kill(void);
static int plugin_killed = 0;
/*
@@ -2104,31 +2105,44 @@ g_NPP_New(NPMIMEType mime_type, NPP inst
uint16_t mode, int16_t argc, char *argn[], char *argv[],
NPSavedData *saved)
{
+ NPError ret;
+ int attempt = 1;
+
if (instance == NULL)
return NPERR_INVALID_INSTANCE_ERROR;
-
- // Check if we need to restart the plug-in
- NPError ret = plugin_start_if_needed();
- if (ret != NPERR_NO_ERROR)
- return ret;
- PluginInstance *plugin = npw_plugin_instance_new(&PluginInstanceClass);
- if (plugin == NULL)
- return NPERR_OUT_OF_MEMORY_ERROR;
- plugin->instance = instance;
- plugin->instance_id = id_create(plugin);
- plugin->connection = rpc_connection_ref(g_rpc_connection);
- instance->pdata = plugin;
+ do {
+ // Check if we need to restart the plug-in
+ NPError ret = plugin_start_if_needed();
+ if (ret != NPERR_NO_ERROR)
+ return ret;
+
+ PluginInstance *plugin = npw_plugin_instance_new(&PluginInstanceClass);
+ if (plugin == NULL)
+ return NPERR_OUT_OF_MEMORY_ERROR;
+ plugin->instance = instance;
+ plugin->instance_id = id_create(plugin);
+ plugin->connection = rpc_connection_ref(g_rpc_connection);
+ instance->pdata = plugin;
+
+ if (PLUGIN_DIRECT_EXEC) {
+ if ((plugin->native_instance = NPW_MemNew0(NPP_t, 1)) == NULL)
+ return NPERR_OUT_OF_MEMORY_ERROR;
+ plugin->native_instance->ndata = instance->ndata;
+ }
+
+ D(bugiI("NPP_New instance=%p\n", instance));
+ ret = invoke_NPP_New(plugin, mime_type, mode, argc, argn, argv, saved);
+ D(bugiD("NPP_New return: %d [%s]\n", ret, string_of_NPError(ret)));
+
+ // NPP_New was succesfull or we exhausted all our restart attempts
+ if(!ret || attempt == 0)
+ break;
- if (PLUGIN_DIRECT_EXEC) {
- if ((plugin->native_instance = NPW_MemNew0(NPP_t, 1)) == NULL)
- return NPERR_OUT_OF_MEMORY_ERROR;
- plugin->native_instance->ndata = instance->ndata;
- }
-
- D(bugiI("NPP_New instance=%p\n", instance));
- ret = invoke_NPP_New(plugin, mime_type, mode, argc, argn, argv, saved);
- D(bugiD("NPP_New return: %d [%s]\n", ret, string_of_NPError(ret)));
+ // kill the plugin
+ plugin_kill();
+ attempt--;
+ } while(1);
if (saved) {
if (saved->buf)