diff --git a/lib/tty/spinner.rb b/lib/tty/spinner.rb index 9579973..dfc46e7 100644 --- a/lib/tty/spinner.rb +++ b/lib/tty/spinner.rb @@ -27,6 +27,8 @@ class Spinner TICK = '✔'.freeze CROSS = '✖'.freeze + CURSOR_USAGE_LOCK = Monitor.new + # The object that responds to print call defaulting to stderr # # @api public @@ -159,15 +161,17 @@ def start reset end - SPINNER_START_LOCK = Mutex.new # Start automatic spinning animation # # @api public def auto_spin - SPINNER_START_LOCK.synchronize do + CURSOR_USAGE_LOCK.synchronize do start sleep_time = 1.0 / @interval + + spin @thread = Thread.new do + sleep(sleep_time) while @started_at spin sleep(sleep_time) @@ -339,11 +343,9 @@ def reset private - LOCK = Mutex.new - def execute_on_line if @multispinner - LOCK.synchronize do + CURSOR_USAGE_LOCK.synchronize do lines_up = @multispinner.count_line_offset(@index) if @first_run diff --git a/lib/tty/spinner/multi.rb b/lib/tty/spinner/multi.rb index a2a46a9..b5b43d0 100644 --- a/lib/tty/spinner/multi.rb +++ b/lib/tty/spinner/multi.rb @@ -20,6 +20,8 @@ class Multi def initialize(options = {}) @options = options + @create_spinner_lock = Mutex.new + @spinners = [] @callbacks = { success: [], @@ -36,8 +38,12 @@ def initialize(options = {}) # @api public def register(pattern, options = {}) spinner = TTY::Spinner.new(pattern, @options.merge(options)) - spinner.add_multispinner(self, @spinners.length) - @spinners << spinner + + @create_spinner_lock.synchronize do + spinner.add_multispinner(self, @spinners.length) + @spinners << spinner + end + spinner end