asynchronous 2.1.0 → 3.0.0.pre.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODFiY2RkZGRlOGIyZTRmZDA4NTIyNWY1OWY2ZjJhNjRiYmI3YjVmMQ==
4
+ MzI1NjQ3MTczMjQ3YjNhNThlNjY4ZDZiMjA0MmI0MWNiYzgxODJlNw==
5
5
  data.tar.gz: !binary |-
6
- MTgwNmU5NWVkZmYyNGI0MTFhYTUyMjAwODE0ZDY1M2M3Nzc4MDBlZQ==
6
+ ZjAyZTNlNDYwZWY5NTJlOWViMWFmYTYzYjY3ZmEwNWQ5NmJhNWNkMg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjZjMzE2NjQxZmQ1MjMzZWY3MWNiOTNhMDFiMWUzNGMyNDI0MmNhN2U2YzFl
10
- YmEyMGUzNjBjYmU0NDk1NzZhNjYyY2Y4YzM4ZWMxYjExNjhmYjdmNjQ5NWRj
11
- Y2UxYTE3NmQzMTMyOTQ0N2E0YmZhZTE3ZWZiOGJiMTE1YzZlZTM=
9
+ YjZjY2FiOWY3YzFmNjk0ZDRhNjVjZmQwYzc1NjdiOWEwMzVkZmI3MWY3NTg1
10
+ NDFkM2E5Njg2ZGZkMjQ0MjBmZmU1YTliYTk0MTc0YzEyYTZmZmU0MGJlNzM0
11
+ OWE4ZTdmMzIxNTViM2VkNzc0YzljNWJkOTg2Mzk5OTE5NTljZDE=
12
12
  data.tar.gz: !binary |-
13
- MTAyZjY2YTQyYzc3MDU1ZDFiODhiZjJiMTlhNjNmZmE3NmExZDIyZDAxMDMw
14
- OGEzZjk2Y2ExZTM4MjYxOGFjNTllMjljNTFjNWMwZTZmNWFiZjk1YzM0MzA1
15
- NzY5MmM5MDFjZWMyMzMxYWI5ZDY2NDIwMDYyNTIyMDk0NTYxMzA=
13
+ Y2Y1MmY4NGRkMTJlYzU2NGU4ZjJhODNkMTNiMjEwNDQ4Y2QxYTc2YWZiNjg4
14
+ YzM2NDc4ZjM0Njk5MTE5YzFjMDg4NGNlOWViM2VmNGU3MWMzZDliODY5OGJi
15
+ ZjcwNWQ0ODc2YmIxMjcwZjBhNDY3NjMwZDNhODM0MGI5YjgyZTk=
@@ -1,12 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- asynchronous (1.1.0.pre.pre)
4
+ asynchronous (2.1.0)
5
5
  process_shared
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
+ columnize (0.3.6)
11
+ debugger (1.6.2)
12
+ columnize (>= 0.3.1)
13
+ debugger-linecache (~> 1.2.0)
14
+ debugger-ruby_core_source (~> 1.2.3)
15
+ debugger-linecache (1.2.0)
16
+ debugger-ruby_core_source (1.2.3)
10
17
  ffi (1.9.3)
11
18
  process_shared (0.2.0)
12
19
  ffi (~> 1.0)
@@ -16,3 +23,4 @@ PLATFORMS
16
23
 
17
24
  DEPENDENCIES
18
25
  asynchronous!
26
+ debugger
data/README.md CHANGED
@@ -52,7 +52,7 @@ calculation = async :parallelism do
52
52
  end
53
53
 
54
54
  # to call the value (syncronize):
55
- calculation.value
55
+ calculation
56
56
 
57
57
  ```
58
58
 
@@ -70,7 +70,7 @@ Remember well that GarbageCollector will affect the speed.
70
70
 
71
71
  calculation= async { sleep 3; 4 * 3 }
72
72
  # to call the value (syncronize):
73
- calculation.value
73
+ calculation
74
74
 
75
75
  ```
76
76
 
@@ -98,11 +98,21 @@ by default i set the memory allocation to 16Mb because it common usecase to me (
98
98
  but feel free to change!:
99
99
  ```ruby
100
100
 
101
- Asynchronous::Allocation.memory_allocation_size= 1024 #INT!
101
+ Asynchronous.memory_allocation_size= 1024 #INT!
102
102
 
103
103
  ```
104
104
 
105
- ## Example
105
+ ## making shared memory obj static (constant)
106
+
107
+ you can set a shared memory obj to be static if you dont want it to be changed later on
108
+ ```ruby
109
+ shared_memory.test_value= Array.new.push(:something)
110
+ Asynchronous.static_variables.push :test_value
111
+ shared_memory.test_value= Array.new #> this wont happen
112
+ ```
113
+
114
+
115
+ ### Example
106
116
 
107
117
  ```ruby
108
118
 
@@ -123,10 +133,30 @@ calculation = async :OS do
123
133
 
124
134
  end
125
135
 
126
- calculation.value += 1
136
+ calculation += 1
137
+
138
+ puts calculation
139
+
140
+ ```
141
+
127
142
 
128
- puts calculation.value
143
+ there are other examples that you can check in the exampels folder
129
144
 
145
+ ### known bugs
146
+
147
+ In rare case when you get object_buffer error
148
+ * use .sync method on the async variable
149
+
150
+ ```ruby
151
+ calculation = async :OS do
152
+ sleep 4
153
+ 4 * 5
154
+ end
155
+
156
+ calculation.sync #> or synchronize
130
157
  ```
131
158
 
132
- there are other examples that you can check in the exampels folder
159
+ Kernel holding on Native threads with pipes can choke up
160
+ * direct sleep commands can do this on multiple native threads
161
+ ** hard processing load not like that, only kernel sleep
162
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.0
1
+ 3.0.0-pre
@@ -20,5 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_dependency "process_shared"
23
+ spec.add_development_dependency(%q<debugger>, [">= 0"])
24
+
23
25
 
24
26
  end
@@ -0,0 +1,138 @@
1
+ require 'process_shared'
2
+ require_relative "clean_class"
3
+ module Asynchronous
4
+
5
+
6
+ module Allocation
7
+
8
+ class << self
9
+ attr_accessor :memory_allocation_size
10
+ end
11
+
12
+ self.memory_allocation_size= 16384
13
+
14
+ def self.mutex
15
+ @@mutex
16
+ end
17
+
18
+ @@mutex = ProcessShared::Mutex.new
19
+
20
+ end
21
+
22
+
23
+ class SharedMemory < CleanClass
24
+ class << self
25
+ def method_missing(method, *args)
26
+
27
+ ::Asynchronous::Allocation.mutex.synchronize do
28
+ if method.to_s.include?('=')
29
+ begin
30
+ self.class_variable_get("@@#{method.to_s.sub('=','')}").write_object(args[0])
31
+ rescue ::NameError
32
+ self.class_variable_set(
33
+ "@@#{method.to_s.sub('=','')}",
34
+ ::ProcessShared::SharedMemory.new( ::Asynchronous::Allocation.memory_allocation_size )
35
+ )
36
+ self.class_variable_get("@@#{method.to_s.sub('=','')}").write_object(args[0])
37
+ end
38
+ else
39
+ begin
40
+ self.class_variable_get("@@#{method.to_s}").read_object
41
+ rescue ::NameError
42
+ return nil
43
+ end
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+
51
+
52
+ end
53
+
54
+ SharedMemory ||= Asynchronous::SharedMemory
55
+
56
+
57
+
58
+ =begin
59
+
60
+
61
+ # The C void type; only useful for function return types
62
+ :void => Type::VOID,
63
+
64
+ # C boolean type
65
+ :bool => Type::BOOL,
66
+
67
+ # C nul-terminated string
68
+ :string => Type::STRING,
69
+
70
+ # C signed char
71
+ :char => Type::CHAR,
72
+ # C unsigned char
73
+ :uchar => Type::UCHAR,
74
+
75
+ # C signed short
76
+ :short => Type::SHORT,
77
+ # C unsigned short
78
+ :ushort => Type::USHORT,
79
+
80
+ # C signed int
81
+ :int => Type::INT,
82
+ # C unsigned int
83
+ :uint => Type::UINT,
84
+
85
+ # C signed long
86
+ :long => Type::LONG,
87
+
88
+ # C unsigned long
89
+ :ulong => Type::ULONG,
90
+
91
+ # C signed long long integer
92
+ :long_long => Type::LONG_LONG,
93
+
94
+ # C unsigned long long integer
95
+ :ulong_long => Type::ULONG_LONG,
96
+
97
+ # C single precision float
98
+ :float => Type::FLOAT,
99
+
100
+ # C double precision float
101
+ :double => Type::DOUBLE,
102
+
103
+ # C long double
104
+ :long_double => Type::LONGDOUBLE,
105
+
106
+ # Native memory address
107
+ :pointer => Type::POINTER,
108
+
109
+ # 8 bit signed integer
110
+ :int8 => Type::INT8,
111
+ # 8 bit unsigned integer
112
+ :uint8 => Type::UINT8,
113
+
114
+ # 16 bit signed integer
115
+ :int16 => Type::INT16,
116
+ # 16 bit unsigned integer
117
+ :uint16 => Type::UINT16,
118
+
119
+ # 32 bit signed integer
120
+ :int32 => Type::INT32,
121
+ # 32 bit unsigned integer
122
+ :uint32 => Type::UINT32,
123
+
124
+ # 64 bit signed integer
125
+ :int64 => Type::INT64,
126
+ # 64 bit unsigned integer
127
+ :uint64 => Type::UINT64,
128
+
129
+ :buffer_in => Type::BUFFER_IN,
130
+ :buffer_out => Type::BUFFER_OUT,
131
+ :buffer_inout => Type::BUFFER_INOUT,
132
+
133
+ # Used in function prototypes to indicate the arguments are variadic
134
+ :varargs => Type::VARARGS,
135
+
136
+
137
+ =end
138
+
@@ -1,31 +1,23 @@
1
1
  require_relative "../lib/asynchronous"
2
2
 
3
- async1= async :OS do
4
3
 
4
+ async1= async :OS do
5
5
  1000000*5
6
-
7
6
  end
8
7
 
9
8
  async2= async :OS do
10
9
 
11
- sleep 10
12
-
13
- "sup" * 10000
14
-
10
+ var = ("sup" * 1000000)
11
+ puts "the superHuge String length in the pipe is: #{var.length}"
15
12
 
13
+ var
16
14
  end
17
15
 
18
16
 
19
17
  async3= async :OS do
20
-
21
18
  1000000*5.0
22
-
23
19
  end
24
20
 
25
- # please do remember that parsing an object into
26
- # Marshal String can take up time if you have big Strings like
27
- # "sup" * 100000000
21
+ puts async1
28
22
 
29
- puts async1.value,
30
- async2.value[0..5],
31
- async3.value
23
+ puts [ async3, async2[0..5], async1 ]
@@ -14,9 +14,9 @@ calculation = async :concurrency do
14
14
  end
15
15
  puts "hello concurrency"
16
16
 
17
- calculation.value += 1
17
+ calculation += 1
18
18
 
19
- puts calculation.value
19
+ puts calculation
20
20
 
21
21
  #>--------------------------------------------------
22
22
  # or you can use simple {} without sym and this will be by default a
@@ -26,10 +26,10 @@ calculation = async { sleep 3; 4 * 3 }
26
26
 
27
27
  puts "hello simple concurrency"
28
28
 
29
- calculation.value += 1
29
+ calculation += 1
30
30
 
31
- # remember you have to use .value to cal the return value from the code block!
32
- puts calculation.value
31
+ # remember you have to use to cal the return value from the code block!
32
+ puts calculation
33
33
 
34
34
 
35
35
  #>--------------------------------------------------
@@ -49,9 +49,9 @@ calculation = async :parallelism do
49
49
  end
50
50
  puts "hello parallelism"
51
51
 
52
- calculation.value += 1
52
+ calculation += 1
53
53
 
54
- puts calculation.value
54
+ puts calculation
55
55
 
56
56
  #>--------------------------------------------------
57
57
 
@@ -70,6 +70,6 @@ calc2 = async {
70
70
  [5+1,"sup!"]
71
71
  }
72
72
 
73
- puts calc1.value == calc2.value
74
- puts (calc1.value+calc2.value).inspect
73
+ puts calc1 == calc2
74
+ puts (calc1+calc2).inspect
75
75
 
@@ -0,0 +1,29 @@
1
+ require_relative "../lib/asynchronous"
2
+
3
+ shared_memory.test_value = Array.new
4
+ shared_memory.ready_state = Hash.new
5
+ times_value= 5
6
+
7
+ times_value.times do
8
+
9
+ # remember! IO pipes cant be made too fast!
10
+ # this does not mean the Shared memory cant handle the speed
11
+
12
+ var= async :OS do
13
+
14
+ shared_memory.test_value.push $$
15
+ shared_memory.ready_state[$$]= true
16
+
17
+ nil
18
+ end
19
+ shared_memory.ready_state[var.asynchronous_get_pid] ||= false
20
+
21
+ end
22
+
23
+
24
+ while shared_memory.ready_state.values.include?(false)
25
+ sleep 0.5
26
+ end
27
+
28
+ puts shared_memory.test_value.inspect
29
+ puts "#{times_value} OS thread should made this much shared memory update: #{times_value} / and it's #{shared_memory.test_value.count}"
@@ -2,6 +2,7 @@
2
2
  module Asynchronous
3
3
 
4
4
  require 'process_shared'
5
+
5
6
  require File.join(File.dirname(__FILE__),"asynchronous","clean_class")
6
7
  require File.join(File.dirname(__FILE__),"asynchronous","concurrency")
7
8
  require File.join(File.dirname(__FILE__),"asynchronous","parallelism")
@@ -1,19 +1,14 @@
1
- class CleanClass < BasicObject
2
-
3
- # remove methods from the class!
4
- #def self.purge_methods
1
+ module Asynchronous
2
+ class CleanClass < BasicObject
5
3
 
4
+ # remove methods from the class!
6
5
  (self.instance_methods-[
7
- :undef_method,
8
6
  :object_id,
9
7
  :__send__,
10
- :methods,
11
8
  :alias,
12
- :new
13
9
  ]).each do |method|
14
10
  undef_method method
15
11
  end
16
12
 
17
- #end
18
-
13
+ end
19
14
  end
@@ -5,9 +5,9 @@ module Asynchronous
5
5
  # you can modify the objects in memory
6
6
  # This is ideal for little operations in simultaneously or
7
7
  # when you need to update objects in the memory
8
- class Concurrency < CleanClass
8
+ class Concurrency < Asynchronous::CleanClass
9
9
 
10
- def initialize(callable)
10
+ def initialize callable
11
11
  begin
12
12
  @value= nil
13
13
  @try_count= 0
@@ -27,7 +27,7 @@ module Asynchronous
27
27
  end
28
28
  end
29
29
 
30
- def value
30
+ def asynchronous_get_value
31
31
 
32
32
  if @value.nil?
33
33
  until @rescue_state.nil?
@@ -40,35 +40,39 @@ module Asynchronous
40
40
 
41
41
  end
42
42
 
43
- def value=(obj)
43
+ def asynchronous_set_value(obj)
44
44
  @value= obj
45
45
  end
46
+ alias :asynchronous_set_value= :asynchronous_set_value
46
47
 
47
- def inspect
48
- if @thread.alive?
49
- "#<Async running>"
50
- else
51
- value.inspect
52
- end
48
+ def synchronize
49
+ asynchronous_get_value
53
50
  end
51
+ alias :sync :synchronize
54
52
 
55
53
  def method_missing(method, *args)
56
- value.__send__(method, *args)
57
- end
58
54
 
59
- def respond_to_missing?(method, include_private = false)
60
- value.respond_to?(method, include_private)
55
+ new_value= asynchronous_get_value
56
+
57
+ begin
58
+ original_value= new_value.dup
59
+ rescue ::TypeError
60
+ original_value= new_value
61
+ end
62
+
63
+ return_value= new_value.__send__(method,*args)
64
+ unless new_value == original_value
65
+ asynchronous_set_value new_value
66
+ end
67
+
68
+ return return_value
69
+
61
70
  end
62
71
 
63
- end
72
+ #def respond_to_missing?(method, include_private = false)
73
+ # value.respond_to?(method, include_private)
74
+ #end
64
75
 
65
- # alias
66
- begin
67
- #alias :v :value
68
- #alias :get :value
69
- #alias :gets :value
70
- #alias :response :value
71
- #alias :return :value
72
76
  end
73
77
 
74
78
  end
@@ -12,7 +12,8 @@
12
12
  #
13
13
  module Kernel
14
14
 
15
- def async(type= :Concurrency ,&block)
15
+ def async type= :VM ,&block
16
+
16
17
  case type.to_s.downcase[0]
17
18
  # Concurrency / VM / Green
18
19
  when "c","v","g"
@@ -30,6 +31,7 @@ module Kernel
30
31
  end
31
32
 
32
33
  end
34
+
33
35
  end
34
36
 
35
37
  def shared_memory
@@ -7,127 +7,106 @@ module Asynchronous
7
7
  # and only get the return value so you can do big works without the fear of the
8
8
  # Garbage collector slowness or the GIL lock
9
9
  # when you need to update objects in the memory use :concurrency
10
- class Parallelism < CleanClass
10
+ class Parallelism < Asynchronous::CleanClass
11
11
 
12
- # Basic class variables
13
- begin
12
+ def asynchronous_fork callable
13
+ return ::Kernel.fork do
14
14
 
15
- @@pids ||= []
16
- @@tmpdir ||= nil
17
- @@motherpid ||= $$
18
- @@agent ||= nil
19
- @@zombie ||= true
20
- ::Kernel.require 'yaml'
21
-
22
- end
23
-
24
- # main def for logic
25
- begin
26
- def initialize callable
27
-
28
- # defaults
29
15
  begin
30
- @value= nil
31
- @rd, @wr = ::IO.pipe
32
- end
33
-
34
- # create a process
35
- begin
36
- @pid= ::Kernel.fork do
37
-
38
- # anti zombie
39
- begin
40
- ::Kernel.trap("TERM") do
41
- ::Kernel.exit
42
- end
43
- ::Thread.new do
44
- ::Kernel.loop do
45
- begin
46
- ::Kernel.sleep 1
47
- if alive?(@@motherpid) == false
48
- ::Kernel.exit!
49
- end
50
- end
16
+ ::Kernel.trap("TERM") do
17
+ ::Kernel.exit
18
+ end
19
+ ::Thread.new do
20
+ ::Kernel.loop do
21
+ begin
22
+ ::Kernel.sleep 1
23
+ if ::Asynchronous::Parallelism.asynchronous_alive?(@@motherpid) == false
24
+ ::Kernel.exit
51
25
  end
52
26
  end
53
27
  end
28
+ end
29
+ end
54
30
 
55
- # return the value
56
- begin
57
-
58
- #::Kernel.puts callable.class
59
-
60
- return_value= callable.call
61
-
62
- @rd.close
31
+ @comm_line[0].close
32
+ @comm_line[1].write ::Marshal.dump(callable.call)
33
+ @comm_line[1].flush
63
34
 
64
- #@wr.write ::Marshal.dump(return_value)
65
- @wr.write return_value.to_yaml
35
+ #::Kernel.loop do
36
+ # #::Kernel.puts @comm_line[0].closed?
37
+ # #::Kernel.puts @comm_line[1].closed?
38
+ # ::Kernel.sleep 1
39
+ #end
66
40
 
67
- @wr.close
68
41
 
69
- ::Process.exit!
70
- end
42
+ end
43
+ end
71
44
 
72
- end
73
- @@pids.push(@pid)
45
+ def asynchronous_read_buffer
46
+ @read_buffer = ::Thread.new do
47
+ while !@comm_line[0].eof?
48
+ @value = ::Marshal.load(@comm_line[0])
74
49
  end
75
-
76
50
  end
77
51
  end
78
52
 
79
- # connection for in case of mother die
80
- begin
81
53
 
82
- def alive?(pid)
83
- begin
84
- ::Process.kill(0,pid)
85
- return true
86
- rescue ::Errno::ESRCH
87
- return false
88
- end
89
- end
54
+ def initialize callable
90
55
 
91
- end
56
+ @@pids ||= []
57
+ @@motherpid ||= $$
92
58
 
93
- # return value
94
- begin
59
+ @comm_line = ::IO.pipe
60
+ @value = nil
61
+ @read_buffer = nil
95
62
 
96
- def value
63
+ asynchronous_read_buffer
64
+ @pid= asynchronous_fork callable
65
+ @@pids.push(@pid)
97
66
 
98
- if @value.nil?
67
+ end
99
68
 
100
- #while alive?(@pid)
101
- # ::Kernel.puts alive? @pid
102
- # ::Kernel.sleep 1
103
- # #sleep 1
104
- #end
69
+ def asynchronous_get_pid
70
+ return @pid
71
+ end
105
72
 
106
- @wr.close
107
- return_value= @rd.read
108
- @rd.close
73
+ def self.asynchronous_alive?(pid)
74
+ begin
75
+ ::Process.kill(0,pid)
76
+ return true
77
+ rescue ::Errno::ESRCH
78
+ return false
79
+ end
80
+ end
109
81
 
110
- #return_value= ::Marshal.load(return_value)
111
- return_value= ::YAML.load(return_value)
82
+ def asynchronous_get_value
112
83
 
113
- @@pids.delete(@pid)
114
- @value= return_value
84
+ if @value.nil?
115
85
 
116
- end
86
+ ::Process.wait(@pid, ::Process::WNOHANG )
117
87
 
118
- return @value
88
+ @comm_line[1].close
89
+ @read_buffer.join
90
+ @comm_line[0].close
119
91
 
120
92
  end
121
93
 
122
- def value=(obj)
123
- @value= obj
124
- end
94
+ return @value
125
95
 
126
96
  end
127
97
 
98
+ def asynchronous_set_value(obj)
99
+ @value= obj
100
+ end
101
+ alias :asynchronous_set_value= :asynchronous_set_value
102
+
103
+ def synchronize
104
+ asynchronous_get_value
105
+ end
106
+ alias :sync :synchronize
107
+
128
108
  # kill kidos at Kernel Exit
129
- begin
130
- ::Kernel.at_exit {
109
+ ::Kernel.at_exit {
131
110
  @@pids.each { |pid|
132
111
  begin
133
112
  ::Process.kill(:TERM, pid)
@@ -136,16 +115,25 @@ module Asynchronous
136
115
  end
137
116
  }
138
117
  }
139
- end
140
118
 
141
- # alias
142
- begin
143
- alias :v :value
144
- #alias :get :value
145
- #alias :gets :value
146
- #alias :response :value
147
- #alias :return :value
119
+ def method_missing(method, *args)
120
+
121
+ return_value= nil
122
+ new_value= asynchronous_get_value
123
+ begin
124
+ original_value= new_value.dup
125
+ rescue ::TypeError
126
+ original_value= new_value
127
+ end
128
+ return_value= new_value.__send__(method,*args)
129
+ unless new_value == original_value
130
+ asynchronous_set_value new_value
131
+ end
132
+
133
+ return return_value
134
+
148
135
  end
149
136
 
137
+
150
138
  end
151
139
  end
@@ -1,15 +1,16 @@
1
- require 'process_shared'
2
- require_relative "clean_class"
3
1
  module Asynchronous
4
2
 
3
+ class << self
4
+ attr_accessor :global_mutex
5
+ end
6
+ self.global_mutex = false
5
7
 
6
- module Allocation
7
-
8
- class << self
9
- attr_accessor :memory_allocation_size
10
- end
8
+ class << self
9
+ attr_accessor :memory_allocation_size
10
+ end
11
+ self.memory_allocation_size= 16384
11
12
 
12
- self.memory_allocation_size= 16384
13
+ module Global
13
14
 
14
15
  def self.mutex
15
16
  @@mutex
@@ -20,34 +21,112 @@ module Asynchronous
20
21
  end
21
22
 
22
23
 
23
- class SharedMemory < CleanClass
24
+ class MemoryObj < Asynchronous::CleanClass
25
+
26
+ @data = nil
27
+ @mutex = nil
28
+
29
+ def initialize(obj)
30
+
31
+ @data= ::ProcessShared::SharedMemory.new(
32
+ ::Asynchronous.memory_allocation_size)
33
+
34
+ @mutex= ::ProcessShared::Mutex.new
35
+
36
+ @data.write_object(obj)
37
+
38
+ end
39
+
40
+ def asynchronous_set_value obj
41
+ return @data.write_object obj
42
+ end
43
+
44
+ def asynchronous_set_value= obj
45
+ self.asynchronous_set_value(obj)
46
+ end
47
+
48
+ def asynchronous_get_value
49
+ return @data.read_object
50
+ end
51
+
52
+
53
+ def method_missing(method, *args, &block)
54
+
55
+ #::Kernel.puts "method: #{method}, #{args}, #{block}"
56
+
57
+ new_value= nil
58
+ original_value= nil
59
+ return_value= nil
60
+ mutex_obj= nil
61
+
62
+ if ::Asynchronous.global_mutex == true
63
+ mutex_obj= ::Asynchronous::Global.mutex
64
+ else
65
+ mutex_obj= @mutex
66
+ end
67
+
68
+ mutex_obj.synchronize do
69
+
70
+ new_value= asynchronous_get_value
71
+
72
+ begin
73
+ original_value= new_value.dup
74
+ rescue ::TypeError
75
+ original_value= new_value
76
+ end
77
+
78
+ return_value= new_value.__send__(method,*args,&block)
79
+ unless new_value == original_value
80
+ asynchronous_set_value new_value
81
+ end
82
+
83
+ end
84
+
85
+ return return_value
86
+
87
+ end
88
+
89
+ end
90
+
91
+ class SharedMemory < Asynchronous::CleanClass
24
92
  class << self
25
93
  def method_missing(method, *args)
26
94
 
27
- ::Asynchronous::Allocation.mutex.synchronize do
28
- if method.to_s.include?('=')
29
- begin
30
- self.class_variable_get("@@#{method.to_s.sub('=','')}").write_object(args[0])
31
- rescue ::NameError
32
- self.class_variable_set(
33
- "@@#{method.to_s.sub('=','')}",
34
- ::ProcessShared::SharedMemory.new( ::Asynchronous::Allocation.memory_allocation_size )
35
- )
36
- self.class_variable_get("@@#{method.to_s.sub('=','')}").write_object(args[0])
95
+ case true
96
+
97
+ when method.to_s.include?('=')
98
+
99
+ @@static_variables ||= ::Asynchronous::MemoryObj.new(Array.new.push(:static_variables))
100
+ if @@static_variables.include?(method.to_s.sub!('=','').to_sym)
101
+ $stdout.puts "Warning! static varieble cant be changed without removing from the Asynchronous.static_variables array collection (sym)"
102
+ return nil
103
+ else
104
+
105
+ begin
106
+ self.class_variable_get("@@#{method.to_s.sub('=','')}").asynchronous_set_value= args[0]
107
+ rescue ::NameError
108
+ self.class_variable_set(
109
+ "@@#{method.to_s.sub('=','')}",
110
+ ::Asynchronous::MemoryObj.new(args[0]))
111
+ end
112
+
37
113
  end
114
+
38
115
  else
39
116
  begin
40
- self.class_variable_get("@@#{method.to_s}").read_object
117
+ self.class_variable_get("@@#{method.to_s}")
41
118
  rescue ::NameError
42
119
  return nil
43
120
  end
44
- end
45
121
  end
46
122
 
47
123
  end
48
124
  end
49
125
  end
50
126
 
127
+ def self.static_variables
128
+ SharedMemory.static_variables
129
+ end
51
130
 
52
131
  end
53
132
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asynchronous
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0.pre.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: debugger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: ! 'DSL for for dead simple to use asynchronous patterns in both VM managed
28
42
  and OS managed way (Concurrency and Parallelism) '
29
43
  email:
@@ -39,10 +53,12 @@ files:
39
53
  - VERSION
40
54
  - asynchronous.gemspec
41
55
  - dump/async.rb
56
+ - dump/shared_memory.rb
42
57
  - examples/array_of_value_with_native_threads.rb
43
58
  - examples/async_patterns.rb
44
59
  - examples/no_zombie_test.rb
45
- - examples/shared_memory.rb
60
+ - examples/shared_memory1.rb
61
+ - examples/shared_memory2.rb
46
62
  - files.rb
47
63
  - lib/asynchronous.rb
48
64
  - lib/asynchronous/clean_class.rb
@@ -50,7 +66,6 @@ files:
50
66
  - lib/asynchronous/kernel.rb
51
67
  - lib/asynchronous/parallelism.rb
52
68
  - lib/asynchronous/shared_memory.rb
53
- - test/test.rb
54
69
  homepage: https://github.com/adamluzsi/asynchronous
55
70
  licenses: []
56
71
  metadata: {}
@@ -65,15 +80,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
80
  version: '0'
66
81
  required_rubygems_version: !ruby/object:Gem::Requirement
67
82
  requirements:
68
- - - ! '>='
83
+ - - ! '>'
69
84
  - !ruby/object:Gem::Version
70
- version: '0'
85
+ version: 1.3.1
71
86
  requirements: []
72
87
  rubyforge_project:
73
88
  rubygems_version: 2.2.1
74
89
  signing_key:
75
90
  specification_version: 4
76
91
  summary: Simple Async Based on standard CRuby
77
- test_files:
78
- - test/test.rb
92
+ test_files: []
79
93
  has_rdoc:
File without changes