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