bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gnulib: cond & spinlocks


From: Bruno Haible
Subject: Re: gnulib: cond & spinlocks
Date: Tue, 18 Nov 2008 01:52:59 +0100
User-agent: KMail/1.5.4

Vladimir, Sam,

> >> I plan to create the thread2 branch after I switch to gnulib
> >> threadlib/lock/cond to get solaris and win32 "for free".

As I wrote to Sam on 2008-08-17 in private mail: For clisp, I would attempt
to stay with the POSIX threads API, rather than using gnulib's wrapper
modules. Why?
  - gnulib's modules are targeted at the average application programmer,
    whereas clisp is more at the system programming level.
  - The POSIX threads API is better documented than gnulib's wrapper modules.
  - For the platforms that are interesting for clisp (Linux, *BSD, MacOS X,
    Solaris, Windows), POSIX threads are either well supported or emulated
    using the pthreads-win32 package.
  - You want additionally spinlocks, which POSIX has
    (<http://www.opengroup.org/susv3/functions/pthread_spin_init.html>) but
    gnulib does not yet have.

The only advantages of gnulib's modules in this case are
  - A more systematic naming convention of the functions,
  - Portability to older OSes, like Solaris 7, Tru64, and similar.

Like with the execute/pipe modules and posix_spawn, also here with the threads
I think the way to go is to separate the gnulib functionality into
  1. an emulation the POSIX API,
  2. a convenience API layer on top of the POSIX API.

> would it be possible to make gnulib cond allocate on stack?

You mean, the gl_cond_t variable should be allocated on the stack? It is
already possible. But note that the extent of such a variable must encompass
the lifetime of the threads that use it; that's why it is usually allocated
with indefinite extent.

> would it be possible to use fast clisp spinlocks in gnulib lock?

That code is CPU dependent and relies on GCC's inline asms. It is certainly
better to use pthread_spin_* where available (and emulate them where not
available - but that might be hard if not assuming GCC).

Regarding clisp's xthread.d: The first thing I would do now is to ditch the
conditional code for POSIXOLD_THREADS, SOLARIS_THREADS, C_THREADS. You don't
need these APIs any more. And with pthreads-win32 you don't need WIN32_THREADS
either.

> > The xmutex_t should be recursive (for consistency - critical section  
> > on Win32 are recursive - and gnulib uses them as well).

Both POSIX and gnulib offer normal and recursive locks. You just choose
which one you need.

> > The cond implementation in gnulib uses malloc() while the current  
> > clisp implementation uses the stack.

There is a comment in gnulib/lib/glthread/cond.c that explains why here
malloc() is better than stack allocation.

> > I just looked on the gnulib and do not see "realy fast" spinlocks  
> > (may be I am wrong - have not looked too hard). In the current clisp  
> > spinlocks are inlined assembly instructions. Every heap allocation is  
> > guarded with a spinlock - so any overhead may cause significant  
> > decrease in performance.

Do you want to help implementing fast pthread_spin_* replacement functions
in gnulib? This would be a benefit for both clisp and gnulib:
  - clisp could use the pthread_spin_* functions from the OS when they are
    good enough or when the CPU is exotic,
  - gnulib would have fast pthread_spin_* functions.

Bruno





reply via email to

[Prev in Thread] Current Thread [Next in Thread]