Use select / timeout in Crystal 0.34

This commit is contained in:
Brian J. Cardiff 2020-03-25 10:56:03 -03:00
parent af200eac54
commit f4b298d3a5
1 changed files with 30 additions and 17 deletions

View File

@ -206,25 +206,38 @@ module DB
@idle.first?
end
private def wait_for_available
timeout = TimeoutHelper.new(@checkout_timeout.to_f64)
sync_inc_waiting_resource
{% if compare_versions(Crystal::VERSION, "0.34.0-0") > 0 %}
private def wait_for_available
sync_inc_waiting_resource
timeout.start
# TODO update to select keyword for crystal 0.19
index, _ = Channel.select(@availability_channel.receive_select_action, timeout.receive_select_action)
case index
when 0
timeout.cancel
sync_dec_waiting_resource
when 1
sync_dec_waiting_resource
raise DB::PoolTimeout.new
else
raise DB::Error.new
select
when @availability_channel.receive
sync_dec_waiting_resource
when timeout(@checkout_timeout.seconds)
sync_dec_waiting_resource
raise DB::PoolTimeout.new
end
end
end
{% else %}
private def wait_for_available
timeout = TimeoutHelper.new(@checkout_timeout.to_f64)
sync_inc_waiting_resource
timeout.start
index, _ = Channel.select(@availability_channel.receive_select_action, timeout.receive_select_action)
case index
when 0
timeout.cancel
sync_dec_waiting_resource
when 1
sync_dec_waiting_resource
raise DB::PoolTimeout.new
else
raise DB::Error.new
end
end
{% end %}
private def sync_inc_waiting_resource
sync { @waiting_resource += 1 }