fastthread 0.6 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/ext/fastthread/fastthread.c +28 -8
- metadata +1 -1
data/Rakefile
CHANGED
data/ext/fastthread/fastthread.c
CHANGED
@@ -812,6 +812,26 @@ dummy_dump(self)
|
|
812
812
|
return rb_str_new2("");
|
813
813
|
}
|
814
814
|
|
815
|
+
static void
|
816
|
+
swap_class(name, value)
|
817
|
+
const char *name;
|
818
|
+
VALUE value;
|
819
|
+
{
|
820
|
+
rb_mod_remove_const(rb_cObject, rb_str_new2(name));
|
821
|
+
rb_const_set(rb_cObject, rb_intern(name), value);
|
822
|
+
}
|
823
|
+
|
824
|
+
static VALUE
|
825
|
+
swap_classes(unused)
|
826
|
+
VALUE unused;
|
827
|
+
{
|
828
|
+
swap_class("Mutex", rb_cMutex);
|
829
|
+
swap_class("ConditionVariable", rb_cConditionVariable);
|
830
|
+
swap_class("Queue", rb_cQueue);
|
831
|
+
swap_class("SizedQueue", rb_cSizedQueue);
|
832
|
+
return Qnil;
|
833
|
+
}
|
834
|
+
|
815
835
|
void
|
816
836
|
Init_fastthread()
|
817
837
|
{
|
@@ -825,8 +845,7 @@ Init_fastthread()
|
|
825
845
|
|
826
846
|
private_eThreadError = rb_const_get(rb_cObject, rb_intern("ThreadError"));
|
827
847
|
|
828
|
-
|
829
|
-
rb_cMutex = rb_define_class("Mutex", rb_cObject);
|
848
|
+
rb_cMutex = rb_class_new(rb_cObject);
|
830
849
|
rb_define_alloc_func(rb_cMutex, rb_mutex_alloc);
|
831
850
|
rb_define_method(rb_cMutex, "marshal_load", dummy_load, 1);
|
832
851
|
rb_define_method(rb_cMutex, "marshal_dump", dummy_dump, 0);
|
@@ -838,8 +857,7 @@ Init_fastthread()
|
|
838
857
|
rb_define_method(rb_cMutex, "exclusive_unlock", rb_mutex_exclusive_unlock, 0);
|
839
858
|
rb_define_method(rb_cMutex, "synchronize", rb_mutex_synchronize, 0);
|
840
859
|
|
841
|
-
|
842
|
-
rb_cConditionVariable = rb_define_class("ConditionVariable", rb_cObject);
|
860
|
+
rb_cConditionVariable = rb_class_new(rb_cObject);
|
843
861
|
rb_define_alloc_func(rb_cConditionVariable, rb_condvar_alloc);
|
844
862
|
rb_define_method(rb_cConditionVariable, "marshal_load", dummy_load, 1);
|
845
863
|
rb_define_method(rb_cConditionVariable, "marshal_dump", dummy_dump, 0);
|
@@ -848,8 +866,7 @@ Init_fastthread()
|
|
848
866
|
rb_define_method(rb_cConditionVariable, "broadcast", rb_condvar_broadcast, 0);
|
849
867
|
rb_define_method(rb_cConditionVariable, "signal", rb_condvar_signal, 0);
|
850
868
|
|
851
|
-
|
852
|
-
rb_cQueue = rb_define_class("Queue", rb_cObject);
|
869
|
+
rb_cQueue = rb_class_new(rb_cObject);
|
853
870
|
rb_define_alloc_func(rb_cQueue, rb_queue_alloc);
|
854
871
|
rb_define_method(rb_cQueue, "marshal_load", rb_queue_marshal_load, 1);
|
855
872
|
rb_define_method(rb_cQueue, "marshal_dump", rb_queue_marshal_dump, 0);
|
@@ -865,8 +882,7 @@ Init_fastthread()
|
|
865
882
|
rb_alias(rb_cQueue, rb_intern("shift"), rb_intern("pop"));
|
866
883
|
rb_alias(rb_cQueue, rb_intern("size"), rb_intern("length"));
|
867
884
|
|
868
|
-
|
869
|
-
rb_cSizedQueue = rb_define_class("SizedQueue", rb_cQueue);
|
885
|
+
rb_cSizedQueue = rb_class_new(rb_cQueue);
|
870
886
|
rb_define_method(rb_cSizedQueue, "initialize", rb_sized_queue_max_set, 1);
|
871
887
|
rb_define_method(rb_cSizedQueue, "clear", rb_queue_clear, 0);
|
872
888
|
rb_define_method(rb_cSizedQueue, "empty?", rb_queue_empty_p, 0);
|
@@ -879,5 +895,9 @@ Init_fastthread()
|
|
879
895
|
rb_alias(rb_cSizedQueue, rb_intern("<<"), rb_intern("push"));
|
880
896
|
rb_alias(rb_cSizedQueue, rb_intern("deq"), rb_intern("pop"));
|
881
897
|
rb_alias(rb_cSizedQueue, rb_intern("shift"), rb_intern("pop"));
|
898
|
+
|
899
|
+
// swap classes atomically to avoid race conditions
|
900
|
+
rb_thread_critical = 1;
|
901
|
+
rb_ensure(swap_classes, Qnil, set_critical, 0);
|
882
902
|
}
|
883
903
|
|
metadata
CHANGED