fastthread 0.6 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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: