[192] in Pthreads mailing list archive

home help back first fref pref prev next nref lref last post

Re: pthreads

daemon@ATHENA.MIT.EDU (William S. Gribble)
Wed Nov 1 22:10:35 1995

From: "William S. Gribble" <grib@cs.utexas.edu>
Date: Wed, 1 Nov 1995 20:39:36 -0600
To: lord@cygnus.com
Cc: gel@cygnus.com, pthreads@MIT.EDU
In-Reply-To: <199511020217.SAA02409@beehive.cygnus.com> (message from Tom Lord on Wed, 1 Nov 1995 18:17:51 -0800)

You wrote:
> I suspect the problems you are having relate to a bad interaction
> between the multiple stacks maintained by pthreads, and the
> conservative sweep of the C stack during Guile's mark phase of GC.

I think you're right on the money.  The thing I put together was a 
5-minute hack to test a concept, and I'm impressed that it didn't crap out
any earlier :) 

> Another problem you are likely to encounter that is not GC related
> concerns what happens if two concurrent threads enter critical
> sections concurrently -- you lose.   For now, the simplest thing is to
> have Guile threads switch explictly and only during execution of
> ALLOW_INTS.

So if I hear you right, there are two independent issues: one, make
sure GC does the right thing with multiple stacks; two, make sure
there is critical section protection for multiple threads that
*doesn't* depend on signals being disallowed (since POSIX thread
signal semantics specify that a thread can't set the sigprocmask for
the whole process, just for itself).  By rewriting the GSCM_DEFER_INTS
and GSCM_ALLOW_INTS macros, this could be done easily with a mutex.
Making GC work with multiple thread stacks shouldn't be all that hard,
just a little hacking.  The important issue is how much do you want to
put Guile in bed with threads -- a configure-time option, or do you
distribute MIT pthreads (GPL'ed already, and builds on SunOS/Solaris/
Linux/NetBSD/HPUX and I think Irix) with guile and then assume that you
have the POSIX API already?  Hm. 

Here's the bit of code that I used to test threads with guile.  It's
trivial enough that I'm not including the whole kit.  The Scheme
function is (call-in-thread thunk) ; the gscm_define_procedure is left
out.  This depends on my PThread class, which is based on MIT
pthreads.  I'm appending an archive of that class and whatever other
junk was in its directory so you can see what the constructor is doing.

If you are interested in actually running something like this, you'll
need a couple of minor patches for pthreads, a minor patch for 
guile, and a semi-ugly hack to get tk to work, then rebuild all the 
guile libraries against the thread-safe stdio that pthreads provides.
I don't actually have the patches handy but I can remake them from
my sources tomorrow if you want.

Bill Gribble

------------

void
eval_guile_thunk(void * arg) {
  SCM * scm_thunk = (SCM *)arg;
  scm_apply(* scm_thunk, gscm_bool(false), gscm_bool(false));
}

extern "C" SCM 
call_in_thread(SCM thunk) {
  SCM * temp_arg = new SCM;
  *temp_arg = thunk;

  PThread * thread = new PThread("guile thunk", &eval_guile_thunk,
                                 temp_arg);
  thread->start();

  return gscm_bool(true);
}                                

------------

begin 664 threadlib.tar.gz
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
!`,,Z
`
end


home help back first fref pref prev next nref lref last post