[email protected] wrote: > > > > > -------- Original Message -------- > Subject: Re: Re : rt_printf with daemonized task (08-Okt-2009 12:16) > From: Jan Kiszka <[email protected]> > To: [email protected] > >> Gilles Chanteperdrix wrote: >>> Jan Kiszka wrote: >>>> Gilles Chanteperdrix wrote: >>>>> [email protected] wrote: >>>>>>>> int main( int arc, char *argv[] ) { int i; >>>>>>>> >>>>>>>> rt_print_auto_init(1); >>>>>>>> >>>>>>>> rt_printf("--------------- TEST RT-PRINTF 1 ------------\n"); >>>>>>>> >>>>>>>> sleep(1); >>>>>>>> >>>>>>>> daemon(0,0); >>>>>>>> >>>>>>>> rt_print_auto_init(1); >>>>>> Ok, understood, at least for the scenario where the rt_print feature >>>>>> is initialised befor the fork/daemon call. What I don't understand >>>>>> is, why it does not work if the rt_print feature is initialised after >>>>>> the fork / daemon. >>>>> From the way I understand your code, you never tried to initialize the >>>>> rt_print feature only after the fork, your code initializes it both >>>>> before and after. >>>>> >>>> There are two initializations: The base init done via __rt_print_init on >>>> library loading and the one to be done per-thread via rt_print_init (or >>>> on first rt_printf). That printer thread is initialized via the former >>>> one. On fork, we do not need to re-run the full __rt_print_init >>>> (variables and resources are cloned on fork), we just need to spawn >>>> another printer thread. >>> Unless I am wrong, rtdk also maintains a list of the thread buffers >>> which need to be polled. After the fork, this list will be intact, but >>> the threads to which belong the buffers will no longer exist. So, IMO, >>> the fork handler should also free all these buffers and reset the list >>> to the empty state. >> Famous last words: That should work without tweaking. A print_buffer >> only contains data references, nothing that points to some uncloned thread. >> >> Jan >> >> -- >> Siemens AG, Corporate Technology, CT SE 2 >> Corporate Competence Center Embedded Linux > > To have a fork save rtprint library it's necessary to > > 1. Reset rtdk thread buffer list > > I have no idea where to look at for the rtdk thread buffer list. Inside > rt_print.c ?
It's all there, it's called first_buffer. Just walk that list and call cleanup_buffers on the entries. > > 2. Spawning another printer thread > with code like : > pthread_attr_init(&thattr); > pthread_attr_setstacksize(&thattr, PTHREAD_STACK_MIN); > pthread_create(&__printer_thread, &thattr, printer_loop, NULL); > > > Is there anything else to do ? > Probably not, but I was already wrong before. :) > > I'm also planning to add a function to the lib like : > > rt_print_to_syslog( int priority ) Better provide some rt_syslog(int priority, char *format, ...), corresponding to the standard service. Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux _______________________________________________ Xenomai-help mailing list [email protected] https://mail.gna.org/listinfo/xenomai-help
