[GHC] #15267: Extend TVar/MVar to N capacity / Add primitive channal type

GHC ghc-devs at haskell.org
Wed Jun 13 03:20:38 UTC 2018


#15267: Extend TVar/MVar to N capacity / Add primitive channal type
-------------------------------------+-------------------------------------
           Reporter:  winter         |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  high           |         Milestone:  8.6.1
          Component:  Runtime        |           Version:  8.4.3
  System                             |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 The current concurrent primitives `TVar` and `MVar` have a fixed single
 capacity for holding the value to be synchronized. This pose great
 limitations on implementing many higher level concurrent structures
 efficiently, e.g. bound channel, semaphore, resource pool, etc. For
 example current <semaphore's implementation
 http://hackage.haskell.org/package/base-4.11.1.0/docs/src/Control.Concurrent.QSem.html#signalQSem>
 is not ideal due to the extensive usage of multiple `MVar` s. If we have a
 good `BoundedChan a` type, semaphores can be easily implemented with
 `BoundedChan ()`.


 Currently we have various bound channel implementations, but these
 implementations are often not very efficient or too complex. For example
 the `BoundedChan` from <BoundedChan
 http://hackage.haskell.org/package/BoundedChan-1.0.3.0/docs/Control-
 Concurrent-BoundedChan.html> is based on an array of `MVar` s, thus
 consumes much more memory than a primitve channel which only have to
 record parked `StgTSO` s.

 I'm thinking adding something like:

 ```
 typedef struct {
   StgHeader                  header;
   struct StgMVarTSOQueue_   *head;
   struct StgMVarTSOQueue_   *tail;
   StgInt                     capacity;       // the channel's capacity
   StgInt                     read_index;     // the reading end's index
   StgInt                     write_index;    // the writing end's index
   StgClosure                *payload[];      // payload array in
 continuous memory
 } StgMChan;
 ```

 I still can't work out all the details, but I'm confident something
 similar to this will work.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15267>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list