Fix mt issues (#178)

This commit is contained in:
Brian J. Cardiff 2023-04-24 07:26:25 -03:00 committed by GitHub
parent 87dc8aafaf
commit da7494b5ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 20 deletions

View file

@ -216,8 +216,10 @@ module DB
private def build_resource : T
resource = @factory.call
@total << resource
@idle << resource
sync do
@total << resource
@idle << resource
end
resource
end

View file

@ -7,6 +7,7 @@ module DB
class PoolPreparedStatement < PoolStatement
# connections where the statement was prepared
@connections = Set(WeakRef(Connection)).new
@mutex = Mutex.new
def initialize(db : Database, query : String)
super
@ -20,35 +21,47 @@ module DB
end
protected def do_close
# TODO close all statements on all connections.
# currently statements are closed when the connection is closed.
@mutex.synchronize do
# TODO close all statements on all connections.
# currently statements are closed when the connection is closed.
# WHAT-IF the connection is busy? Should each statement be able to
# deallocate itself when the connection is free.
@connections.clear
# WHAT-IF the connection is busy? Should each statement be able to
# deallocate itself when the connection is free.
@connections.clear
end
end
# builds a statement over a real connection
# the connection is registered in `@connections`
private def build_statement : Statement
clean_connections
conn, existing = @db.checkout_some(@connections)
conn, existing = @mutex.synchronize do
@db.checkout_some(@connections)
end
begin
stmt = conn.prepared.build(@query)
rescue ex
conn.release
raise ex
end
@connections << WeakRef.new(conn) unless existing
unless existing
@mutex.synchronize do
@connections << WeakRef.new(conn)
end
end
stmt
end
private def clean_connections
# remove disposed or closed connections
@connections.each do |ref|
conn = ref.value
if !conn || conn.closed?
@connections.delete ref
@mutex.synchronize do
# remove disposed or closed connections
@connections.each do |ref|
conn = ref.value
if !conn || conn.closed?
@connections.delete ref
end
end
end
end

View file

@ -1,21 +1,28 @@
module DB
class StringKeyCache(T)
@cache = {} of String => T
@mutex = Mutex.new
def fetch(key : String) : T
value = @cache.fetch(key, nil)
value = @cache[key] = yield unless value
value
@mutex.synchronize do
value = @cache.fetch(key, nil)
value = @cache[key] = yield unless value
value
end
end
def each_value
@cache.each do |_, value|
yield value
@mutex.synchronize do
@cache.each do |_, value|
yield value
end
end
end
def clear
@cache.clear
@mutex.synchronize do
@cache.clear
end
end
end
end