Finished evicting Thread- probably more fiber scheduling to do while I figure out how to put Tasks into a Ractor

This commit is contained in:
2021-12-26 13:46:48 -06:00
parent 2bbb2acc6e
commit 52e46eced5
4 changed files with 20 additions and 16 deletions

View File

@@ -126,15 +126,12 @@ class W3DHub
# /apis/launcher/1/get-package-details # /apis/launcher/1/get-package-details
# client requests package details: data={"packages":[{"category":"games","name":"apb.ico","subcategory":"apb","version":""}]} # client requests package details: data={"packages":[{"category":"games","name":"apb.ico","subcategory":"apb","version":""}]}
def self.package_details(packages) def self.package_details(internet, packages)
response = Excon.post( body = "data=#{JSON.dump({ packages: packages })}"
"#{ENDPOINT}/apis/launcher/1/get-package-details", response = internet.post("#{ENDPOINT}/apis/launcher/1/get-package-details", FORM_ENCODED_HEADERS, body)
headers: DEFAULT_HEADERS.merge({"Content-Type": "application/x-www-form-urlencoded"}),
body: "data=#{JSON.dump({ packages: packages })}"
)
if response.status == 200 if response.success?
hash = JSON.parse(response.body, symbolize_names: true) hash = JSON.parse(response.read, symbolize_names: true)
packages = hash[:packages].map { |pkg| Package.new(pkg) } packages = hash[:packages].map { |pkg| Package.new(pkg) }
return packages.first if packages.size == 1 return packages.first if packages.size == 1
return packages return packages
@@ -147,8 +144,8 @@ class W3DHub
# client requests package: data={"category":"games","name":"ECW_Asteroids.zip","subcategory":"ecw","version":"1.0.0.0"} # client requests package: data={"category":"games","name":"ECW_Asteroids.zip","subcategory":"ecw","version":"1.0.0.0"}
# #
# server responds with download bytes, probably supports chunked download and resume # server responds with download bytes, probably supports chunked download and resume
def self.package(package, &block) def self.package(internet, package, &block)
Cache.fetch_package(package, block) Cache.fetch_package(internet, package, block)
end end
#! === Server List API === !# #! === Server List API === !#

View File

@@ -29,7 +29,7 @@ class W3DHub
@die = false @die = false
@job = nil @job = nil
Thread.new do Async do
until (@die) until (@die)
@job.process if @job && @job.waiting? @job.process if @job && @job.waiting?
@job = nil @job = nil

View File

@@ -48,7 +48,7 @@ class W3DHub
def start def start
@task_state = :running @task_state = :running
Thread.new do Async do
status = execute_task status = execute_task
# Force free some bytes # Force free some bytes
@@ -221,7 +221,8 @@ class W3DHub
} }
end end
package_details = Api.package_details(hashes) internet = Async::HTTP::Internet.instance
package_details = Api.package_details(internet, hashes)
if package_details if package_details
@packages = [package_details].flatten @packages = [package_details].flatten
@@ -427,6 +428,8 @@ class W3DHub
while (chunk = f.read(32_000_000)) while (chunk = f.read(32_000_000))
digest.update(chunk) digest.update(chunk)
current = Async::Task.current?
current&.yield
end end
f.close f.close
@@ -448,7 +451,9 @@ class W3DHub
def fetch_manifest(category, subcategory, name, version, &block) def fetch_manifest(category, subcategory, name, version, &block)
# Check for and integrity of local manifest # Check for and integrity of local manifest
package = Api.package_details([{ category: category, subcategory: subcategory, name: name, version: version }]) internet = Async::HTTP::Internet.instance
package = Api.package_details(internet, [{ category: category, subcategory: subcategory, name: name, version: version }])
if File.exist?(Cache.package_path(category, subcategory, name, version)) if File.exist?(Cache.package_path(category, subcategory, name, version))
verified = verify_package(package) verified = verify_package(package)
@@ -465,7 +470,9 @@ class W3DHub
def package_fetch(package, &block) def package_fetch(package, &block)
puts "Downloading: #{package.category}:#{package.subcategory}:#{package.name}-#{package.version}" puts "Downloading: #{package.category}:#{package.subcategory}:#{package.name}-#{package.version}"
Api.package(package) do |chunk, remaining_bytes, total_bytes| internet = Async::HTTP::Internet.instance
Api.package(internet, package) do |chunk, remaining_bytes, total_bytes|
# Store progress somewhere # Store progress somewhere
# Kernel.puts "#{name}-#{version}: #{(remaining_bytes.to_f / total_bytes).round}%" # Kernel.puts "#{name}-#{version}: #{(remaining_bytes.to_f / total_bytes).round}%"

View File

@@ -44,7 +44,7 @@ class W3DHub
end end
# Download a W3D Hub package # Download a W3D Hub package
def self.fetch_package(package, block) def self.fetch_package(internet, package, block)
path = package_path(package.category, package.subcategory, package.name, package.version) path = package_path(package.category, package.subcategory, package.name, package.version)
headers = { "Content-Type": "application/x-www-form-urlencoded" } headers = { "Content-Type": "application/x-www-form-urlencoded" }
start_from_bytes = package.custom_partially_valid_at_bytes start_from_bytes = package.custom_partially_valid_at_bytes