Closed Bug 1165776 Opened 9 years ago Closed 6 years ago

Support "run in new thread" for dhcpRequest in NetworkWorker

Categories

(Firefox OS Graveyard :: General, defect)

ARM
Gonk (Firefox OS)
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED WONTFIX

People

(Reporter: hchang, Unassigned)

References

Details

Attachments

(1 file, 1 obsolete file)

Current nsINetworkService functions will be executed in one worker thread.
For some long waiting time commands like dhcpRequest, we should add the 
capability like 'run in new thread' to those ones.
Blocks: 1000040
Assignee: nobody → hchang
Attached patch Bug1165776.patch (obsolete) — Splinter Review
Comment on attachment 8606825 [details] [diff] [review]
Bug1165776.patch

Hi Fabrice, 

Could you please help review this patch? It spins a new thread to
run the function "dhcp_request" which may take a long time. For now
there is only one command which would tag with 'runInNewThread' so
that I spawn a new thread for each request. When things become more
complicated in the future, I'd like to use a thread pool to reduce
thread creation overhead. But for now, I just make things as simple
as possible. 

Thanks!
Attachment #8606825 - Flags: review?(fabrice)
Comment on attachment 8606825 [details] [diff] [review]
Bug1165776.patch

Review of attachment 8606825 [details] [diff] [review]:
-----------------------------------------------------------------

Looks fine for now, but please file the followup to use a thread pool.

::: dom/webidl/NetworkOptions.webidl
@@ +55,5 @@
>    long gateway_long;                  // for "ifc_configure".
>    long dns1_long;                     // for "ifc_configure".
>    long dns2_long;                     // for "ifc_configure".
> +
> +  boolean runInNewThread = false;

please add a comment.
Attachment #8606825 - Flags: review?(fabrice) → review+
(In reply to Fabrice Desré [:fabrice] from comment #3)
> Comment on attachment 8606825 [details] [diff] [review]
> Bug1165776.patch
> 
> Review of attachment 8606825 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> Looks fine for now, but please file the followup to use a thread pool.
> 
> ::: dom/webidl/NetworkOptions.webidl
> @@ +55,5 @@
> >    long gateway_long;                  // for "ifc_configure".
> >    long dns1_long;                     // for "ifc_configure".
> >    long dns2_long;                     // for "ifc_configure".
> > +
> > +  boolean runInNewThread = false;
> 
> please add a comment.

Thanks Fabrice! I'll file a followup bug to track.
Attachment #8606825 - Attachment is obsolete: true
Attachment #8607295 - Flags: review+
Keywords: checkin-needed
Blocks: 1166212
webidl changes need DOM peer review
Keywords: checkin-needed
Comment on attachment 8607295 [details] [diff] [review]
Bug1165776 v2 (carry r+ from Fabrice's review)

Hi Blake,

Could you please have a webidl change review? It's only for internal use
and we add a flag to control if the command should be run in a new thread
or in the common worker thread.

Thanks!
Attachment #8607295 - Flags: review+ → review?(mrbkap)
Comment on attachment 8607295 [details] [diff] [review]
Bug1165776 v2 (carry r+ from Fabrice's review)

Review of attachment 8607295 [details] [diff] [review]:
-----------------------------------------------------------------

::: dom/system/gonk/NetworkWorker.cpp
@@ +213,5 @@
> +  if (NetworkParams.mRunInNewThread) {
> +    // TODO: Bug 1166131 - Use a thread pool to process commands
> +    //       tagged with 'runInNewThread'.
> +    nsCOMPtr<nsIThread> thread;
> +    NS_NewThread(getter_AddRefs(thread), runnable);

This leaks the new thread. All threads must have nsIThread::Shutdown called on them. If we limit the new thread to DHCP only, we could simply create the new thread in NetworkWorker::Start and shut it down in NetworkWorker::Shutdown and not have to worry about thread pools.

Also, please use NS_NewNamedThread so we can more easily identify it in debuggers and memory reporters.

::: dom/webidl/NetworkOptions.webidl
@@ +60,5 @@
> +  // thread. However, for some native commands like 'dhcp_request' which
> +  // may block the worker thread for a long time. The caller can set
> +  // this flag to specifiy the internal to run this command in a separate
> +  // thread.
> +  boolean runInNewThread = false;

How general is this mechanism going to be? DHCP should definitely be on its own thread, but it seems like it'd be easier to simply switch on the command name and use a different thread for dhcpRequest instead of having a generic switch to run on a new thread.

If you really don't like that, I'd be OK keeping this. I want to make sure, though.
Attachment #8607295 - Flags: review?(mrbkap) → review-
Hi Blake,

Sorry for late response and thanks for your review.

(In reply to Blake Kaplan (:mrbkap) (please use needinfo!) from comment #9)
> Comment on attachment 8607295 [details] [diff] [review]
> Bug1165776 v2 (carry r+ from Fabrice's review)
> 
> Review of attachment 8607295 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> ::: dom/system/gonk/NetworkWorker.cpp
> @@ +213,5 @@
> > +  if (NetworkParams.mRunInNewThread) {
> > +    // TODO: Bug 1166131 - Use a thread pool to process commands
> > +    //       tagged with 'runInNewThread'.
> > +    nsCOMPtr<nsIThread> thread;
> > +    NS_NewThread(getter_AddRefs(thread), runnable);
> 
> This leaks the new thread. All threads must have nsIThread::Shutdown called
> on them. If we limit the new thread to DHCP only, we could simply create the
> new thread in NetworkWorker::Start and shut it down in
> NetworkWorker::Shutdown and not have to worry about thread pools.
> 

I was also worried about the leak until finding out a couple of places doing the 
same things like [1]. But after digging a little bit more, |Shutdown| is 
required to call to release the resource as you said.

[1] http://hg.mozilla.org/mozilla-central/file/b0a507af2b4a/toolkit/identity/IdentityCryptoService.cpp#l332

> Also, please use NS_NewNamedThread so we can more easily identify it in
> debuggers and memory reporters.
> 
> ::: dom/webidl/NetworkOptions.webidl
> @@ +60,5 @@
> > +  // thread. However, for some native commands like 'dhcp_request' which
> > +  // may block the worker thread for a long time. The caller can set
> > +  // this flag to specifiy the internal to run this command in a separate
> > +  // thread.
> > +  boolean runInNewThread = false;
> 
> How general is this mechanism going to be? DHCP should definitely be on its
> own thread, but it seems like it'd be easier to simply switch on the command
> name and use a different thread for dhcpRequest instead of having a generic
> switch to run on a new thread.
> 
> If you really don't like that, I'd be OK keeping this. I want to make sure,
> though.

I have no strong reason to keep this. So I am going to use the task name
to determine which thread to dispatch. There will be a function such as  
|NetworkUtils::ShouldRunOutOfWorkerThread| to be called by NetworkWorker.

Thanks!
No longer working on this.
Assignee: hchang → nobody
Status: NEW → UNCONFIRMED
Ever confirmed: false
Firefox OS is not being worked on
Status: UNCONFIRMED → RESOLVED
Closed: 6 years ago
Resolution: --- → WONTFIX
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: