Sha256: b01c41984e74d6c9f1a1b0c8440413cab2d3dcce781444c364feffd5ebc787e9

Contents?: true

Size: 1.25 KB

Versions: 6

Compression:

Stored size: 1.25 KB

Contents

# encoding: utf-8

# utilities.rb : General-purpose utility classes which don't fit anywhere else
#
# Copyright August 2012, Alex Dowad. All Rights Reserved.
#
# This is free software. Please see the LICENSE and COPYING files for details.

require 'thread'

module Prawn

  # Throughout the Prawn codebase, repeated calculations which can benefit from caching are made
  # In some cases, caching and reusing results can not only save CPU cycles but also greatly
  #   reduce memory requirements
  # But at the same time, we don't want to throw away thread safety
  # We have two interchangeable thread-safe cache implementations:

  # @private
  class SynchronizedCache
    # As an optimization, this could access the hash directly on VMs with a global interpreter lock (like MRI)
    def initialize
      @cache = {}
      @mutex = Mutex.new
    end
    def [](key)
      @mutex.synchronize { @cache[key] }
    end
    def []=(key,value)
      @mutex.synchronize { @cache[key] = value }
    end
  end

  # @private
  class ThreadLocalCache
    def initialize
      @cache_id = "cache_#{self.object_id}".to_sym
    end
    def [](key)
      (Thread.current[@cache_id] ||= {})[key]
    end
    def []=(key,value)
      (Thread.current[@cache_id] ||= {})[key] = value
    end
  end
end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
prawn-git-2.0.1 lib/prawn/utilities.rb
prawn-2.0.1 lib/prawn/utilities.rb
prawn-2.0.0 lib/prawn/utilities.rb
prawn-1.3.0 lib/prawn/utilities.rb
prawn-1.2.1 lib/prawn/utilities.rb
prawn-1.1.0 lib/prawn/utilities.rb