[RFC] Single threaded JSRuntime in Firefox 10
Deepak Bhole
dbhole at redhat.com
Thu Feb 16 14:57:46 PST 2012
* Deepak Bhole <dbhole at redhat.com> [2012-02-16 14:53]:
> * Thomas Meyer <thomas at m3y3r.de> [2012-02-03 20:20]:
> > Hello,
> >
> > please have a look at this first patch that fixes the sendMember() and
> > eval() methods for firefox 10:
> >
>
> Hi Thomas,
>
> I don't think these will actually fix the issue. The issue is
> intermittent, so your fixes are probably just reducing the frequency.
>
> The problem is the use of the browser_function.* functions from non-JS
> threads.
>
> I am working on a patch to resolve it. However your patch is still a
> good re-factor and I think it would make a good addition on top :)
>
> I'll reply back after I've posted the fix.
>
Sorry, scratch that. Looking at your fixes closer, I see you have moved
the browser calls to the functions that are guaranteed to execute on
main JS engine thread.
I will take a look at this first thing tomorrow and fix up anything left
by patch 1 and 2.
Thanks!
Deepak
> Thanks,
> Deepak
>
> > # HG changeset patch
> > # User thomas
> > # Date 1328317526 -3600
> > # Node ID 6962b636cfdaeef1efa884bcd2207a1360baa978
> > # Parent 528e354ff46919a758c8977978053fbb816ffebc
> > Fix eval() and sendMember() for the new single thread JSRuntime in Firefox 10. See also:
> > - https://bugzilla.mozilla.org/show_bug.cgi?id=704249
> > - http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=820
> > - http://groups.google.com/group/mozilla.dev.tech.js-engine/msg/ae5f22f39e4fd150
> >
> > diff -r 528e354ff469 -r 6962b636cfda plugin/icedteanp/IcedTeaPluginRequestProcessor.cc
> > --- a/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Thu Feb 02 16:15:27 2012 -0500
> > +++ b/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc Sat Feb 04 02:05:26 2012 +0100
> > @@ -241,19 +241,9 @@
> >
> > IcedTeaPluginUtilities::callAndWaitForResult(instance, &_eval, &thread_data);
> >
> > - NPVariant* result_variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
> > - std::string result_variant_jniid = std::string();
> > - if (result_variant)
> > - {
> > - createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid);
> > - } else
> > - {
> > - result_variant_jniid = "0";
> > - }
> > -
> > IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
> > response += " JavaScriptEval ";
> > - response += result_variant_jniid;
> > + response += thread_data.result;
> >
> > plugin_to_java_bus->post(response.c_str());
> > }
> > @@ -522,7 +512,7 @@
> > /** Request data from Java if necessary **/
> > if (*(message_parts->at(4)) == "GetSlot")
> > {
> > - member_identifier = browser_functions.getintidentifier(atoi(member_id.c_str()));
> > + //member_id = ;
> > } else
> > {
> > // make a new request for getString, to get the name of the identifier
> > @@ -535,7 +525,7 @@
> > //goto cleanup;
> > }
> >
> > - member_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str());
> > + member_id = *java_result->return_string;
> > }
> >
> > AsyncCallThreadData thread_data = AsyncCallThreadData();
> > @@ -551,16 +541,10 @@
> >
> > thread_data.parameters.push_back(instance);
> > thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*parent_ptr));
> > - thread_data.parameters.push_back(&member_identifier);
> > + thread_data.parameters.push_back(&member_id);
> >
> > IcedTeaPluginUtilities::callAndWaitForResult(instance, &_getMember, &thread_data);
> >
> > - PLUGIN_DEBUG("Member PTR after internal request: %s\n", thread_data.result.c_str());
> > -
> > - member_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
> > -
> > - createJavaObjectFromVariant(instance, *member_ptr, &result_id);
> > -
> > IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
> > if (*(message_parts->at(4)) == "GetSlot")
> > {
> > @@ -568,7 +552,7 @@
> > } else {
> > response.append(" JavaScriptGetMember ");
> > }
> > - response.append(result_id.c_str());
> > + response.append(thread_data.result);
> > plugin_to_java_bus->post(response.c_str());
> > }
> >
> > @@ -797,23 +781,27 @@
> >
> > instance = (NPP) parameters.at(0);
> > parent_ptr = (NPObject*) parameters.at(1);
> > - NPIdentifier* member_identifier = (NPIdentifier*) parameters.at(2);
> > + std::string* member_id = (std::string*) parameters.at(2);
> > + NPIdentifier member_identifier;
> > +
> > + member_identifier = browser_functions.getintidentifier(atoi(member_id->c_str()));
> >
> > // Get the NPVariant corresponding to this member
> > - PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(*member_identifier));
> > + PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(member_identifier));
> >
> > - if (!browser_functions.hasproperty(instance, parent_ptr, *member_identifier))
> > + if (!browser_functions.hasproperty(instance, parent_ptr, member_identifier))
> > {
> > - printf("%s not found!\n", browser_functions.utf8fromidentifier(*member_identifier));
> > + printf("%s not found!\n", browser_functions.utf8fromidentifier(member_identifier));
> > }
> > - ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, *member_identifier, member_ptr);
> > + ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, member_identifier, member_ptr);
> >
> > IcedTeaPluginUtilities::printNPVariant(*member_ptr);
> >
> > if (((AsyncCallThreadData*) data)->call_successful)
> > {
> > - IcedTeaPluginUtilities::JSIDToString(member_ptr, &member_ptr_str);
> > + createJavaObjectFromVariant(instance, *member_ptr, &member_ptr_str);
> > ((AsyncCallThreadData*) data)->result.append(member_ptr_str);
> > +
> > }
> > ((AsyncCallThreadData*) data)->result_ready = true;
> >
> > @@ -831,8 +819,8 @@
> > std::string* script_str;
> > NPIdentifier script_identifier;
> > NPString script = NPString();
> > - NPVariant* eval_result = new NPVariant();
> > - std::string eval_result_ptr_str = std::string();
> > + NPVariant* eval_variant = new NPVariant();
> > + std::string eval_variant_str = std::string();
> >
> > PLUGIN_DEBUG("_eval called\n");
> >
> > @@ -854,13 +842,19 @@
> > PLUGIN_DEBUG("Evaluating: %s\n", script.UTF8Characters);
> > #endif
> >
> > - ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_result);
> > - IcedTeaPluginUtilities::printNPVariant(*eval_result);
> > + ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_variant);
> > + IcedTeaPluginUtilities::printNPVariant(*eval_variant);
> >
> > if (((AsyncCallThreadData*) data)->call_successful)
> > {
> > - IcedTeaPluginUtilities::JSIDToString(eval_result, &eval_result_ptr_str);
> > - ((AsyncCallThreadData*) data)->result.append(eval_result_ptr_str);
> > + if (eval_variant)
> > + {
> > + createJavaObjectFromVariant(instance, *eval_variant, &eval_variant_str);
> > + } else
> > + {
> > + eval_variant_str = "0";
> > + }
> > + ((AsyncCallThreadData*) data)->result.append(eval_variant_str);
> > }
> > ((AsyncCallThreadData*) data)->result_ready = true;
> >
> >
> >
More information about the distro-pkg-dev
mailing list