Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Dec 1998 00:13:05 +0200
From:      Jeremy Lea <reg@shale.csir.co.za>
To:        Richard Seaman <dick@tar.com>
Cc:        freebsd-current@FreeBSD.ORG
Subject:   Threads in WINE [was: linking against libc_r]
Message-ID:  <19981223001304.A319@shale.csir.co.za>
In-Reply-To: <19981221114939.A5500@tar.com>; from Richard Seaman on Mon, Dec 21, 1998 at 11:49:39AM -0600
References:  <Pine.BSF.4.05.9812210104430.479-100000@smarter.than.nu> <Pine.BSF.4.05.9812211024340.6331-100000@bright.fx.genx.net> <19981221093241.C546@tar.com> <19981221192734.E4060@shale.csir.co.za> <19981221114939.A5500@tar.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi,

On Mon, Dec 21, 1998 at 11:49:39AM -0600, Richard Seaman wrote:
> On Mon, Dec 21, 1998 at 07:27:35PM +0200, Jeremy Lea wrote:
> > 
> > Wine seems to want clone(), from a quick read of the man page.  Does the
> > native LinuxThreads stuff implement this as a FreeBSD syscall?
> 
> The FreeBSD "port" of Linux threads does not use nor implement a clone
> syscall.  It uses rfork instead within pthread_create to simulate
> the clone call.  If Wine calls "clone" directly, rather than via
> the phread_create call, it would be easy enough to implement a
> FreeBSD call, either in libc or as a syscall, that mimics clone.
> 
> Actually, there are already two "clone" calls within Linux Threads
> right now.  There is a wrapper "clone" call that wraps the clone
> syscall (see clone.S in the linux threads source).

Well, I finally got to looking at the source.  It uses clone() directly.  In
fact there is no mention of libpthread at all.  But there is the following
extract from wine-981211/include/threads.h:

---
#ifdef linux
#define HAVE_CLONE_SYSCALL
#endif

/* This is what we will use on *BSD, once threads using rfork() get
 * implemented:
 *
 * #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 * #define HAVE_RFORK
 * #endif
 */

#if (defined(HAVE_CLONE_SYSCALL) || defined(HAVE_RFORK)) && !defined(NO_REENTRANT_LIBC)
#define USE_THREADS
#endif
---

and from wine-981211/scheduler/sysdeps.c:

---
int SYSDEPS_SpawnThread( THDB *thread )
{
#ifdef USE_THREADS

#ifdef HAVE_CLONE_SYSCALL
    if (clone( (int (*)(void *))SYSDEPS_StartThread, thread->teb.stack_top,
               CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD, thread ) < 0)
        return -1;
    /* FIXME: close the child socket in the parent process */
/*    close( thread->socket );*/
#endif

#ifdef HAVE_RFORK
    FIXME(thread, "Threads using rfork() not implemented\n" );
#endif

#else  /* !USE_THREADS */
    FIXME(thread, "CreateThread: stub\n" );
#endif  /* USE_THREADS */
    return 0;
---

These are the only mentions for HAVE_CLONE_SYSCALL and HAVE_RFORK.  Does
this make your mind tick any?  The only other condition is a reentrant libc
it would seem...

Regards
 -Jeremy

-- 
  |   "I could be anything I wanted to, but one things true
--+--  Never gonna be as big as Jesus, never gonna hold the world in my hand
  |    Never gonna be as big as Jesus, never gonna build a promised land
  |    But that's, that's all right, OK with me..." -Audio Adrenaline

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?19981223001304.A319>