class Rack::Session::Pool

def delete_session(req, session_id, options)

def delete_session(req, session_id, options)
  with_lock(req) do
    @pool.delete(session_id.public_id)
    @pool.delete(session_id.private_id)
    generate_sid unless options[:drop]
  end
end

def find_session(req, sid)

def find_session(req, sid)
  with_lock(req) do
    unless sid and session = get_session_with_fallback(sid)
      sid, session = generate_sid, {}
      @pool.store sid.private_id, session
    end
    [sid, session]
  end
end

def generate_sid

def generate_sid
  loop do
    sid = super
    break sid unless @pool.key? sid.private_id
  end
end

def get_session_with_fallback(sid)

def get_session_with_fallback(sid)
  @pool[sid.private_id] || @pool[sid.public_id]
end

def initialize(app, options = {})

def initialize(app, options = {})
  super
  @pool = Hash.new
  @mutex = Mutex.new
end

def with_lock(req)

def with_lock(req)
  @mutex.lock if req.multithread?
  yield
ensure
  @mutex.unlock if @mutex.locked?
end

def write_session(req, session_id, new_session, options)

def write_session(req, session_id, new_session, options)
  with_lock(req) do
    @pool.store session_id.private_id, new_session
    session_id
  end
end