github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/net/textproto/pipeline.go (about)

     1  // Copyright 2010 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package textproto
     6  
     7  import (
     8  	"github.com/shogo82148/std/sync"
     9  )
    10  
    11  // パイプラインは、順番にリクエストとレスポンスを管理するためのものです。
    12  //
    13  // 接続上の複数のクライアントを管理するために、Pipeline p を使用する場合、
    14  // それぞれのクライアントは次のように実行する必要があります:
    15  //
    16  //	id := p.Next()	// 番号を取得する
    17  //
    18  //	p.StartRequest(id)	// リクエストを送信する順番を待つ
    19  //	«リクエストを送信する»
    20  //	p.EndRequest(id)	// リクエストの送信が完了したことをPipelineに通知する
    21  //
    22  //	p.StartResponse(id)	// レスポンスを読み取る順番を待つ
    23  //	«レスポンスを読み取る»
    24  //	p.EndResponse(id)	// レスポンスの読み取りが完了したことをPipelineに通知する
    25  //
    26  // パイプラインサーバーでも、同じ呼び出しを使用して、並列で計算されたレスポンスを正しい順序で書き込むことができます。
    27  type Pipeline struct {
    28  	mu       sync.Mutex
    29  	id       uint
    30  	request  sequencer
    31  	response sequencer
    32  }
    33  
    34  // Nextはリクエスト/レスポンスのペアの次のIDを返します。
    35  func (p *Pipeline) Next() uint
    36  
    37  // StartRequestは、指定したIDでリクエストを送信(または、サーバーの場合は受信)する時間になるまでブロックします。
    38  func (p *Pipeline) StartRequest(id uint)
    39  
    40  // EndRequestは、与えられたIDを持つリクエストが送信されたことをpに通知します
    41  // (または、これがサーバーの場合は受信されました)。
    42  func (p *Pipeline) EndRequest(id uint)
    43  
    44  // StartResponseは、指定したidのリクエストを受信する(または、サーバーの場合は送信する)時までブロックします。
    45  func (p *Pipeline) StartResponse(id uint)
    46  
    47  // EndResponseは、指定されたIDのレスポンスが受信されたことをpに通知します
    48  // (または、サーバーの場合は送信されます)。
    49  func (p *Pipeline) EndResponse(id uint)