<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--Rendered using the Haskell Html Library v0.2--> <HTML ><HEAD ><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" ><TITLE >Control.Concurrent.STM.TMVar</TITLE ><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css" ><SCRIPT SRC="haddock-util.js" TYPE="text/javascript" ></SCRIPT ><SCRIPT TYPE="text/javascript" >window.onload = function () {setSynopsis("mini_Control-Concurrent-STM-TMVar.html")};</SCRIPT ></HEAD ><BODY ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="topbar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" " ></TD ><TD CLASS="title" >stm-2.1.1.2: Software Transactional Memory</TD ><TD CLASS="topbut" ><A HREF="index.html" >Contents</A ></TD ><TD CLASS="topbut" ><A HREF="doc-index.html" >Index</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="modulebar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><FONT SIZE="6" >Control.Concurrent.STM.TMVar</FONT ></TD ><TD ALIGN="right" ><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="infohead" >Portability</TD ><TD CLASS="infoval" >non-portable (requires STM)</TD ></TR ><TR ><TD CLASS="infohead" >Stability</TD ><TD CLASS="infoval" >experimental</TD ></TR ><TR ><TD CLASS="infohead" >Maintainer</TD ><TD CLASS="infoval" >libraries@haskell.org</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" ><B >Contents</B ></TD ></TR ><TR ><TD ><DL ><DT ><A HREF="#1" >TMVars </A ></DT ></DL ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Description</TD ></TR ><TR ><TD CLASS="doc" >TMVar: Transactional MVars, for use in the STM monad (GHC only) </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Synopsis</TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3ATMVar" >TMVar</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnewTMVar" >newTMVar</A > :: a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnewEmptyTMVar" >newEmptyTMVar</A > :: <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnewTMVarIO" >newTMVarIO</A > :: a -> <A HREF="../base/System-IO.html#t%3AIO" >IO</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AnewEmptyTMVarIO" >newEmptyTMVarIO</A > :: <A HREF="../base/System-IO.html#t%3AIO" >IO</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AtakeTMVar" >takeTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AputTMVar" >putTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AreadTMVar" >readTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AswapTMVar" >swapTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AtryTakeTMVar" >tryTakeTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="../base/Data-Maybe.html#t%3AMaybe" >Maybe</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AtryPutTMVar" >tryPutTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool" >Bool</A ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AisEmptyTMVar" >isEmptyTMVar</A > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool" >Bool</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="1" ><A NAME="1" >TMVars </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:TMVar" ><A NAME="t%3ATMVar" ></A ></A ><B >TMVar</B > a </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >A <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is a synchronising variable, used for communication between concurrent threads. It can be thought of as a box, which may be empty or full. </TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:newTMVar" ><A NAME="v%3AnewTMVar" ></A ></A ><B >newTMVar</B > :: a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="doc" >Create a <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > which contains the supplied value. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:newEmptyTMVar" ><A NAME="v%3AnewEmptyTMVar" ></A ></A ><B >newEmptyTMVar</B > :: <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="doc" >Create a <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > which is initially empty. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:newTMVarIO" ><A NAME="v%3AnewTMVarIO" ></A ></A ><B >newTMVarIO</B > :: a -> <A HREF="../base/System-IO.html#t%3AIO" >IO</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="doc" ><TT >IO</TT > version of <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AnewTMVar" >newTMVar</A ></TT >. This is useful for creating top-level <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >s using System.IO.Unsafe.unsafePerformIO, because using <TT ><A HREF="../base/GHC-Conc.html#v%3Aatomically" >atomically</A ></TT > inside System.IO.Unsafe.unsafePerformIO isn't possible. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:newEmptyTMVarIO" ><A NAME="v%3AnewEmptyTMVarIO" ></A ></A ><B >newEmptyTMVarIO</B > :: <A HREF="../base/System-IO.html#t%3AIO" >IO</A > (<A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a)</TD ></TR ><TR ><TD CLASS="doc" ><TT >IO</TT > version of <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AnewEmptyTMVar" >newEmptyTMVar</A ></TT >. This is useful for creating top-level <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >s using System.IO.Unsafe.unsafePerformIO, because using <TT ><A HREF="../base/GHC-Conc.html#v%3Aatomically" >atomically</A ></TT > inside System.IO.Unsafe.unsafePerformIO isn't possible. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:takeTMVar" ><A NAME="v%3AtakeTMVar" ></A ></A ><B >takeTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="doc" >Return the contents of the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >. If the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is currently empty, the transaction will <TT ><A HREF="../base/GHC-Conc.html#v%3Aretry" >retry</A ></TT >. After a <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtakeTMVar" >takeTMVar</A ></TT >, the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is left empty. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:putTMVar" ><A NAME="v%3AputTMVar" ></A ></A ><B >putTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Unit.html#t%3A%28%29" >()</A ></TD ></TR ><TR ><TD CLASS="doc" >Put a value into a <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >. If the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is currently full, <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AputTMVar" >putTMVar</A ></TT > will <TT ><A HREF="../base/GHC-Conc.html#v%3Aretry" >retry</A ></TT >. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:readTMVar" ><A NAME="v%3AreadTMVar" ></A ></A ><B >readTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="doc" >This is a combination of <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtakeTMVar" >takeTMVar</A ></TT > and <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AputTMVar" >putTMVar</A ></TT >; ie. it takes the value from the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >, puts it back, and also returns it. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:swapTMVar" ><A NAME="v%3AswapTMVar" ></A ></A ><B >swapTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > a</TD ></TR ><TR ><TD CLASS="doc" >Swap the contents of a <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > for a new value. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:tryTakeTMVar" ><A NAME="v%3AtryTakeTMVar" ></A ></A ><B >tryTakeTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > (<A HREF="../base/Data-Maybe.html#t%3AMaybe" >Maybe</A > a)</TD ></TR ><TR ><TD CLASS="doc" >A version of <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtakeTMVar" >takeTMVar</A ></TT > that does not <TT ><A HREF="../base/GHC-Conc.html#v%3Aretry" >retry</A ></TT >. The <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtryTakeTMVar" >tryTakeTMVar</A ></TT > function returns <TT ><A HREF="../base/Data-Maybe.html#v%3ANothing" >Nothing</A ></TT > if the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > was empty, or <TT ><TT ><A HREF="../base/Data-Maybe.html#v%3AJust" >Just</A ></TT > a</TT > if the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > was full with contents <TT >a</TT >. After <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtryTakeTMVar" >tryTakeTMVar</A ></TT >, the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is left empty. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:tryPutTMVar" ><A NAME="v%3AtryPutTMVar" ></A ></A ><B >tryPutTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool" >Bool</A ></TD ></TR ><TR ><TD CLASS="doc" >A version of <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AputTMVar" >putTMVar</A ></TT > that does not <TT ><A HREF="../base/GHC-Conc.html#v%3Aretry" >retry</A ></TT >. The <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtryPutTMVar" >tryPutTMVar</A ></TT > function attempts to put the value <TT >a</TT > into the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >, returning <TT ><A HREF="../ghc-prim/GHC-Bool.html#v%3ATrue" >True</A ></TT > if it was successful, or <TT ><A HREF="../ghc-prim/GHC-Bool.html#v%3AFalse" >False</A ></TT > otherwise. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="decl" ><A NAME="v:isEmptyTMVar" ><A NAME="v%3AisEmptyTMVar" ></A ></A ><B >isEmptyTMVar</B > :: <A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A > a -> <A HREF="../base/GHC-Conc.html#t%3ASTM" >STM</A > <A HREF="../ghc-prim/GHC-Bool.html#t%3ABool" >Bool</A ></TD ></TR ><TR ><TD CLASS="doc" ><P >Check whether a given <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > is empty. </P ><P >Notice that the boolean value returned is just a snapshot of the state of the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT >. By the time you get to react on its result, the <TT ><A HREF="Control-Concurrent-STM-TMVar.html#t%3ATMVar" >TMVar</A ></TT > may have been filled (or emptied) - so be extremely careful when using this operation. Use <TT ><A HREF="Control-Concurrent-STM-TMVar.html#v%3AtryTakeTMVar" >tryTakeTMVar</A ></TT > instead if possible. </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="botbar" >Produced by <A HREF="http://www.haskell.org/haddock/" >Haddock</A > version 2.4.2</TD ></TR ></TABLE ></BODY ></HTML >