1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/thread: Make style fixes (mostly de-K&R'ism) to match the

rest of the source code.

* ext/thread: Make USE_MEM_POOLS an extconf option.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@11679 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
knu 2007-02-09 11:48:34 +00:00
parent fff0db9dfe
commit b28988b4f1
3 changed files with 570 additions and 752 deletions

View file

@ -1,3 +1,10 @@
Fri Feb 9 20:44:53 2007 Akinori MUSHA <knu@iDaemons.org>
* ext/thread: Make style fixes (mostly de-K&R'ism) to match the
rest of the source code.
* ext/thread: Make USE_MEM_POOLS an extconf option.
Fri Feb 9 20:43:01 2007 Akinori MUSHA <knu@iDaemons.org>
* ext/thread: Import the "fastthread" implementation by MenTaLguY

View file

@ -1,2 +1,7 @@
require 'mkmf'
if with_config('mem-pools', true)
$CPPFLAGS << ' -DUSE_MEM_POOLS'
end
create_makefile("thread")

View file

@ -13,16 +13,13 @@
#include <intern.h>
#include <rubysig.h>
#define USE_MEM_POOLS 1
static VALUE rb_cMutex;
static VALUE rb_cConditionVariable;
static VALUE rb_cQueue;
static VALUE rb_cSizedQueue;
static VALUE
return_value(value)
VALUE value;
return_value(VALUE value)
{
return value;
}
@ -39,11 +36,8 @@ typedef struct _List {
unsigned long size;
} List;
static void init_list _((List *));
static void
init_list(list)
List *list;
init_list(List *list)
{
list->entries = NULL;
list->last_entry = NULL;
@ -51,11 +45,8 @@ init_list(list)
list->size = 0;
}
static void mark_list _((List *));
static void
mark_list(list)
List *list;
mark_list(List *list)
{
Entry *entry;
for (entry = list->entries; entry; entry = entry->next) {
@ -63,11 +54,8 @@ mark_list(list)
}
}
static void free_entries _((Entry *));
static void
free_entries(first)
Entry *first;
free_entries(Entry *first)
{
Entry *next;
while (first) {
@ -77,22 +65,15 @@ free_entries(first)
}
}
static void finalize_list _((List *));
static void
finalize_list(list)
List *list;
finalize_list(List *list)
{
free_entries(list->entries);
free_entries(list->entry_pool);
}
static void push_list _((List *, VALUE));
static void
push_list(list, value)
List *list;
VALUE value;
push_list(List *list, VALUE value)
{
Entry *entry;
@ -116,13 +97,8 @@ push_list(list, value)
++list->size;
}
static void push_multiple_list _((List *, VALUE *, unsigned));
static void
push_multiple_list(list, values, count)
List *list;
VALUE *values;
unsigned count;
push_multiple_list(List *list, VALUE *values, unsigned count)
{
unsigned i;
for (i = 0; i < count; i++) {
@ -130,11 +106,8 @@ push_multiple_list(list, values, count)
}
}
static VALUE shift_list _((List *));
static VALUE
shift_list(list)
List *list;
shift_list(List *list)
{
Entry *entry;
VALUE value;
@ -150,40 +123,34 @@ shift_list(list)
--list->size;
value = entry->value;
if (USE_MEM_POOLS) {
#ifdef USE_MEM_POOLS
entry->next = list->entry_pool;
list->entry_pool = entry;
} else {
#else
free(entry);
}
#endif
return value;
}
static void clear_list _((List *));
static void
clear_list(list)
List *list;
clear_list(List *list)
{
if (list->last_entry) {
if (USE_MEM_POOLS) {
#ifdef USE_MEM_POOLS
list->last_entry->next = list->entry_pool;
list->entry_pool = list->entries;
} else {
#else
free_entries(list->entries);
}
#endif
list->entries = NULL;
list->last_entry = NULL;
list->size = 0;
}
}
static VALUE array_from_list _((List const *));
static VALUE
array_from_list(list)
List const *list;
array_from_list(List const *list)
{
VALUE ary;
Entry *entry;
@ -194,31 +161,22 @@ array_from_list(list)
return ary;
}
static VALUE wake_thread _((VALUE));
static VALUE
wake_thread(thread)
VALUE thread;
wake_thread(VALUE thread)
{
return rb_rescue2(rb_thread_wakeup, thread,
return_value, Qnil, rb_eThreadError, 0);
}
static VALUE run_thread _((VALUE));
static VALUE
run_thread(thread)
VALUE thread;
run_thread(VALUE thread)
{
return rb_rescue2(rb_thread_run, thread,
return_value, Qnil, rb_eThreadError, 0);
}
static VALUE wake_one _((List *));
static VALUE
wake_one(list)
List *list;
wake_one(List *list)
{
VALUE waking;
@ -230,11 +188,8 @@ wake_one(list)
return waking;
}
static VALUE wake_all _((List *));
static VALUE
wake_all(list)
List *list;
wake_all(List *list)
{
while (list->entries) {
wake_one(list);
@ -242,13 +197,8 @@ wake_all(list)
return Qnil;
}
static void assert_no_survivors _((List *, const char *, void *));
static void
assert_no_survivors(waiting, label, addr)
List *waiting;
const char *label;
void *addr;
assert_no_survivors(List *waiting, const char *label, void *addr)
{
Entry *entry;
for (entry = waiting->entries; entry; entry = entry->next) {
@ -288,41 +238,29 @@ typedef struct _Mutex {
List waiting;
} Mutex;
static void mark_mutex _((Mutex *));
static void
mark_mutex(mutex)
Mutex *mutex;
mark_mutex(Mutex *mutex)
{
rb_gc_mark(mutex->owner);
mark_list(&mutex->waiting);
}
static void finalize_mutex _((Mutex *));
static void
finalize_mutex(mutex)
Mutex *mutex;
finalize_mutex(Mutex *mutex)
{
finalize_list(&mutex->waiting);
}
static void free_mutex _((Mutex *));
static void
free_mutex(mutex)
Mutex *mutex;
free_mutex(Mutex *mutex)
{
assert_no_survivors(&mutex->waiting, "mutex", mutex);
finalize_mutex(mutex);
free(mutex);
}
static void init_mutex _((Mutex *));
static void
init_mutex(mutex)
Mutex *mutex;
init_mutex(Mutex *mutex)
{
mutex->owner = Qnil;
init_list(&mutex->waiting);
@ -336,11 +274,8 @@ init_mutex(mutex)
*
*/
static VALUE rb_mutex_alloc _((VALUE));
static VALUE
rb_mutex_alloc(klass)
VALUE klass;
rb_mutex_alloc(VALUE klass)
{
Mutex *mutex;
mutex = (Mutex *)malloc(sizeof(Mutex));
@ -356,15 +291,12 @@ rb_mutex_alloc(klass)
*
*/
static VALUE rb_mutex_locked_p _((VALUE));
static VALUE
rb_mutex_locked_p(self)
VALUE self;
rb_mutex_locked_p(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
return ( RTEST(mutex->owner) ? Qtrue : Qfalse );
return RTEST(mutex->owner) ? Qtrue : Qfalse;
}
/*
@ -376,11 +308,8 @@ rb_mutex_locked_p(self)
*
*/
static VALUE rb_mutex_try_lock _((VALUE));
static VALUE
rb_mutex_try_lock(self)
VALUE self;
rb_mutex_try_lock(VALUE self)
{
Mutex *mutex;
VALUE result;
@ -407,11 +336,8 @@ rb_mutex_try_lock(self)
*
*/
static void lock_mutex _((Mutex *));
static void
lock_mutex(mutex)
Mutex *mutex;
lock_mutex(Mutex *mutex)
{
VALUE current;
current = rb_thread_current();
@ -429,11 +355,8 @@ lock_mutex(mutex)
rb_thread_critical = 0;
}
static VALUE rb_mutex_lock _((VALUE));
static VALUE
rb_mutex_lock(self)
VALUE self;
rb_mutex_lock(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
@ -448,11 +371,8 @@ rb_mutex_lock(self)
*
*/
static VALUE unlock_mutex_inner _((Mutex *));
static VALUE
unlock_mutex_inner(mutex)
Mutex *mutex;
unlock_mutex_inner(Mutex *mutex)
{
VALUE waking;
@ -465,21 +385,15 @@ unlock_mutex_inner(mutex)
return waking;
}
static VALUE set_critical _((VALUE));
static VALUE
set_critical(value)
VALUE value;
set_critical(VALUE value)
{
rb_thread_critical = (int)value;
return Qnil;
}
static VALUE unlock_mutex _((Mutex *));
static VALUE
unlock_mutex(mutex)
Mutex *mutex;
unlock_mutex(Mutex *mutex)
{
VALUE waking;
@ -497,11 +411,8 @@ unlock_mutex(mutex)
return Qtrue;
}
static VALUE rb_mutex_unlock _((VALUE));
static VALUE
rb_mutex_unlock(self)
VALUE self;
rb_mutex_unlock(VALUE self)
{
Mutex *mutex;
Data_Get_Struct(self, Mutex, mutex);
@ -522,11 +433,8 @@ rb_mutex_unlock(self)
*
*/
static VALUE rb_mutex_exclusive_unlock_inner _((Mutex *));
static VALUE
rb_mutex_exclusive_unlock_inner(mutex)
Mutex *mutex;
rb_mutex_exclusive_unlock_inner(Mutex *mutex)
{
VALUE waking;
waking = unlock_mutex_inner(mutex);
@ -534,11 +442,8 @@ rb_mutex_exclusive_unlock_inner(mutex)
return waking;
}
static VALUE rb_mutex_exclusive_unlock _((VALUE));
static VALUE
rb_mutex_exclusive_unlock(self)
VALUE self;
rb_mutex_exclusive_unlock(VALUE self)
{
Mutex *mutex;
VALUE waking;
@ -567,11 +472,8 @@ rb_mutex_exclusive_unlock(self)
*
*/
static VALUE rb_mutex_synchronize _((VALUE));
static VALUE
rb_mutex_synchronize(self)
VALUE self;
rb_mutex_synchronize(VALUE self)
{
rb_mutex_lock(self);
return rb_ensure(rb_yield, Qundef, rb_mutex_unlock, self);
@ -612,40 +514,28 @@ typedef struct _ConditionVariable {
List waiting;
} ConditionVariable;
static void mark_condvar _((ConditionVariable *));
static void
mark_condvar(condvar)
ConditionVariable *condvar;
mark_condvar(ConditionVariable *condvar)
{
mark_list(&condvar->waiting);
}
static void finalize_condvar _((ConditionVariable *));
static void
finalize_condvar(condvar)
ConditionVariable *condvar;
finalize_condvar(ConditionVariable *condvar)
{
finalize_list(&condvar->waiting);
}
static void free_condvar _((ConditionVariable *));
static void
free_condvar(condvar)
ConditionVariable *condvar;
free_condvar(ConditionVariable *condvar)
{
assert_no_survivors(&condvar->waiting, "condition variable", condvar);
finalize_condvar(condvar);
free(condvar);
}
static void init_condvar _((ConditionVariable *));
static void
init_condvar(condvar)
ConditionVariable *condvar;
init_condvar(ConditionVariable *condvar)
{
init_list(&condvar->waiting);
}
@ -658,11 +548,8 @@ init_condvar(condvar)
*
*/
static VALUE rb_condvar_alloc _((VALUE));
static VALUE
rb_condvar_alloc(klass)
VALUE klass;
rb_condvar_alloc(VALUE klass)
{
ConditionVariable *condvar;
@ -680,12 +567,8 @@ rb_condvar_alloc(klass)
*
*/
static void wait_condvar _((ConditionVariable *, Mutex *));
static void
wait_condvar(condvar, mutex)
ConditionVariable *condvar;
Mutex *mutex;
wait_condvar(ConditionVariable *condvar, Mutex *mutex)
{
rb_thread_critical = 1;
if (!RTEST(mutex->owner)) {
@ -703,11 +586,8 @@ wait_condvar(condvar, mutex)
lock_mutex(mutex);
}
static VALUE legacy_exclusive_unlock _((VALUE));
static VALUE
legacy_exclusive_unlock(mutex)
VALUE mutex;
legacy_exclusive_unlock(VALUE mutex)
{
return rb_funcall(mutex, rb_intern("exclusive_unlock"), 0);
}
@ -717,12 +597,8 @@ typedef struct {
VALUE mutex;
} legacy_wait_args;
static VALUE legacy_wait _((VALUE, legacy_wait_args *));
static VALUE
legacy_wait(unused, args)
VALUE unused;
legacy_wait_args *args;
legacy_wait(VALUE unused, legacy_wait_args *args)
{
push_list(&args->condvar->waiting, rb_thread_current());
rb_thread_stop();
@ -730,12 +606,8 @@ legacy_wait(unused, args)
return Qnil;
}
static VALUE rb_condvar_wait _((VALUE, VALUE));
static VALUE
rb_condvar_wait(self, mutex_v)
VALUE self;
VALUE mutex_v;
rb_condvar_wait(VALUE self, VALUE mutex_v)
{
ConditionVariable *condvar;
Data_Get_Struct(self, ConditionVariable, condvar);
@ -763,11 +635,8 @@ rb_condvar_wait(self, mutex_v)
*
*/
static VALUE rb_condvar_broadcast _((VALUE));
static VALUE
rb_condvar_broadcast(self)
VALUE self;
rb_condvar_broadcast(VALUE self)
{
ConditionVariable *condvar;
@ -788,11 +657,8 @@ rb_condvar_broadcast(self)
*
*/
static void signal_condvar _((ConditionVariable *condvar));
static void
signal_condvar(condvar)
ConditionVariable *condvar;
signal_condvar(ConditionVariable *condvar)
{
VALUE waking;
rb_thread_critical = 1;
@ -802,11 +668,8 @@ signal_condvar(condvar)
}
}
static VALUE rb_condvar_signal _((VALUE));
static VALUE
rb_condvar_signal(self)
VALUE self;
rb_condvar_signal(VALUE self)
{
ConditionVariable *condvar;
Data_Get_Struct(self, ConditionVariable, condvar);
@ -853,11 +716,8 @@ typedef struct _Queue {
unsigned long capacity;
} Queue;
static void mark_queue _((Queue *));
static void
mark_queue(queue)
Queue *queue;
mark_queue(Queue *queue)
{
mark_mutex(&queue->mutex);
mark_condvar(&queue->value_available);
@ -865,11 +725,8 @@ mark_queue(queue)
mark_list(&queue->values);
}
static void finalize_queue _((Queue *));
static void
finalize_queue(queue)
Queue *queue;
finalize_queue(Queue *queue)
{
finalize_mutex(&queue->mutex);
finalize_condvar(&queue->value_available);
@ -877,11 +734,8 @@ finalize_queue(queue)
finalize_list(&queue->values);
}
static void free_queue _((Queue *));
static void
free_queue(queue)
Queue *queue;
free_queue(Queue *queue)
{
assert_no_survivors(&queue->mutex.waiting, "queue", queue);
assert_no_survivors(&queue->space_available.waiting, "queue", queue);
@ -890,11 +744,8 @@ free_queue(queue)
free(queue);
}
static void init_queue _((Queue *));
static void
init_queue(queue)
Queue *queue;
init_queue(Queue *queue)
{
init_mutex(&queue->mutex);
init_condvar(&queue->value_available);
@ -911,11 +762,8 @@ init_queue(queue)
*
*/
static VALUE rb_queue_alloc _((VALUE));
static VALUE
rb_queue_alloc(klass)
VALUE klass;
rb_queue_alloc(VALUE klass)
{
Queue *queue;
queue = (Queue *)malloc(sizeof(Queue));
@ -923,12 +771,8 @@ rb_queue_alloc(klass)
return Data_Wrap_Struct(klass, mark_queue, free_queue, queue);
}
static VALUE rb_queue_marshal_load _((VALUE, VALUE));
static VALUE
rb_queue_marshal_load(self, data)
VALUE self;
VALUE data;
rb_queue_marshal_load(VALUE self, VALUE data)
{
Queue *queue;
VALUE array;
@ -947,11 +791,8 @@ rb_queue_marshal_load(self, data)
return self;
}
static VALUE rb_queue_marshal_dump _((VALUE));
static VALUE
rb_queue_marshal_dump(self)
VALUE self;
rb_queue_marshal_dump(VALUE self)
{
Queue *queue;
VALUE array;
@ -970,11 +811,8 @@ rb_queue_marshal_dump(self)
*
*/
static VALUE rb_queue_clear _((VALUE));
static VALUE
rb_queue_clear(self)
VALUE self;
rb_queue_clear(VALUE self)
{
Queue *queue;
Data_Get_Struct(self, Queue, queue);
@ -995,18 +833,15 @@ rb_queue_clear(self)
*
*/
static VALUE rb_queue_empty_p _((VALUE));
static VALUE
rb_queue_empty_p(self)
VALUE self;
rb_queue_empty_p(VALUE self)
{
Queue *queue;
VALUE result;
Data_Get_Struct(self, Queue, queue);
lock_mutex(&queue->mutex);
result = ( ( queue->values.size == 0 ) ? Qtrue : Qfalse );
result = queue->values.size == 0 ? Qtrue : Qfalse;
unlock_mutex(&queue->mutex);
return result;
@ -1020,11 +855,8 @@ rb_queue_empty_p(self)
*
*/
static VALUE rb_queue_length _((VALUE));
static VALUE
rb_queue_length(self)
VALUE self;
rb_queue_length(VALUE self)
{
Queue *queue;
VALUE result;
@ -1045,11 +877,8 @@ rb_queue_length(self)
*
*/
static VALUE rb_queue_num_waiting _((VALUE));
static VALUE
rb_queue_num_waiting(self)
VALUE self;
rb_queue_num_waiting(VALUE self)
{
Queue *queue;
VALUE result;
@ -1073,13 +902,8 @@ rb_queue_num_waiting(self)
*
*/
static VALUE rb_queue_pop _((int, VALUE *, VALUE));
static VALUE
rb_queue_pop(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
rb_queue_pop(int argc, VALUE *argv, VALUE self)
{
Queue *queue;
int should_block;
@ -1121,12 +945,8 @@ rb_queue_pop(argc, argv, self)
*
*/
static VALUE rb_queue_push _((VALUE, VALUE));
static VALUE
rb_queue_push(self, value)
VALUE self;
VALUE value;
rb_queue_push(VALUE self, VALUE value)
{
Queue *queue;
Data_Get_Struct(self, Queue, queue);
@ -1168,11 +988,8 @@ rb_queue_push(self, value)
*
*/
static VALUE rb_sized_queue_max _((VALUE));
static VALUE
rb_sized_queue_max(self)
VALUE self;
rb_sized_queue_max(VALUE self)
{
Queue *queue;
VALUE result;
@ -1193,12 +1010,8 @@ rb_sized_queue_max(self)
*
*/
static VALUE rb_sized_queue_max_set _((VALUE, VALUE));
static VALUE
rb_sized_queue_max_set(self, value)
VALUE self;
VALUE value;
rb_sized_queue_max_set(VALUE self, VALUE value)
{
Queue *queue;
unsigned long new_capacity;
@ -1245,27 +1058,20 @@ rb_sized_queue_max_set(self, value)
/* for marshalling mutexes and condvars */
static VALUE dummy_load _((VALUE, VALUE));
static VALUE
dummy_load(self, string)
VALUE self;
VALUE string;
dummy_load(VALUE self, VALUE string)
{
return Qnil;
}
static VALUE dummy_dump _((VALUE));
static VALUE
dummy_dump(self)
VALUE self;
dummy_dump(VALUE self)
{
return rb_str_new2("");
}
void
Init_thread()
Init_thread(void)
{
rb_cMutex = rb_define_class("Mutex", rb_cObject);
rb_define_alloc_func(rb_cMutex, rb_mutex_alloc);