/usr/share/doc/libghc-resource-pool-doc/html/src/Data-Pool.html is in libghc-resource-pool-doc 0.2.1.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Data/Pool.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP, NamedFieldPuns, RecordWildCards, ScopedTypeVariables #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-cpp'>#if MIN_VERSION_monad_control(0,3,0)</span>
<a name="line-4"></a><span class='hs-comment'>{-# LANGUAGE FlexibleContexts #-}</span>
<a name="line-5"></a><span class='hs-cpp'>#endif</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-cpp'>#if !MIN_VERSION_base(4,3,0)</span>
<a name="line-8"></a><span class='hs-comment'>{-# LANGUAGE RankNTypes #-}</span>
<a name="line-9"></a><span class='hs-cpp'>#endif</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-comment'>-- |</span>
<a name="line-12"></a><span class='hs-comment'>-- Module: Data.Pool</span>
<a name="line-13"></a><span class='hs-comment'>-- Copyright: (c) 2011 MailRank, Inc.</span>
<a name="line-14"></a><span class='hs-comment'>-- License: BSD3</span>
<a name="line-15"></a><span class='hs-comment'>-- Maintainer: Bryan O'Sullivan <bos@serpentine.com></span>
<a name="line-16"></a><span class='hs-comment'>-- Stability: experimental</span>
<a name="line-17"></a><span class='hs-comment'>-- Portability: portable</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- A high-performance striped pooling abstraction for managing</span>
<a name="line-20"></a><span class='hs-comment'>-- flexibly-sized collections of resources such as database</span>
<a name="line-21"></a><span class='hs-comment'>-- connections.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- \"Striped\" means that a single 'Pool' consists of several</span>
<a name="line-24"></a><span class='hs-comment'>-- sub-pools, each managed independently. A stripe size of 1 is fine</span>
<a name="line-25"></a><span class='hs-comment'>-- for many applications, and probably what you should choose by</span>
<a name="line-26"></a><span class='hs-comment'>-- default. Larger stripe sizes will lead to reduced contention in</span>
<a name="line-27"></a><span class='hs-comment'>-- high-performance multicore applications, at a trade-off of causing</span>
<a name="line-28"></a><span class='hs-comment'>-- the maximum number of simultaneous resources in use to grow.</span>
<a name="line-29"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Pool</span>
<a name="line-30"></a> <span class='hs-layout'>(</span>
<a name="line-31"></a> <span class='hs-conid'>Pool</span><span class='hs-layout'>(</span><span class='hs-varid'>idleTime</span><span class='hs-layout'>,</span> <span class='hs-varid'>maxResources</span><span class='hs-layout'>,</span> <span class='hs-varid'>numStripes</span><span class='hs-layout'>)</span>
<a name="line-32"></a> <span class='hs-layout'>,</span> <span class='hs-conid'>LocalPool</span>
<a name="line-33"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>createPool</span>
<a name="line-34"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>withResource</span>
<a name="line-35"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>takeResource</span>
<a name="line-36"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>destroyResource</span>
<a name="line-37"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>putResource</span>
<a name="line-38"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-39"></a>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'><$></span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Concurrent</span> <span class='hs-layout'>(</span><span class='hs-varid'>forkIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>killThread</span><span class='hs-layout'>,</span> <span class='hs-varid'>myThreadId</span><span class='hs-layout'>,</span> <span class='hs-varid'>threadDelay</span><span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Concurrent</span><span class='hs-varop'>.</span><span class='hs-conid'>STM</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-layout'>(</span><span class='hs-conid'>SomeException</span><span class='hs-layout'>,</span> <span class='hs-varid'>catch</span><span class='hs-layout'>,</span> <span class='hs-varid'>onException</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-varid'>forM_</span><span class='hs-layout'>,</span> <span class='hs-varid'>forever</span><span class='hs-layout'>,</span> <span class='hs-varid'>join</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftM2</span><span class='hs-layout'>,</span> <span class='hs-varid'>unless</span><span class='hs-layout'>,</span> <span class='hs-varid'>when</span><span class='hs-layout'>)</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Hashable</span> <span class='hs-layout'>(</span><span class='hs-varid'>hash</span><span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>partition</span><span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span><span class='hs-varop'>.</span><span class='hs-conid'>Clock</span> <span class='hs-layout'>(</span><span class='hs-conid'>NominalDiffTime</span><span class='hs-layout'>,</span> <span class='hs-conid'>UTCTime</span><span class='hs-layout'>,</span> <span class='hs-varid'>diffUTCTime</span><span class='hs-layout'>,</span> <span class='hs-varid'>getCurrentTime</span><span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>catch</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Mem</span><span class='hs-varop'>.</span><span class='hs-conid'>Weak</span> <span class='hs-layout'>(</span><span class='hs-varid'>addFinalizer</span><span class='hs-layout'>)</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>V</span>
<a name="line-51"></a>
<a name="line-52"></a><span class='hs-cpp'>#if MIN_VERSION_monad_control(0,3,0)</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span><span class='hs-varop'>.</span><span class='hs-conid'>Control</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadBaseControl</span><span class='hs-layout'>,</span> <span class='hs-varid'>control</span><span class='hs-layout'>)</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftBase</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-cpp'>#else</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Control</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadControlIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>controlIO</span><span class='hs-layout'>)</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Class</span> <span class='hs-layout'>(</span><span class='hs-varid'>liftIO</span><span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-cpp'>#define control controlIO</span>
<a name="line-59"></a><span class='hs-cpp'>#define liftBase liftIO</span>
<a name="line-60"></a><span class='hs-cpp'>#endif</span>
<a name="line-61"></a>
<a name="line-62"></a><span class='hs-cpp'>#if MIN_VERSION_base(4,3,0)</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-layout'>(</span><span class='hs-varid'>mask</span><span class='hs-layout'>)</span>
<a name="line-64"></a><span class='hs-cpp'>#else</span>
<a name="line-65"></a><a name="mask"></a><span class='hs-comment'>-- Don't do any async exception protection for older GHCs.</span>
<a name="line-66"></a><span class='hs-definition'>mask</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span><span class='hs-varop'>.</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>b</span>
<a name="line-67"></a><span class='hs-definition'>mask</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>id</span>
<a name="line-68"></a><span class='hs-cpp'>#endif</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="Entry"></a><span class='hs-comment'>-- | A single resource pool entry.</span>
<a name="line-71"></a><a name="Entry"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Entry</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Entry</span> <span class='hs-layout'>{</span>
<a name="line-72"></a> <span class='hs-varid'>entry</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
<a name="line-73"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>lastUse</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UTCTime</span>
<a name="line-74"></a> <span class='hs-comment'>-- ^ Time of last return.</span>
<a name="line-75"></a> <span class='hs-layout'>}</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="LocalPool"></a><span class='hs-comment'>-- | A single striped pool.</span>
<a name="line-78"></a><a name="LocalPool"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LocalPool</span> <span class='hs-layout'>{</span>
<a name="line-79"></a> <span class='hs-varid'>inUse</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TVar</span> <span class='hs-conid'>Int</span>
<a name="line-80"></a> <span class='hs-comment'>-- ^ Count of open entries (both idle and in use).</span>
<a name="line-81"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>entries</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TVar</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Entry</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-82"></a> <span class='hs-comment'>-- ^ Idle entries.</span>
<a name="line-83"></a> <span class='hs-layout'>}</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="Pool"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pool</span> <span class='hs-layout'>{</span>
<a name="line-86"></a> <span class='hs-varid'>create</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-87"></a> <span class='hs-comment'>-- ^ Action for creating a new entry to add to the pool.</span>
<a name="line-88"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>destroy</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-89"></a> <span class='hs-comment'>-- ^ Action for destroying an entry that is now done with.</span>
<a name="line-90"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>numStripes</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-91"></a> <span class='hs-comment'>-- ^ Stripe count. The number of distinct sub-pools to maintain.</span>
<a name="line-92"></a> <span class='hs-comment'>-- The smallest acceptable value is 1.</span>
<a name="line-93"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>idleTime</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NominalDiffTime</span>
<a name="line-94"></a> <span class='hs-comment'>-- ^ Amount of time for which an unused resource is kept alive.</span>
<a name="line-95"></a> <span class='hs-comment'>-- The smallest acceptable value is 0.5 seconds.</span>
<a name="line-96"></a> <span class='hs-comment'>--</span>
<a name="line-97"></a> <span class='hs-comment'>-- The elapsed time before closing may be a little longer than</span>
<a name="line-98"></a> <span class='hs-comment'>-- requested, as the reaper thread wakes at 1-second intervals.</span>
<a name="line-99"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>maxResources</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-100"></a> <span class='hs-comment'>-- ^ Maximum number of resources to maintain per stripe. The</span>
<a name="line-101"></a> <span class='hs-comment'>-- smallest acceptable value is 1.</span>
<a name="line-102"></a> <span class='hs-comment'>-- </span>
<a name="line-103"></a> <span class='hs-comment'>-- Requests for resources will block if this limit is reached on a</span>
<a name="line-104"></a> <span class='hs-comment'>-- single stripe, even if other stripes have idle resources</span>
<a name="line-105"></a> <span class='hs-comment'>-- available.</span>
<a name="line-106"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>localPools</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-107"></a> <span class='hs-comment'>-- ^ Per-capability resource pools.</span>
<a name="line-108"></a> <span class='hs-layout'>}</span>
<a name="line-109"></a>
<a name="line-110"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-111"></a> <span class='hs-varid'>show</span> <span class='hs-conid'>Pool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Pool {numStripes = "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>numStripes</span> <span class='hs-varop'>++</span> <span class='hs-str'>", "</span> <span class='hs-varop'>++</span>
<a name="line-112"></a> <span class='hs-str'>"idleTime = "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>idleTime</span> <span class='hs-varop'>++</span> <span class='hs-str'>", "</span> <span class='hs-varop'>++</span>
<a name="line-113"></a> <span class='hs-str'>"maxResources = "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>maxResources</span> <span class='hs-varop'>++</span> <span class='hs-str'>"}"</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="createPool"></a><span class='hs-definition'>createPool</span>
<a name="line-116"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-117"></a> <span class='hs-comment'>-- ^ Action that creates a new resource.</span>
<a name="line-118"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-119"></a> <span class='hs-comment'>-- ^ Action that destroys an existing resource.</span>
<a name="line-120"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span>
<a name="line-121"></a> <span class='hs-comment'>-- ^ Stripe count. The number of distinct sub-pools to maintain.</span>
<a name="line-122"></a> <span class='hs-comment'>-- The smallest acceptable value is 1.</span>
<a name="line-123"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NominalDiffTime</span>
<a name="line-124"></a> <span class='hs-comment'>-- ^ Amount of time for which an unused resource is kept open.</span>
<a name="line-125"></a> <span class='hs-comment'>-- The smallest acceptable value is 0.5 seconds.</span>
<a name="line-126"></a> <span class='hs-comment'>--</span>
<a name="line-127"></a> <span class='hs-comment'>-- The elapsed time before destroying a resource may be a little</span>
<a name="line-128"></a> <span class='hs-comment'>-- longer than requested, as the reaper thread wakes at 1-second</span>
<a name="line-129"></a> <span class='hs-comment'>-- intervals.</span>
<a name="line-130"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span>
<a name="line-131"></a> <span class='hs-comment'>-- ^ Maximum number of resources to keep open per stripe. The</span>
<a name="line-132"></a> <span class='hs-comment'>-- smallest acceptable value is 1.</span>
<a name="line-133"></a> <span class='hs-comment'>-- </span>
<a name="line-134"></a> <span class='hs-comment'>-- Requests for resources will block if this limit is reached on a</span>
<a name="line-135"></a> <span class='hs-comment'>-- single stripe, even if other stripes have idle resources</span>
<a name="line-136"></a> <span class='hs-comment'>-- available.</span>
<a name="line-137"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-138"></a><span class='hs-definition'>createPool</span> <span class='hs-varid'>create</span> <span class='hs-varid'>destroy</span> <span class='hs-varid'>numStripes</span> <span class='hs-varid'>idleTime</span> <span class='hs-varid'>maxResources</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-139"></a> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>numStripes</span> <span class='hs-varop'><</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-140"></a> <span class='hs-varid'>modError</span> <span class='hs-str'>"pool "</span> <span class='hs-varop'>$</span> <span class='hs-str'>"invalid stripe count "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>numStripes</span>
<a name="line-141"></a> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>idleTime</span> <span class='hs-varop'><</span> <span class='hs-num'>0.5</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-142"></a> <span class='hs-varid'>modError</span> <span class='hs-str'>"pool "</span> <span class='hs-varop'>$</span> <span class='hs-str'>"invalid idle time "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>idleTime</span>
<a name="line-143"></a> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>maxResources</span> <span class='hs-varop'><</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-144"></a> <span class='hs-varid'>modError</span> <span class='hs-str'>"pool "</span> <span class='hs-varop'>$</span> <span class='hs-str'>"invalid maximum resource count "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>maxResources</span>
<a name="line-145"></a> <span class='hs-varid'>localPools</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>atomically</span> <span class='hs-varop'>.</span> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-varid'>replicateM</span> <span class='hs-varid'>numStripes</span> <span class='hs-varop'>$</span>
<a name="line-146"></a> <span class='hs-varid'>liftM2</span> <span class='hs-conid'>LocalPool</span> <span class='hs-layout'>(</span><span class='hs-varid'>newTVar</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>newTVar</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-147"></a> <span class='hs-varid'>reaperId</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>forkIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reaper</span> <span class='hs-varid'>destroy</span> <span class='hs-varid'>idleTime</span> <span class='hs-varid'>localPools</span>
<a name="line-148"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Pool</span> <span class='hs-layout'>{</span>
<a name="line-149"></a> <span class='hs-varid'>create</span>
<a name="line-150"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>destroy</span>
<a name="line-151"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>numStripes</span>
<a name="line-152"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>idleTime</span>
<a name="line-153"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>maxResources</span>
<a name="line-154"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>localPools</span>
<a name="line-155"></a> <span class='hs-layout'>}</span>
<a name="line-156"></a> <span class='hs-varid'>addFinalizer</span> <span class='hs-varid'>p</span> <span class='hs-varop'>$</span> <span class='hs-varid'>killThread</span> <span class='hs-varid'>reaperId</span>
<a name="line-157"></a> <span class='hs-varid'>return</span> <span class='hs-varid'>p</span>
<a name="line-158"></a>
<a name="line-159"></a><a name="reaper"></a><span class='hs-comment'>-- | Periodically go through all pools, closing any resources that</span>
<a name="line-160"></a><span class='hs-comment'>-- have been left idle for too long.</span>
<a name="line-161"></a><span class='hs-definition'>reaper</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>NominalDiffTime</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span> <span class='hs-layout'>(</span><span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-162"></a><span class='hs-definition'>reaper</span> <span class='hs-varid'>destroy</span> <span class='hs-varid'>idleTime</span> <span class='hs-varid'>pools</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>forever</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-163"></a> <span class='hs-varid'>threadDelay</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>*</span> <span class='hs-num'>1000000</span><span class='hs-layout'>)</span>
<a name="line-164"></a> <span class='hs-varid'>now</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>getCurrentTime</span>
<a name="line-165"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>isStale</span> <span class='hs-conid'>Entry</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>now</span> <span class='hs-varop'>`diffUTCTime`</span> <span class='hs-varid'>lastUse</span> <span class='hs-varop'>></span> <span class='hs-varid'>idleTime</span>
<a name="line-166"></a> <span class='hs-conid'>V</span><span class='hs-varop'>.</span><span class='hs-varid'>forM_</span> <span class='hs-varid'>pools</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-conid'>LocalPool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-167"></a> <span class='hs-varid'>resources</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>atomically</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-168"></a> <span class='hs-layout'>(</span><span class='hs-varid'>stale</span><span class='hs-layout'>,</span><span class='hs-varid'>fresh</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>partition</span> <span class='hs-varid'>isStale</span> <span class='hs-varop'><$></span> <span class='hs-varid'>readTVar</span> <span class='hs-varid'>entries</span>
<a name="line-169"></a> <span class='hs-varid'>unless</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>stale</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-170"></a> <span class='hs-varid'>writeTVar</span> <span class='hs-varid'>entries</span> <span class='hs-varid'>fresh</span>
<a name="line-171"></a> <span class='hs-varid'>modifyTVar_</span> <span class='hs-varid'>inUse</span> <span class='hs-layout'>(</span><span class='hs-varid'>subtract</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>stale</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-172"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>entry</span> <span class='hs-varid'>stale</span><span class='hs-layout'>)</span>
<a name="line-173"></a> <span class='hs-varid'>forM_</span> <span class='hs-varid'>resources</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>resource</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-174"></a> <span class='hs-varid'>destroy</span> <span class='hs-varid'>resource</span> <span class='hs-varop'>`catch`</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>SomeException</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-175"></a>
<a name="line-176"></a><a name="withResource"></a><span class='hs-comment'>-- | Temporarily take a resource from a 'Pool', perform an action with</span>
<a name="line-177"></a><span class='hs-comment'>-- it, and return it to the pool afterwards.</span>
<a name="line-178"></a><span class='hs-comment'>--</span>
<a name="line-179"></a><span class='hs-comment'>-- * If the pool has an idle resource available, it is used</span>
<a name="line-180"></a><span class='hs-comment'>-- immediately.</span>
<a name="line-181"></a><span class='hs-comment'>--</span>
<a name="line-182"></a><span class='hs-comment'>-- * Otherwise, if the maximum number of resources has not yet been</span>
<a name="line-183"></a><span class='hs-comment'>-- reached, a new resource is created and used.</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- * If the maximum number of resources has been reached, this</span>
<a name="line-186"></a><span class='hs-comment'>-- function blocks until a resource becomes available.</span>
<a name="line-187"></a><span class='hs-comment'>--</span>
<a name="line-188"></a><span class='hs-comment'>-- If the action throws an exception of any type, the resource is</span>
<a name="line-189"></a><span class='hs-comment'>-- destroyed, and not returned to the pool.</span>
<a name="line-190"></a><span class='hs-comment'>--</span>
<a name="line-191"></a><span class='hs-comment'>-- It probably goes without saying that you should never manually</span>
<a name="line-192"></a><span class='hs-comment'>-- destroy a pooled resource, as doing so will almost certainly cause</span>
<a name="line-193"></a><span class='hs-comment'>-- a subsequent user (who expects the resource to be valid) to throw</span>
<a name="line-194"></a><span class='hs-comment'>-- an exception.</span>
<a name="line-195"></a><span class='hs-definition'>withResource</span> <span class='hs-keyglyph'>::</span>
<a name="line-196"></a><span class='hs-cpp'>#if MIN_VERSION_monad_control(0,3,0)</span>
<a name="line-197"></a> <span class='hs-layout'>(</span><span class='hs-conid'>MonadBaseControl</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-198"></a><span class='hs-cpp'>#else</span>
<a name="line-199"></a> <span class='hs-layout'>(</span><span class='hs-conid'>MonadControlIO</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-200"></a><span class='hs-cpp'>#endif</span>
<a name="line-201"></a> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>b</span>
<a name="line-202"></a><span class='hs-comment'>{-# SPECIALIZE withResource :: Pool a -> (a -> IO b) -> IO b #-}</span>
<a name="line-203"></a><span class='hs-definition'>withResource</span> <span class='hs-varid'>pool</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>control</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>runInIO</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>mask</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>restore</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-204"></a> <span class='hs-layout'>(</span><span class='hs-varid'>resource</span><span class='hs-layout'>,</span> <span class='hs-varid'>local</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>takeResource</span> <span class='hs-varid'>pool</span>
<a name="line-205"></a> <span class='hs-varid'>ret</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>restore</span> <span class='hs-layout'>(</span><span class='hs-varid'>runInIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>act</span> <span class='hs-varid'>resource</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>`onException`</span>
<a name="line-206"></a> <span class='hs-varid'>destroyResource</span> <span class='hs-varid'>pool</span> <span class='hs-varid'>local</span> <span class='hs-varid'>resource</span>
<a name="line-207"></a> <span class='hs-varid'>putResource</span> <span class='hs-varid'>local</span> <span class='hs-varid'>resource</span>
<a name="line-208"></a> <span class='hs-varid'>return</span> <span class='hs-varid'>ret</span>
<a name="line-209"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 700</span>
<a name="line-210"></a><span class='hs-comment'>{-# INLINABLE withResource #-}</span>
<a name="line-211"></a><span class='hs-cpp'>#endif</span>
<a name="line-212"></a>
<a name="line-213"></a><a name="takeResource"></a><span class='hs-comment'>-- | Take a resource from the pool, following the same results as</span>
<a name="line-214"></a><span class='hs-comment'>-- 'withResource'. Note that this function should be used with caution, as</span>
<a name="line-215"></a><span class='hs-comment'>-- improper exception handling can lead to leaked resources.</span>
<a name="line-216"></a><span class='hs-comment'>--</span>
<a name="line-217"></a><span class='hs-comment'>-- This function returns both a resource and the @LocalPool@ it came from so</span>
<a name="line-218"></a><span class='hs-comment'>-- that it may either be destroyed (via 'destroyResource') or returned to the</span>
<a name="line-219"></a><span class='hs-comment'>-- pool (via 'putResource').</span>
<a name="line-220"></a><span class='hs-definition'>takeResource</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-221"></a><span class='hs-definition'>takeResource</span> <span class='hs-conid'>Pool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-222"></a> <span class='hs-varid'>i</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>liftBase</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>`mod`</span> <span class='hs-varid'>numStripes</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hash</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>myThreadId</span>
<a name="line-223"></a> <span class='hs-keyword'>let</span> <span class='hs-varid'>pool</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>LocalPool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>localPools</span> <span class='hs-conid'>V</span><span class='hs-varop'>.!</span> <span class='hs-varid'>i</span>
<a name="line-224"></a> <span class='hs-varid'>resource</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>liftBase</span> <span class='hs-varop'>.</span> <span class='hs-varid'>join</span> <span class='hs-varop'>.</span> <span class='hs-varid'>atomically</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-225"></a> <span class='hs-varid'>ents</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>readTVar</span> <span class='hs-varid'>entries</span>
<a name="line-226"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>ents</span> <span class='hs-keyword'>of</span>
<a name="line-227"></a> <span class='hs-layout'>(</span><span class='hs-conid'>Entry</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span><span class='hs-conop'>:</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>writeTVar</span> <span class='hs-varid'>entries</span> <span class='hs-varid'>es</span> <span class='hs-varop'>>></span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varid'>entry</span><span class='hs-layout'>)</span>
<a name="line-228"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span>
<a name="line-229"></a> <span class='hs-varid'>used</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>readTVar</span> <span class='hs-varid'>inUse</span>
<a name="line-230"></a> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>used</span> <span class='hs-varop'>==</span> <span class='hs-varid'>maxResources</span><span class='hs-layout'>)</span> <span class='hs-varid'>retry</span>
<a name="line-231"></a> <span class='hs-varid'>writeTVar</span> <span class='hs-varid'>inUse</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>used</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span>
<a name="line-232"></a> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span>
<a name="line-233"></a> <span class='hs-varid'>create</span> <span class='hs-varop'>`onException`</span> <span class='hs-varid'>atomically</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifyTVar_</span> <span class='hs-varid'>inUse</span> <span class='hs-layout'>(</span><span class='hs-varid'>subtract</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-234"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>resource</span><span class='hs-layout'>,</span> <span class='hs-varid'>pool</span><span class='hs-layout'>)</span>
<a name="line-235"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 700</span>
<a name="line-236"></a><span class='hs-comment'>{-# INLINABLE takeResource #-}</span>
<a name="line-237"></a><span class='hs-cpp'>#endif</span>
<a name="line-238"></a>
<a name="line-239"></a><a name="destroyResource"></a><span class='hs-comment'>-- | Destroy a resource. Note that this will ignore any exceptions in the</span>
<a name="line-240"></a><span class='hs-comment'>-- destroy function.</span>
<a name="line-241"></a><span class='hs-definition'>destroyResource</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Pool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-242"></a><span class='hs-definition'>destroyResource</span> <span class='hs-conid'>Pool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-conid'>LocalPool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>resource</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-243"></a> <span class='hs-varid'>destroy</span> <span class='hs-varid'>resource</span> <span class='hs-varop'>`catch`</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>SomeException</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-244"></a> <span class='hs-varid'>atomically</span> <span class='hs-layout'>(</span><span class='hs-varid'>modifyTVar_</span> <span class='hs-varid'>inUse</span> <span class='hs-layout'>(</span><span class='hs-varid'>subtract</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-245"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 700</span>
<a name="line-246"></a><span class='hs-comment'>{-# INLINABLE destroyResource #-}</span>
<a name="line-247"></a><span class='hs-cpp'>#endif</span>
<a name="line-248"></a>
<a name="line-249"></a><a name="putResource"></a><span class='hs-comment'>-- | Return a resource to the given 'LocalPool'.</span>
<a name="line-250"></a><span class='hs-definition'>putResource</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LocalPool</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span>
<a name="line-251"></a><span class='hs-definition'>putResource</span> <span class='hs-conid'>LocalPool</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>}</span> <span class='hs-varid'>resource</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-252"></a> <span class='hs-varid'>now</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>getCurrentTime</span>
<a name="line-253"></a> <span class='hs-varid'>atomically</span> <span class='hs-varop'>$</span> <span class='hs-varid'>modifyTVar_</span> <span class='hs-varid'>entries</span> <span class='hs-layout'>(</span><span class='hs-conid'>Entry</span> <span class='hs-varid'>resource</span> <span class='hs-varid'>now</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span>
<a name="line-254"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__ >= 700</span>
<a name="line-255"></a><span class='hs-comment'>{-# INLINABLE putResource #-}</span>
<a name="line-256"></a><span class='hs-cpp'>#endif</span>
<a name="line-257"></a>
<a name="line-258"></a><a name="modifyTVar_"></a><span class='hs-definition'>modifyTVar_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TVar</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>STM</span> <span class='hs-conid'>()</span>
<a name="line-259"></a><span class='hs-definition'>modifyTVar_</span> <span class='hs-varid'>v</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readTVar</span> <span class='hs-varid'>v</span> <span class='hs-varop'>>>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>writeTVar</span> <span class='hs-varid'>v</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span>
<a name="line-260"></a>
<a name="line-261"></a><a name="modError"></a><span class='hs-definition'>modError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span>
<a name="line-262"></a><span class='hs-definition'>modError</span> <span class='hs-varid'>func</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span>
<a name="line-263"></a> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span> <span class='hs-str'>"Data.Pool."</span> <span class='hs-varop'>++</span> <span class='hs-varid'>func</span> <span class='hs-varop'>++</span> <span class='hs-str'>": "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>msg</span>
</pre></body>
</html>
|