
Hello All, I think I've read somewhere that STM doesn't like unsafePerformIO. However, I would like to use a global STM variable. Something like this: *module* Main *where* import GHC.Conc import System.IO.Unsafe tSid = unsafePerformIO (atomically (newTVar 0)) tickSessionID :: STM Int tickSessionID = *do* sid <- readTVar tSid writeTVar tSid (sid + 1) return sid main = atomically tickSessionID But, when I try this, the evaluation of main causes a segmentation fault. Is there a workaround for this bug? Regards, Robert

Never mind, I can probably use an MVar to work around this... Robert Robert van Herk wrote:
Hello All,
I think I've read somewhere that STM doesn't like unsafePerformIO. However, I would like to use a global STM variable. Something like this:
module Main where import GHC.Conc import System.IO.Unsafe
tSid = unsafePerformIO (atomically (newTVar 0))
tickSessionID :: STM Int tickSessionID = do sid <- readTVar tSid writeTVar tSid (sid + 1) return sid
main = atomically tickSessionID
But, when I try this, the evaluation of main causes a segmentation fault. Is there a workaround for this bug?
Regards, Robert _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

On Wed, Aug 03, 2005 at 12:50:54PM +0200, Robert van Herk wrote:
Hello All,
I think I've read somewhere that STM doesn't like unsafePerformIO. However, I would like to use a global STM variable. Something like this:
module Main where import GHC.Conc import System.IO.Unsafe
tSid = unsafePerformIO (atomically (newTVar 0))
tickSessionID :: STM Int tickSessionID = do sid <- readTVar tSid writeTVar tSid (sid + 1) return sid
main = atomically tickSessionID
But, when I try this, the evaluation of main causes a segmentation fault. Is there a workaround for this bug?
Regards, Robert
It probably dies not because of unsafePerformIO per se, but because STM doesn't understand nested transactions, and unsafePerformIO here results in a nested transaction. Using the following main works for me, as it forces both "atomically"'s to be evaluated sequentially: main = tSid `seq` atomically tickSessionID See also http://haskell.org/pipermail/glasgow-haskell-users/2005-June/008615.html and http://sourceforge.net/tracker/index.php?func=detail&aid=1235728&group_id=8032&atid=108032 Happy hacking, Remi P.S. Could you find out (and fix) what inserts those spurious *'s in your code? -- Nobody can be exactly like me. Even I have trouble doing it.

Oh I see! Your sollutions are indeed a lot better than implementating all my code using MVars :-). Thanks, Robert Remi Turk wrote:
On Wed, Aug 03, 2005 at 12:50:54PM +0200, Robert van Herk wrote:
Hello All,
I think I've read somewhere that STM doesn't like unsafePerformIO. However, I would like to use a global STM variable. Something like this:
module Main where import GHC.Conc import System.IO.Unsafe
tSid = unsafePerformIO (atomically (newTVar 0))
tickSessionID :: STM Int tickSessionID = do sid <- readTVar tSid writeTVar tSid (sid + 1) return sid
main = atomically tickSessionID
But, when I try this, the evaluation of main causes a segmentation fault. Is there a workaround for this bug?
Regards, Robert
It probably dies not because of unsafePerformIO per se, but because STM doesn't understand nested transactions, and unsafePerformIO here results in a nested transaction. Using the following main works for me, as it forces both "atomically"'s to be evaluated sequentially:
main = tSid `seq` atomically tickSessionID
See also http://haskell.org/pipermail/glasgow-haskell-users/2005-June/008615.html and http://sourceforge.net/tracker/index.php?func=detail&aid=1235728&group_id=8032&atid=108032
Happy hacking, Remi
P.S. Could you find out (and fix) what inserts those spurious *'s in your code?
participants (2)
-
Remi Turk
-
Robert van Herk