fastthread 0.6 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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