Open Bug 364582 Opened 18 years ago Updated 3 years ago

process observer missing

Categories

(NSPR :: NSPR, enhancement)

x86
Linux
enhancement

Tracking

(Not tracked)

People

(Reporter: danny_milo, Unassigned)

Details

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Build Identifier: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9 Hi, Reading http://www.mozilla.org/projects/nspr/reference/html/prprocess.html I see the following is possible: - create process - wait synchronously until process is done (signaled) - detaching process so it will be auto-reaped and not become a zombie But there is no function that allows "waiting" *asynchronous* until a process is done (signaled), although on UNIX that seems like the obvious thing to do: start some tool, connect some observer that will be notified when tool is done. In the observer, do something else (upload, whatever). Reproducible: Always Steps to Reproduce: 1. CreateProcess 2. Want to get notified when process terminated 3. bummer Expected Results: 1. CreateProcess 2. Call function get notified when process terminated, like PR_SetProcessStateCallback(void (*callback)(NSProcess, pid, exit_code_if_any, signal_number)) Currently I'm working around that by using a native UNIX component that just uses fork()/exec()/waitpid(), completely bypassing NSPR. Obviously it would be nicer if NSPR itself either supported said behaviour or alternatively at least enable such a thing to be added without introducing funny process management races.
Thank you for the suggestion. I stopped adding new functions to the PRProcess API because their implementation on Unix often requires a signal handler for the SIGCHLD signal, and in some situations it is impossible for NSPR to own the SIGCHLD handler for the process. (A signal handler is a process property.) It seems that the feature you suggested would require an NSPR internal thread to call the process-state callback function, because Unix has serious restrictions on the functions you can call from a signal handler. You can only call the so-called async-signal-safe functions from a signal handler. Almost all of the async-signal-safe functions are system calls. So the SIGCHLD signal handler would need to arrange for some other internal thread to call the process-state callback function. In your implementation, are you using a thread to call the process-state callback functions?
Severity: normal → enhancement
Status: UNCONFIRMED → NEW
Ever confirmed: true
Hi, > It seems that the feature you suggested would require an NSPR internal thread like in WaitPidDaemonThread when it is reaping the process > to call the process-state callback function, > because Unix has serious restrictions on the functions you can call from a signal handler. For example glib avoids that issue by adding an event to the event queue (which is thread safe, adding to a in-memory locked list, via g_idle_add). As mozilla is event based as well, I don't see an obvious problem with that (although NSPR would need to have _access_ to the event queue, which it probably doesn't have yet) > You can only call the so-called async-signal-safe functions from a signal handler. Well, I don't care about *really really immediate* notification of a child termination. Queueing it as an event and having mozilla process it when it's bored is OK. > Almost all of the async-signal-safe functions are system calls. > So the SIGCHLD signal handler would need to arrange for some other internal thread to call the process-state callback function. I guess that would work, too. > In your implementation, are you using a thread to call the process-state callback functions? In my implemenation, I poll waitpid() every few seconds (yeah yeah, bad me :)), from javascript, no less :) But as I said, the nicest way I can see would to get an "some process terminated" event into the mainloop event queue and be over with... (Note that I have only a passing understanding of mozilla and nspr overall architecture)
any news?
I also need this functionality for an extension which launches bzip2 to decompress very large archives of wikipedia database dumps. I need notification when it is finished so I can go on to the next step. Another approach would be if there was a way to get a handle to the underlying OS specific process so I could at least poll to see if it still exists. The pid returned by nsIProcess.run() seems to be of no use on Win32.

The bug assignee is inactive on Bugzilla, so the assignee is being reset.

Assignee: wtc → nobody
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.