Date: Fri, 8 Dec 1995 07:46:25 +1100 (EST) From: John Birrell <cimaxp1!jb@werple.net.au> To: lambert.org!terry@werple.net.au (Terry Lambert) Cc: hackers@FreeBSD.org, jb@cimlogic.com.au Subject: Re: _thread_init stub in libc (fwd) RFC Message-ID: <199512072042.HAA15327@werple.net.au> In-Reply-To: <199512071818.LAA05138@phaeton.artisoft.com> from "Terry Lambert" at Dec 7, 95 11:18:29 am
next in thread | previous in thread | raw e-mail | index | archive | help
> > > What is the call graph of allowable functions? > > > > Huh??? > > What do you have to call in what order, from first to last, to get the > thing to work, so we can pick something at the front of the list and > toenail it in there with: > > static int once = 0; > > if( !once) { > once = 1; > _thread_init(); > } Oh, I see what you mean. 8-). Other than _thread_init(), there are no other functions you _have_ to call. You just call the libc functions as you need them. Or the pthread_* functions for thread functionality. > > > We don't have a create_thread function. If you mean pthread_create, this is > > not called for the initial thread. The initialisation still has to be > > performed regardless of whether or not you create another thread. > > What about a non-threaded program? I can't avoid overhead in using a threaded library with a non-threaded program. We'll always have file and malloc locking. I don't think that it is practical to try to turn this on only when there is more than one thread. We're doing a libc_r.a so that non-threaded programs never have any of this. The only things (that I can think of now) that I want to see in libc are a stub for _thread_init() and a __error() function that returns a pointer to the global errno (and cerror.S changed to call __error). We're leaving the errno/__error bit until later. It's the _thread_init() stub we need now. > > I'm thinking to delay the "initial thread" until the first "pthread_create" > to create a second thread. This causes a problem because signal handling is done on a thread-by-thread basis. This is an area where our thread implementation differs from the MIT pthreads. We build the sigaction syscall as _thread_sys_sigaction(), for instance. In the threaded library we provide a sigaction() function which writes to fields in the thread structure. So if one of the first things that a programmer does is to set up signal handling in main(), then for the initial thread we have to at least call _thread_init() by then. I guess we could make the initial thread use a global structure, instead of the global pointer to a malloced thread structure. But then we have to check for initialisation in all the possible libc functions that the programmer *might* call. I'd like to avoid this. > > Terry Lambert > terry@lambert.org > --- > Any opinions in this posting are my own and not those of my present > or previous employers. > -- John Birrell CIMlogic Pty Ltd jb@cimlogic.com.au 119 Cecil Street Ph +61 3 9690 9600 South Melbourne Vic 3205 Fax +61 3 9690 6650 Australia Mob +61 18 353 137
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199512072042.HAA15327>