Date: Fri, 22 Jan 1999 08:30:21 -0600 From: "Richard Seaman, Jr." <dick@tar.com> To: "Russell L. Carter" <rcarter@pinyon.org> Cc: freebsd-current@FreeBSD.ORG Subject: Re: Using LinuxThreads Message-ID: <19990122083021.E5495@tar.com> In-Reply-To: <199901220239.TAA06788@psf.Pinyon.ORG>; from Russell L. Carter on Thu, Jan 21, 1999 at 07:39:28PM -0700 References: <199901220239.TAA06788@psf.Pinyon.ORG>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 21, 1999 at 07:39:28PM -0700, Russell L. Carter wrote: > dick@tar.com said: > %libc_r could be modified so that is doesn't replace libc, but rather > %is an addon, comparable to the kernel threaded libc case. But, it > %would involve a bit of work. > > I thought so at first, but then I had to look at wait4 today and > now I'm not so sure. At least some of libc_r is very closely > tied to the uthread scheduler: Sure it is. But, I don't see why that prevents the possibility of leaving libc in place and having libc_r just be an add on (not that I'm advocating this). Taking your example, in libc the syscall is implemented as _wait4, and wait4 is a weak alias to _wait4. If you replaced _thread_sys_wait4 below with _wait4 instead, and put the resulting code in a library separate from libc (eg. in a "new" libc_r) along with the uthread scheduling code and the rest of the uthread pthread code, you could leave libc alone. Then, when you linked with libc and libc_r together, the wait4 in libc_r would override the weak aliased wait4 in libc. If you didn't link with libc_r, you'd have your plain old wait4. The bigger problem is that the uthread code needs "two layer" aliasing in order to implement pthread cancellation. > pid_t > wait4(pid_t pid, int *istat, int options, struct rusage * rusage) > { > pid_t ret; > > /* Perform a non-blocking wait4 syscall: */ > while ((ret = _thread_sys_wait4(pid, istat, options | WNOHANG, > rusage)) == 0 && (options & WNOHANG) == 0) { > /* Reset the interrupted operation flag: */ > _thread_run->interrupted = 0; > > /* Schedule the next thread while this one waits: */ > _thread_kern_sched_state(PS_WAIT_WAIT, __FILE__, __LINE__); > > /* Check if this call was interrupted by a signal: */ > if (_thread_run->interrupted) { > errno = EINTR; > ret = -1; > break; > } > } > return (ret); > } > #endif -- Richard Seamman, Jr. email: dick@tar.com 5182 N. Maple Lane phone: 414-367-5450 Chenequa WI 53058 fax: 414-367-5852 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990122083021.E5495>