[MacRuby-devel] experimental branch: status update
Laurent Sansonetti
lsansonetti at apple.com
Mon Jun 29 13:19:47 PDT 2009
Last week's status on the experimental branch work!
- It's now possible to build MacRuby with clang (assuming you
installed it) by issuing the following command:
$ rake use_clang=true miniruby
This will compile all C and Objective-C files with clang and C++ files
with llvm-g++. Apparently the build's product works as expected.
However, since clang is a moving target and since it does not support C
++ yet, this option is not enabled by default even if you have clang
in your system.
- Threads!
A first multi-threaded design for MacRuby was implemented. The idea
behind this design is to map a Thread object to a native POSIX thread
and make sure its related block will most always run in a concurrent
fashion.
In order to achieve this, we created a new class called Core, which is
a singleton object containing all the data structures that should be
shared across all threads. The Core object contains a lock that is
used every time a shared data structure is accessed. Shared data
structures are for example: LLVM caches, various stubs caches,
BridgeSupport caches, etc.
Everything else was moved to a VM class, which is completely lock-
free. A VM object is created at demand and only once for every thread
that wants to access the runtime. The VM object contains data
structures for the very specific thread execution, like for instance
current blocks, bindings, exceptions, etc. The VM sometimes calls the
Core (when defining a method for example) which acquires the Core
lock, but most of the time it just runs concurrently. All MacRuby
threads are scheduled by the OS kernel and registered into the
Objective-C garbage collector (which runs on its own threads) before
doing anything.
This implementation is not quite finished yet and will be polished in
the near future, but it's already very promising. It passes all the
RubySpec core/thread expectations and according to a few benchmarks we
can finally use multiple CPU cores. I was able to run some micro-
benchmark code (like fib(40), method dispatch loops, etc.) on 8
different Threads on a Mac Pro and MacRuby was using 800% of the
system (all 8 cores) vs only one in the case of Ruby 1.9.
Obviously since threads are concurrent it means the developer must
take this into account and use mutexes to secure access to a shared
object (local variable, instance variable, etc.), which is not
necessarily needed in Ruby 1.8 or 1.9 because threads don't run
concurrently.
Also, Thread#kill is supported but is really discouraged because it's
not deterministic.
I wrote for fun a simple web server on top of Foundation's run loop
that dispatches new HTTP requests to a pool of threads, to test a
little bit our implementation and see if it's stable. I stressed it
with ab(1) (Apache benchmarking tool) and it's quite good, there are
still 2-3 random bugs but I think I identified all of them. If you're
interested, the simple web server was committed in sample-macruby/
Scripts/web_server.rb.
That's all folks! Threads was really the last piece of functionality
missing in experimental vs trunk. Now it's time to converge and try to
fix all the remaining bugs.
Laurent
More information about the MacRuby-devel
mailing list