Guest User

Untitled

a guest
May 23rd, 2018
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. # Oleg Andreev <oleganza@gmail.com>
  2. # November 3, 2008
  3.  
  4. require 'thread'
  5. module DataMapper
  6. class Repository
  7. # Original context returns new context stack for the current thread:
  8. # Thread.current[:dm_repository_contexts] ||= []
  9. # This is not cool because there might be new thread creation on each request,
  10. # what turns into tons of stacks and repositories generated for each request.
  11. class ContextsPool
  12.  
  13. THREAD_VAR = :dm_repository_contexts
  14.  
  15. # Ensures that THREAD_VAR is used.
  16. module OverrideContext
  17. def context
  18. Thread.current[THREAD_VAR]
  19. end
  20. end
  21.  
  22. def initialize(options = {})
  23. options = options.merge(:size => 2, :clean_interval => 120)
  24. size = options[:size]
  25. int = options[:clean_interval]
  26.  
  27. @queue = Queue.new
  28. size.times{ @queue.push([]) }
  29. Repository.extend(OverrideContext)
  30.  
  31. @cleaner = Thread.new(size, int) do |s, i|
  32. sleep i
  33. q = Queue.new
  34. s.times { q.push([]) }
  35. @queue = q
  36. end
  37. end
  38.  
  39. # Merb Usage:
  40. #
  41. # CTX_POOL_SIZE = 10 # number of IdentityMaps per process
  42. # CTX_POOL = DataMapper::Repository:ContextsPool.new(CTX_POOL_SIZE)
  43. #
  44. # def _call_action(*args)
  45. # CTX_POOL.wrap do
  46. # repository do
  47. # # time out the action if it takes longer than 1 second
  48. # SystemTimer.timeout(1) do
  49. # super
  50. # end
  51. # end
  52. # end
  53. # end
  54. #
  55. def wrap
  56. prev = Thread.current[THREAD_VAR]
  57. q = @queue # @queue can be changed by @cleaner, therefore we use local reference
  58. Thread.current[THREAD_VAR] = q.pop
  59. yield
  60. ensure
  61. q.push(Thread.current[THREAD_VAR])
  62. Thread.current[THREAD_VAR] = prev
  63. end
  64.  
  65. end
  66. end
  67. end
Add Comment
Please, Sign In to add comment