úÎPTNŸ     !The type of thread pools used by  ParallelIO. 1 The best way to construct one of these is using . A  is used to communicate s to the workers. 3Type of work items you can put onto the queue. The   returned from the ' action specifies whether the invoking - thread should terminate itself immediately. HA slightly unsafe way to construct a pool. Make a pool from the maximum E number of threads you wish it to execute (including the main thread  in the count). >If you use this variant then ensure that you insert a call to  G somewhere in your program after all users of that pool have finished. 2A better alternative is to see if you can use the  variant. "Clean up a thread pool. If you don')t call this then no one holds the queue,  the queue gets GC'Ad, the threads find themselves blocked indefinitely, and you get  exceptions. 4This cleanly shuts down the threads so the queue isn't important and you don't get  exceptions. Only call this after; all users of the pool have completed, or your program may  block indefinitely. A safe wrapper around  and . Executes an  action using a newly-created H pool with the specified number of threads and cleans it up at the end. /Internal method for scheduling work on a pool. RWrap any IO action used from your worker threads that may block with this method: X it temporarily spawns another worker thread to make up for the loss of the old blocked  worker. _This is particularly important if the unblocking is dependent on worker threads actually doing . work. If you have this situation, and you don'1t use this method to wrap blocking actions, then ` you may get a deadlock if all your worker threads get blocked on work that they assume will be  done by other worker threads. SInternal method for adding extra unblocked threads to a pool if one is going to be  temporarily blocked. LInternal method for removing threads from a pool after we become unblocked. *Run the list of computations in parallel. Has the following properties: D Never creates more or less unblocked threads than are specified to D live in the pool. NB: this count includes the thread executing  . R This should minimize contention and hence pre-emption, while also preventing  starvation. , On return all actions have been performed. E The function returns in a timely manner as soon as all actions have  been performed. ' The above properties are true even if   is used by an . action which is itself being executed by  . GRun the list of computations in parallel, returning the results in the * same order as the corresponding actions. Has the following properties: D Never creates more or less unblocked threads than are specified to D live in the pool. NB: this count includes the thread executing  . R This should minimize contention and hence pre-emption, while also preventing  starvation. , On return all actions have been performed. E The function returns in a timely manner as soon as all actions have  been performed. ' The above properties are true even if   is used by an . action which is itself being executed by  . GRun the list of computations in parallel, returning the results in the " approximate order of completion. Has the following properties: D Never creates more or less unblocked threads than are specified to D live in the pool. NB: this count includes the thread executing  . R This should minimize contention and hence pre-emption, while also preventing  starvation. , On return all actions have been performed. P The result of running actions appear in the list in undefined order, but which > is likely to be very similar to the order of completion. ' The above properties are true even if   is used by an . action which is itself being executed by  .     EIn order to reliably make use of the global parallelism combinators, I you must invoke this function after all calls to those combinators have 0 finished. A good choice might be at the end of main.  See also . RWrap any IO action used from your worker threads that may block with this method: X it temporarily spawns another worker thread to make up for the loss of the old blocked  worker.  See also . SInternal method for adding extra unblocked threads to a pool if one is going to be  temporarily blocked.  See also . LInternal method for removing threads from a pool after we become unblocked.  See also  . AExecute the given actions in parallel on the global thread pool.  See also  . AExecute the given actions in parallel on the global thread pool, G returning the results in the same order as the corresponding actions.  See also  . AExecute the given actions in parallel on the global thread pool, ? returning the results in the approximate order of completion.  See also  .     !       !"#$parallel-io-0.2.1#Control.Concurrent.ParallelIO.Local$Control.Concurrent.ParallelIO.Global+Control.Concurrent.ParallelIO.ConcurrentSetControl.Concurrent.ParallelIOPool WorkQueueWorkItem startPoolstopPoolwithPool enqueueOnPoolextraWorkerWhileBlockedspawnPoolWorkerForkillPoolWorkerFor parallel_parallelparallelInterleaved globalPoolstopGlobalPoolspawnPoolWorkerkillPoolWorker ConcurrentSetCSnewinsertdeletepool_threadcountpool_spawnedby pool_queueghc-primGHC.BoolBool GHC.TypesIOseqList