File: request.rb

package info (click to toggle)
ruby-delayer-deferred 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 308 kB
  • sloc: ruby: 1,650; sh: 4; makefile: 2
file content (61 lines) | stat: -rw-r--r-- 1,858 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-

module Delayer::Deferred::Request
  class Base
    attr_reader :value
    def initialize(value)
      @value = value
    end
  end

=begin rdoc
Fiberが次のWorkerを要求している時に返す値。
新たなインスタンスは作らず、 _NEXT_WORKER_ にあるインスタンスを使うこと。
=end
  class NextWorker < Base
    # _deferred_ に渡された次のChainableに、 _deferred_ の戻り値を渡す要求を出す。
    # ==== Args
    # [deferred] 実行が完了したDeferred 。次のDeferredとして _deferred.child_ を呼び出す
    # [worker] このDeferredチェインを実行しているWorker
    def accept_request(worker:, deferred:)
      if deferred.has_child?
        worker.push(deferred.child)
      else
        deferred.add_child_observer(worker)
      end
    end
  end

=begin rdoc
Chainable#+@ が呼ばれた時に、一旦そこで処理を止めるためのリクエスト。
_value_ には、実行完了を待つDeferredが入っている。
==== わかりやすい!
  accept_requestメソッドの引数のdeferred {
    +value
  }
=end
  class Await < Base
    alias_method :foreign_deferred, :value
    def accept_request(worker:, deferred:)
      deferred.enter_await
      foreign_deferred.add_child(Delayer::Deferred::Chain::Await.new(worker: worker, deferred: deferred))
    end
  end

=begin rdoc
一旦処理を中断して、Delayerキューに並び直すためのリクエスト。
Tools#pass から利用される。
新たなインスタンスは作らず、 _PASS_ にあるインスタンスを使うこと。
=end
  class Pass < Base
    def accept_request(worker:, deferred:)
      deferred.enter_pass
      worker.resume_pass(deferred)
    end
  end

  NEXT_WORKER = NextWorker.new(nil).freeze
  PASS = Pass.new(nil).freeze
end