<commit_before>module Subversion.Stream.Pipe
    ( newPipe 
    )
    where

import           Control.Concurrent.STM
import qualified Data.ByteString      as Strict
import qualified Data.ByteString.Lazy as Lazy
import           Subversion.Stream


data Pipe
    = Pipe {
        pWrittenStr  :: TVar Lazy.ByteString -- 書き込まれたが、未だ讀込まれてゐない文字列
      , pIsClosed    :: TVar Bool            -- パイプが閉ぢられた
      }


newPipe :: IO Stream
newPipe = do str <- newTVarIO Lazy.empty
             isC <- newTVarIO False
             
             let pipe    = Pipe {
                             pWrittenStr  = str
                           , pIsClosed    = isC
                           }
                 actions = StreamActions {
                             saRead  = mkReadAction  pipe
                           , saWrite = mkWriteAction pipe
                           , saClose = mkCloseAction pipe
                           }

             newStream actions
<commit_msg>Added warning comment<commit_after>module Subversion.Stream.Pipe
    ( newPipe 
    )
    where

{-
  !!!!!!!!!! 警告 !!!!!!!!!!

  實裝を見れば判ると思ふが、このパイプは讀み込みが追ひ付かなくても書き
  込み側がブロックされない。一つの native thread（複數の GHC thread）で
  svn_repos_fs_commit_txn と svn_stream_read が STM を使って互ひにブロッ
  クし合ふと何故か CPU を 100% 喰ひ潰してハングアップする爲である。
  foreign function wrapper からの STM トランザクションに問題があるのか
  も知れないが、何れにせよ原因は不明。発現した GHC のバージョンは
  6.8.2。

  現在の實裝ではパイプに書き込まれた内容は讀み取られるまで一方的にメモ
  リに蓄積されるので注意を要する。使ひ方によっては DoS 攻撃の的にされ得
  る。
-}

import           Control.Concurrent.STM
import qualified Data.ByteString      as Strict
import qualified Data.ByteString.Lazy as Lazy
import           Subversion.Stream


data Pipe
    = Pipe {
        pWrittenStr  :: TVar Lazy.ByteString -- 書き込まれたが、未だ讀込まれてゐない文字列
      , pIsClosed    :: TVar Bool            -- パイプが閉ぢられた
      }


newPipe :: IO Stream
newPipe = do str <- newTVarIO Lazy.empty
             isC <- newTVarIO False
             
             let pipe    = Pipe {
                             pWrittenStr  = str
                           , pIsClosed    = isC
                           }
                 actions = StreamActions {
                             saRead  = mkReadAction  pipe
                           , saWrite = mkWriteAction pipe
                           , saClose = mkCloseAction pipe
                           }

             newStream actions

{'fraction_non_alphanumeric': 0.05737356566085848, 'fraction_numerical': 0.0025499362515937103, 'mean_word_length': 1.3850050658561297, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5416206', 'n_tokens_mistral': 888, 'n_tokens_neox': 851, 'n_words': 155}