Commits

Yoshifumi YAMAGUCHI committed fd86816

in Arbiter.wakeup()

  • Participants
  • Parent commits e01febf

Comments (0)

Files changed (2)

File notes/source/gunicorn/arbiter.rst

 
    .. attribute:: PIPE
 
+      - :meth:`init_signals`
+
    .. attribute:: LISTENER
 
+      - :meth:`start`
+
+   .. attribute:: SIGNALS
+
+      - :meth:`init_signals`
+
+   .. attribute:: SIG_QUEUE
+
+      - :meth:`signal`
+
 
    .. method:: run()
 
 
       - pidを取得する
       - :meth:`init_signals` 呼ぶ
-      - LISTENERがなければ :meth:`gunicorn.sock.create_socket` 呼ぶ
+      - :attr:`LISTENER` がなければ :meth:`gunicorn.sock.create_socket` 呼ぶ
 
       .. code-block:: python
 
 
       **概要**
 
-      - まずPIPEがあったら全部閉じる(`os.close()`)
-      - os.pipe()でパイプを作成する
-      - :func:`util.set_non_blocking` する
-      - :func:`util.close_on_exec` する
+      - まず :attr:`PIPE` があったら全部閉じる(`os.close()`)
+      - `os.pipe()` でパイプを作成する
       
+        - `os.pipe()` はファイルディスクリプタのペア ``(r, w)`` を返し、それぞれが読み出しと書き出しになっている。
+      
+      - :func:`util.set_non_blocking` を呼び出して、いま作成したパイプをノンブロッキングにする。
+      - :func:`util.close_on_exec` を呼び出して、パイプが他のプロセスから呼ばれていた場合に `exec()` 時にクローズするようにする。
+      - :attr:`SIGNALS` の各非同期イベントシグナルを `signal.signal()`_ に渡して、それぞれに対するハンドラを :meth:`signal` にする。
+
+      .. _`signal.signal()`: http://www.python.jp/doc/2.6/library/signal.html#signal.signal
 
       **実装**
    
       - :meth:`start`
 
 
+   .. method:: signal(sig, frame)
+
+      **概要**
+
+      :param sig: シグナル
+      :param frame: 使わない
+
+      :attr:`SIG_QUEUE` の長さが5以下だったときに ``sig`` を追加し :meth:`wakeup` を呼ぶ。それ以上の長さの場合は来たを無視する。
+
+      **実装**
+
+      .. code-block:: python
+
+         def signal(self, sig, frame):
+             if len(self.SIG_QUEUE) < 5:
+                 self.SIG_QUEUE.append(sig)
+                 self.wakeup()
+             else:
+                 self.log.warn("Dropping signal: %s" % sig)
+
+
+      **呼び出し**
+
+      - :meth:`init_signals`      
+
+
    .. method:: sleep()
 
       `select.select()` を叩いて
    .. method:: murder_workers()
 
 
+   .. method:: wakeup()
+
+      **概要**
+
+      
+
+      **実装**
+
+      .. code-block:: python
+
+         def wakeup(self):
+             """\
+             Wake up the arbiter by writing to the PIPE
+             """
+             try:
+                 os.write(self.PIPE[1], '.')
+             except IOError, e:
+                 if e.errno not in [errno.EAGAIN, errno.EINTR]:
+                     raise
+      
+      **呼び出し**
+
+      - :meth:`signal`

File notes/source/gunicorn/util.rst

 
    `fnctl.fnctl()`_ で `fd` のファイル状態フラグを取得( `fcntl.F_GETFL` )して、ノンブロッキングのフラグを加える。( `os.O_NONBLOCK` のビットマスクをかける)。その状態でファイルディスクリプタの値を更新する。
 
+   :param fd: ファイルディスクリプタ
+
    .. _`fnctl.fnctl()`: http://www.python.jp/doc/2.6/library/fcntl.html#fcntl.fcntl
    
    **実装**
 
    詳細は `こちら <http://www.jpcert.or.jp/sc-rules/c-fio42-c.html>`_
 
+   :param fd: ファイルディスクリプタ
+
    .. _`FD_CLOEXEC`: http://kazmax.zpp.jp/cmd/f/fcntl.2.html
 
    **実装**
 
    **呼び出し**
 
-   - :meth:`Arbiter.init_signal`
+   - :meth:`Arbiter.init_signals`