From a23282dcc68596f1b6de549e722b3ab468fc02ed Mon Sep 17 00:00:00 2001 From: Nick Elser Date: Thu, 7 May 2015 00:16:28 -0700 Subject: [PATCH] don't go around allocating empty strings willy-nilly --- CHANGELOG.md | 4 ++++ README.md | 6 +++--- lib/suo/client/base.rb | 8 ++++++-- lib/suo/client/memcached.rb | 2 +- lib/suo/client/redis.rb | 6 ++++-- lib/suo/version.rb | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a155cb..d4add84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1 + +- Slight memory leak fix. + ## 0.3.0 - Dramatically simplify the interface by forcing clients to specify the key & resources at lock initialization instead of every method call. diff --git a/README.md b/README.md index dd6bc64..4f2420c 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ end # The resources argument is the number of resources the semaphore will allow to lock (defaulting to one - a mutex) suo = Suo::Client::Memcached.new("bar_resource", client: some_dalli_client, resources: 2) -Thread.new { suo.lock{ puts "One"; sleep 2 } } +Thread.new { suo.lock { puts "One"; sleep 2 } } Thread.new { suo.lock { puts "Two"; sleep 2 } } Thread.new { suo.lock { puts "Three" } } @@ -46,7 +46,7 @@ suo = Suo::Client::Memcached.new("protected_key", client: some_dalli_client, acq # manually locking/unlocking # the return value from lock without a block is a unique token valid only for the current lock # which must be unlocked manually -token = suo +token = suo.lock foo.baz! suo.unlock(token) @@ -77,7 +77,7 @@ end ## History -View the [changelog](https://github.com/nickelser/suo/blob/master/CHANGELOG.md) +View the [changelog](https://github.com/nickelser/suo/blob/master/CHANGELOG.md). ## Contributing diff --git a/lib/suo/client/base.rb b/lib/suo/client/base.rb index 7d74810..5444631 100644 --- a/lib/suo/client/base.rb +++ b/lib/suo/client/base.rb @@ -8,17 +8,21 @@ class Base resources: 1 }.freeze + BLANK_STR = "".freeze + attr_accessor :client, :key, :resources, :options include MonitorMixin def initialize(key, options = {}) fail "Client required" unless options[:client] + @options = DEFAULT_OPTIONS.merge(options) @retry_count = (@options[:acquisition_timeout] / @options[:acquisition_delay].to_f).ceil @client = @options[:client] @resources = @options[:resources].to_i @key = key + super() # initialize Monitor mixin for thread safety end @@ -124,7 +128,7 @@ def set(newval, cas) # rubocop:disable Lint/UnusedMethodArgument fail NotImplementedError end - def initial_set(val = "") # rubocop:disable Lint/UnusedMethodArgument + def initial_set(val = BLANK_STR) # rubocop:disable Lint/UnusedMethodArgument fail NotImplementedError end @@ -158,7 +162,7 @@ def deserialize_and_clear_locks(val) end def deserialize_locks(val) - unpacked = (val.nil? || val == "") ? [] : MessagePack.unpack(val) + unpacked = (val.nil? || val == BLANK_STR) ? [] : MessagePack.unpack(val) unpacked.map do |time, token| [Time.at(time), token] diff --git a/lib/suo/client/memcached.rb b/lib/suo/client/memcached.rb index 7f87020..83b37b6 100644 --- a/lib/suo/client/memcached.rb +++ b/lib/suo/client/memcached.rb @@ -20,7 +20,7 @@ def set(newval, cas) @client.set_cas(@key, newval, cas) end - def initial_set(val = "") + def initial_set(val = BLANK_STR) @client.set(@key, val) end end diff --git a/lib/suo/client/redis.rb b/lib/suo/client/redis.rb index 439e868..b13119e 100644 --- a/lib/suo/client/redis.rb +++ b/lib/suo/client/redis.rb @@ -1,6 +1,8 @@ module Suo module Client class Redis < Base + OK_STR = "OK".freeze + def initialize(key, options = {}) options[:client] ||= ::Redis.new(options[:connection] || {}) super @@ -21,7 +23,7 @@ def set(newval, _) multi.set(@key, newval) end - ret && ret[0] == "OK" + ret && ret[0] == OK_STR end def synchronize @@ -32,7 +34,7 @@ def synchronize @client.unwatch end - def initial_set(val = "") + def initial_set(val = BLANK_STR) @client.set(@key, val) end end diff --git a/lib/suo/version.rb b/lib/suo/version.rb index 32cd83c..523c7c6 100644 --- a/lib/suo/version.rb +++ b/lib/suo/version.rb @@ -1,3 +1,3 @@ module Suo - VERSION = "0.3.0" + VERSION = "0.3.1" end