litescheduler 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f00d014342b32fc684f19226df74cb8edca44fdf4ead3f22fee4abb100ec336c
4
- data.tar.gz: 1f50457616bcbf474a92d7ab756ba68ecf9bb2164db44d63ab515d2579257551
3
+ metadata.gz: 618a3f5bfcf56ae708cd7dc413214096d6319bc4c1ad61d16e039dd31fc10b06
4
+ data.tar.gz: 64be49e2ac133e53c35405b57b3d46010c666cbbb36e6e58c6eab003bd59ad10
5
5
  SHA512:
6
- metadata.gz: ae3a5ea03ab880e48e39e8ebc13869f46f5aab4de5dd45538b069889a8c0d063e7683194428595d55fe3fd6458e1667689cbd075f2caccd1faeadef67029046b
7
- data.tar.gz: cac68f6747aadcb0998dcd67d5d251ace1be27bc24ef2d9e999ce59329cac5ca9b267dcb366995c67fd750311628ece5baba51b376e9a2742cfba23e38fdaa6b
6
+ metadata.gz: 2e0b1dd3b72fc08b607ce03f920e9843c558597d93d8275fb38b1389e04e04a303388760acec89fb0786b8d225d897f5bf93a85f03b40741804332abe462c0ec
7
+ data.tar.gz: 5091c1f247704ee8eb92dc6ad4b0ddcc55ba6e490e4928819cfcc45dbc6cde8ed63517f4e9c964086de9e6e1c1c25a751e578fe90d499c036392472484dffa2a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.1] - 2023-08-10
4
+
5
+ - Fix module/class mismatch
6
+
7
+ ## [0.2.0] - 2023-08-10
8
+
9
+ - Initial release of usable code
10
+
3
11
  ## [0.1.0] - 2023-08-10
4
12
 
5
- - Initial release
13
+ - Initial release to reserve gem name
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- litescheduler (0.1.0)
4
+ litescheduler (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Litescheduler
4
- VERSION = "0.1.0"
3
+ class Litescheduler
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/litescheduler.rb CHANGED
@@ -1,8 +1,102 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "litescheduler/version"
4
+ require "singleton"
4
5
 
5
- module Litescheduler
6
- class Error < StandardError; end
7
- # Your code goes here...
6
+ class Litescheduler
7
+ include Singleton
8
+
9
+ attr_reader :environment, :scheduler, :max_contexts, :storage, :context, :mutex
10
+
11
+ def initialize
12
+ @environment = detect_environment
13
+ @scheduler = detect_scheduler
14
+ @max_contexts = detect_max_contexts
15
+ @storage = detect_storage
16
+ @context = detect_context
17
+ # a single mutex per process (is that ok?)
18
+ @mutex = Thread::Mutex.new
19
+ end
20
+
21
+ # spawn a new execution context
22
+ def spawn(&block)
23
+ case @scheduler
24
+ when :fiber then Fiber.schedule(&block)
25
+ when :polyphony then spin(&block)
26
+ when :iodine then Thread.new(&block)
27
+ when :threaded then Thread.new(&block)
28
+ else
29
+ raise StandardError.new("Unknown scheduler: `#{@scheduler}`")
30
+ end
31
+ end
32
+
33
+ # switch the execution context to allow others to run
34
+ def switch
35
+ if @scheduler == :fiber
36
+ Fiber.scheduler.yield
37
+ true
38
+ elsif @scheduler == :polyphony
39
+ Fiber.current.schedule
40
+ Thread.current.switch_fiber
41
+ true
42
+ else
43
+ # Thread.pass
44
+ false
45
+ end
46
+ end
47
+
48
+ # bold assumption, we will only synchronize threaded code
49
+ # this is a no-op for fibers
50
+ def synchronize(&block)
51
+ # do nothing, just run the block as is
52
+ return yield if @scheduler == :fiber
53
+ return yield if @scheduler == :polyphony
54
+
55
+ @mutex.synchronize(&block)
56
+ end
57
+
58
+ private
59
+
60
+ # Detect the Rack or Rails environment.
61
+ def detect_environment
62
+ return Rails.env if defined? Rails
63
+ return ENV["RACK_ENV"] if ENV.key?("RACK_ENV")
64
+ return ENV["APP_ENV"] if ENV.key?("APP_ENV")
65
+
66
+ "development"
67
+ end
68
+
69
+ # identify which scheduler we are running in
70
+ # we currently support :fiber, :polyphony, :iodine & :threaded
71
+ # in the future we might want to expand to other schedulers
72
+ def detect_scheduler
73
+ return :fiber if Fiber.scheduler
74
+ return :polyphony if defined? Polyphony
75
+ return :iodine if defined? Iodine
76
+
77
+ :threaded
78
+ end
79
+
80
+ def detect_max_contexts
81
+ return 50 if scheduler == :fiber
82
+ return 50 if scheduler == :polyphony
83
+
84
+ 5
85
+ end
86
+
87
+ def detect_storage
88
+ if scheduler == :fiber || scheduler == :poylphony
89
+ Fiber.current.storage
90
+ else
91
+ Thread.current
92
+ end
93
+ end
94
+
95
+ def detect_context
96
+ if scheduler == :fiber || scheduler == :poylphony
97
+ Fiber.current
98
+ else
99
+ Thread.current
100
+ end
101
+ end
8
102
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litescheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mohamed Hassan