Skip site navigation (1)Skip section navigation (2)
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>