Fwd: [openbeos] Re: [Haiku-commits] Recursive processing of BLooper messages
Michael Pfeiffer <[email protected]> Sat, 3 Feb 2007 15:58:34 +0100
| Newsgroups | gmane.os.openbeos.printing |
|---|---|
| Message-ID | <[email protected]> |
Anfang der weitergeleiteten E-Mail: > Von: Ingo Weinhold <bonefish-CFLBMwTPW48UNGrzBIF7/[email protected]> > Datum: 03. Februar 2007 15:06:46 GMT+01:00 > An: [email protected] > Kopie: [email protected] > Betreff: [openbeos] Re: [Haiku-commits] Recursive processing of > BLooper messages > Antwort an: [email protected] > > > On 2007-02-03 at 13:00:53 [+0100], Michael Pfeiffer > <[email protected]> wrote: >> >> I do not know how to solve the following problem: >> >> In BeOS R5 you can call BPrintJob.ConfigPage() inside a BLooper hook >> method and although the method ConfigPage() did not return yet, the >> calling BLooper still is processing messages sent to it. >> >> In the Haiku implementation of ConfigPage(). A synchronous message is >> sent to the print_server, the print_server then opens the dialog and >> when the dialog is closed it sends a response. ConfigPage() handles >> the response message and returns. Of course this blocks the calling >> thread. >> >> In case the calling thread is a BLooper thread. My idea is to do the >> communication with the print_server in a separate thread. In the >> meantime ConfigPage() keeps processing the messages sent to the >> BLooper until the spawned thread terminates. >> >> What are your thoughts? How can the nested processing of messages be >> accomplished? Are there other ways to do that? > > I had a look at the always handy R5 libbe objdump: > BPrintJob::ConfigPage() > itself doesn't seem to do anything suspicious (e.g. some BMessage > access > methods), but it calls three other functions: > > * do_async_print_panel(): Creates and runs an asynchronous BAlert. > Creates > a semaphore and spawns and resumes a thread. Furthermore there're > invocations of BLooper::LooperForThread(long), dynamic_cast<>(), > BWindow::UpdateIfNeeded(), and acquire_sem_etc(). The spawned thread > executes async_print_panel_hook(), which constructs a BMessenger > (signature > version), creates and runs a synchronous alert, sends a synchronous > message, and invokes delete_sem(). > > * BPrintJob::GetCurrentPrinterName(void): Constructs a BMessenger > (signature version) and sends a synchronous message. There's a bit of > BMessage access, too, but that's it. Nothing asynchronous. > > * BPrintJob::HandlePageSetup(): Apparently just analyzes the supplied > BMessage. > > I haven't gone through the pain of analyzing the control flow -- so > not all > of the stuff listed above might always be executed -- but it looks > like > things pretty much happen as you had in mind: At least some > synchronous > messaging is done in a separate thread, while the original thread > seems to > check whether it belongs to a BWindow and calls > BWindow::UpdateIfNeeded() > (probably in a loop), the threads being synchronized via a > semaphore. You > probably know best what the BAlerts are for. > >> PS: Cross-posting to get more attention. Please reply to open-beos- >> [email protected] if possible. > > I'm not subscribed to the printing team list, since I'm not that much > interrested in that area, so I'm replying on the commit list again, > cross-posting to the main list, which, I believe, is a more appropiate > place. > > CU, Ingo > >