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.
Files changed (3) hide show
  1. data/Rakefile +1 -1
  2. data/ext/fastthread/fastthread.c +28 -8
  3. metadata +1 -1
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require 'rake/testtask'
4
4
  require 'rake/gempackagetask'
5
5
  require 'tools/rakehelp'
6
6
 
7
- GEM_VERSION="0.6"
7
+ GEM_VERSION="0.6.1"
8
8
 
9
9
  setup_extension('fastthread', 'fastthread')
10
10
 
@@ -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
- rb_mod_remove_const(rb_cObject, rb_str_new2("Mutex"));
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
- rb_mod_remove_const(rb_cObject, rb_str_new2("ConditionVariable"));
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
- rb_mod_remove_const(rb_cObject, rb_str_new2("Queue"));
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
- rb_mod_remove_const(rb_cObject, rb_str_new2("SizedQueue"));
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
@@ -3,7 +3,7 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: fastthread
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.6"
6
+ version: 0.6.1
7
7
  date: 2006-12-31 00:00:00 -05:00
8
8
  summary: Optimized replacement for thread.rb primitives
9
9
  require_paths: