Class: DangoFrameworkModule::SharedMemoryStore

Inherits:
Object
  • Object
show all
Defined in:
lib/dango/shared/memory_store.rb

Overview

共有メモリ

Instance Method Summary collapse

Constructor Details

#initializeSharedMemoryStore

Returns a new instance of SharedMemoryStore.



11
12
13
14
15
# File 'lib/dango/shared/memory_store.rb', line 11

def initialize
  @data = {}
  @mutex = {}
  @size = 0
end

Instance Method Details

#[](key) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/dango/shared/memory_store.rb', line 52

def [](key)
  if !@mutex.has_key?(key) # 未定義キーならエラー

    return(nil)
#        raise(DangoFrameworkError, "Shared key is not exist.")

  end
  
  # ロックしてデータを読む

  if @mutex[key].locked?
    data = @data[key].deep_dup
  else
    data = @mutex[key].synchronize do
      @data[key].deep_dup
    end
  end
  data
end

#[]=(key, value) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/dango/shared/memory_store.rb', line 69

def []=(key, value)
  # キーはString Symbolのみ

  if key.class != String && key.class != Symbol
    raise(DangoFrameworkError, "Shared key is not String or Symbol.")
  end
  
  # 未定義なら定義する

  if !@mutex.has_key?(key)
    @mutex[key] = Mutex.new
  end
  
  # ロックしてデータを入れる

  if @mutex[key].locked?
    @data[key] = value.deep_dup
  else
    @mutex[key].synchronize do
      @data[key] = value.deep_dup
    end
  end
end

#has_key?(key) ⇒ Boolean

キーがあるかどうかを返す

Returns:

  • (Boolean)


48
49
50
# File 'lib/dango/shared/memory_store.rb', line 48

def has_key?(key) # キーがあるかどうかを返す

  @mutex.has_key?(key)
end

#keysObject



17
18
19
# File 'lib/dango/shared/memory_store.rb', line 17

def keys
  @data.keys
end

#synchronize(key) ⇒ Object

排他処理ブロック用



39
40
41
42
43
44
45
46
# File 'lib/dango/shared/memory_store.rb', line 39

def synchronize(key) # 排他処理ブロック用

  if !@mutex.has_key?(key) # 未定義キーならエラー

    raise(DangoFrameworkError, "Shared key is not exist.")
  end
  @mutex[key].synchronize do
    yield
  end
end

#to_hashObject



21
22
23
24
25
26
27
# File 'lib/dango/shared/memory_store.rb', line 21

def to_hash
  hash = {}
  @data.keys.each do |key|
    hash[key] = @data[key].deep_dup
  end
  hash
end

#transaction(key) ⇒ Object

トランザクション処理ブロックを作る



29
30
31
32
33
34
35
36
37
# File 'lib/dango/shared/memory_store.rb', line 29

def transaction(key) # トランザクション処理ブロックを作る

  if !@mutex.has_key?(key) # 未定義キーならエラー

    raise(DangoFrameworkError, "Shared key is not exist.")
  end
  @mutex[key].synchronize do
    data = yield(@data[key].deep_dup)
    @data[key] = data.deep_dup
  end
end