MacRuby DoJo (道場)

Dispatch::Source クラス

Dispatch::Source クラスは何らかのイベントが発生するときに、イベントをハンドリングして処理を実行する仕組みを提供します。

Dispatch::Source クラスの定数

  • Dispatch::Source::DATA_ADD
  • Dispatch::Source::DATA_OR
  • Dispatch::Source::PROC
  • Dispatch::Source::SIGNAL
  • Dispatch::Source::READ
  • Dispatch::Source::WRITE
  • Dispatch::Source::VNODE

  • Dispatch::Source::PROC_EXIT
  • Dispatch::Source::PROC_FORK
  • Dispatch::Source::PROC_EXEC
  • Dispatch::Source::PROC_SIGNAL

  • Dispatch::Source::VNODE_DELETE
  • Dispatch::Source::VNODE_WRITE
  • Dispatch::Source::VNODE_EXTEND
  • Dispatch::Source::VNODE_ATTRIB
  • Dispatch::Source::VNODE_LINK
  • Dispatch::Source::VNODE_RENAME
  • Dispatch::Source::VNODE_REVOKE

Dispatch Source の種類として、以下のものを使用できます。

定数名GCD API での定義内容
Dispatch::Source::DATA_ADD DISPATCH_SOURCE_TYPE_DATA_ADD << メソッドを通じてイベントが発生し、処理を実行します。
Dispatch::Source::DATA_OR DISPATCH_SOURCE_TYPE_DATA_OR << メソッドを通じてイベントが発生し、処理を実行します。
Dispatch::Source::PROC DISPATCH_SOURCE_TYPE_PROC プロセスに関するイベントを受けると、処理を実行します。
Dispatch::Source::SIGNAL DISPATCH_SOURCE_TYPE_SIGNAL シグナルを受けると、処理を実行します。
Dispatch::Source::READ DISPATCH_SOURCE_TYPE_READ ファイルディスクリプタが読み込み可能になると、処理を実行します。
Dispatch::Source::WRITE DISPATCH_SOURCE_TYPE_WRITE ファイルディスクリプタが書き込み可能になると、処理を実行します。
Dispatch::Source::VNODE DISPATCH_SOURCE_TYPE_VNODE ファイルが削除されたりファイルシステム上で変更があると、処理を実行します。

Dispatch::Source::PROC を使用する際に、以下の定数をマスクとして使用できます。

Dispatch::Source::PROC_EXIT DISPATCH_PROC_EXIT プロセスが終了した。
Dispatch::Source::PROC_FORK DISPATCH_PROC_FORK 子プロセスを作成した。
Dispatch::Source::PROC_EXEC DISPATCH_PROC_EXEC exec や posix_spawn で別のプロセスを実行した。
Dispatch::Source::PROC_SIGNAL DISPATCH_PROC_SIGNAL シグナルを送信した。

Dispatch::Source::VNODE を使用する際に、以下の定数をマスクとして使用できます。

Dispatch::Source::VNODE_DELETE DISPATCH_VNODE_DELETE ファイルなどが削除された。
Dispatch::Source::VNODE_WRITE DISPATCH_VNODE_WRITE ファイルなどのデータが変更された。
Dispatch::Source::VNODE_EXTEND DISPATCH_VNODE_EXTEND ファイルサイズが変更された。
Dispatch::Source::VNODE_ATTRIB DISPATCH_VNODE_ATTRIB ファイルなどのメタ情報が変更された。
Dispatch::Source::VNODE_LINK DISPATCH_VNODE_LINK The file-system object link count changed.
Dispatch::Source::VNODE_RENAME DISPATCH_VNODE_RENAME ファイル名が変更された。
Dispatch::Source::VNODE_REVOKE DISPATCH_VNODE_REVOKE The file-system object was revoked.

Dispatch Source は他のクラスよりもわかりにくいと思います。MacRuby のリポジトリにある source_spec.rb を参考にしたりすると良いでしょう。

Dispatch::Source クラスのメソッド

Dispatch::Source.new

Dispatch Source を生成し返します。

  • new(type, handle, mask, queue) { … } -> Source
    • [PARAM] type:
      • Dispatch Source の種類を指定します。
    • [PARAM] handle:
      • イベントを監視するためのディスクリプタを指定します。type に DATA_ADDDATA_OR を指定した場合には、handle0 とします。
    • [PARAM] mask:
      • マスクを指定できる Dispatch Source の種類を type で使用した際に指定します。
    • [PARAM] queue:
      • イベントが発生したときに、block の処理を追加する Dispatch Queue を指定します。
    • [RETURN]
      • 生成した Dispatch Source のインスタンスを返します。

Dispatch::Source.timer

タイマーイベント用の Dispatch Source を生成し返します。

  • timer(delay, interval, leeway, queue) { … } -> Source
    • [PARAM] delay:
      • 何秒後からタイマーを開始するか指定します。nil の場合には Dispatch::TIME_NOW が指定されたのと同じになります
    • [PARAM] interval:
      • 何秒間隔で繰り返すか指定します。
    • [PARAM] leeway:
      • 何秒までの遅れを許容するか指定します。
    • [PARAM] queue:
      • イベントが発生したときに、block の処理を追加する Dispatch Queue を指定します。
    • [RETURN]
      • 生成した Dispatch Source のインスタンスを返します。
1
2
3
4
5
6
gcdq = Dispatch::Queue.new('sample')
timer = Dispatch::Source.timer(0.5, 1, 0.5, gcdq) do |s|
  puts "Wake up!"
end

sleep 3

Dispatch::Source#cancelled?

Dispatch Source がキャンセルされているか返します。

  • cancelled? -> bool
    • [RETURN]
      • キャンセルされていれば true、そうでなれば false を返します。

Dispatch::Source#cancel!

Dispatch Source をキャンセルします。

  • cancel!
1
2
3
4
5
6
7
8
9
10
11
gcdq = Dispatch::Queue.new('sample')
timer = Dispatch::Source.timer(1, 0.5, 0, gcdq) do |s|
  puts "Wake up!"
end

sleep 2

timer.cancel!
p timer.cancelled? # => true

sleep 1

Dispatch::Source#handle

Dispatch Source の handle を返します。

  • handle
    • [RETURN]
      • Dispatch Source の handle を返します。

Dispatch::Source#mask

Dispatch Source の mask を返します。GCD API の dispatch_source_get_mask に相当します。

  • mask
    • [RETURN]
      • Dispatch Source の mask を返します。

Dispatch::Source#data

Dispatch Source でまだ処理されていないデータを返します。GCD API の dispatch_source_get_data に相当します。

  • data
    • [RETURN]
      • Dispatch Source でまだ処理されていないデータを返します。

Dispatch Source の種類によって、以下のようなデータを返します。

Dispatch::Source::DATA_ADD <<で送信されたデータ
Dispatch::Source::DATA_OR <<で送信されたデータ
Dispatch::Source::PROC Dispatch::Source::PROC_EXIT、Dispatch::Source::PROC_FORK、Dispatch::Source::PROC_EXEC、Dispatch::Source::PROC_SIGNAL のいずれか
Dispatch::Source::SIGNAL シグナルの番号
Dispatch::Source::READ 読み込み可能なバイト数
1
2
3
4
5
6
gcdq = Dispatch::Queue.new('sample')
src = Dispatch::Source.new(Dispatch::Source::DATA_ADD, 0, 0, gcdq) do |s|
  puts s.data
end
src << 1
sleep 0.5

Dispatch::Source#<<

Dispatch::Source::DATA_ADD と Dispatch::Source::DATA_OR を指定した Dispatch Source で使用します。指定したデータを Dispatch Source の block へ送信します。GCD API の dispatch_source_get_data に相当します。

  • << data

Comments