Skip to content

Commit

Permalink
Merge branch 'release/v0.9.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
Mitsutoshi Aoe committed May 22, 2016
2 parents a7fc56f + dc0aff0 commit 9e31669
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 138 deletions.
156 changes: 57 additions & 99 deletions .travis.yml
@@ -1,113 +1,71 @@
# NB: don't set `language: haskell` here
# This file has been generated by `make_travis_yml_2.hs`
# see https://github.com/hvr/multi-ghc-travis for more information
language: c
sudo: false

# See also https://github.com/hvr/multi-ghc-travis for more information
cache:
directories:
- $HOME/.cabal/packages
- $HOME/.cabal/store

# The following lines enable several GHC versions and/or HP versions
# to be tested; often it's enough to test only against the last
# release of a major GHC version. Setting HPVER implictly sets
# GHCVER. Omit lines with versions you don't need/want testing for.
env:
- CABALVER=1.18 GHCVER=7.6.3
- CABALVER=1.18 GHCVER=7.8.4
- CABALVER=1.22 GHCVER=7.10.2
- CABALVER=head GHCVER=head
- HPVER=2014.2.0.0
- HPVER=2013.2.0.0
- HPVER=2012.4.0.0
- CABALVER=1.18 GHCVER=7.8.3 FLAGS=-f-monad-control-1
before_cache:
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/build-reports.log
- rm -fv $HOME/.cabal/packages/hackage.haskell.org/00-index.tar

matrix:
allow_failures:
- env: CABALVER=head GHCVER=head
include:
- env: CABALVER=1.24 GHCVER=7.6.3
compiler: ": #GHC 7.6.3"
addons: {apt: {packages: [cabal-install-1.24,ghc-7.6.3], sources: [hvr-ghc]}}
- env: CABALVER=1.24 GHCVER=7.8.4
compiler: ": #GHC 7.8.4"
addons: {apt: {packages: [cabal-install-1.24,ghc-7.8.4], sources: [hvr-ghc]}}
- env: CABALVER=1.24 GHCVER=7.10.2
compiler: ": #GHC 7.10.2"
addons: {apt: {packages: [cabal-install-1.24,ghc-7.10.2], sources: [hvr-ghc]}}
- env: CABALVER=1.24 GHCVER=8.0.1
compiler: ": #GHC 8.0.1"
addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1], sources: [hvr-ghc]}}

# Note: the distinction between `before_install` and `install` is not
# important.
before_install:
- case "$HPVER" in
"") ;;
- unset CC
- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH

"2014.2.0.0")
export CABALVER=1.18 ;
export GHCVER=7.8.3 ;
echo "constraints:async==2.0.1.5,attoparsec==0.10.4.0,case-insensitive==1.1.0.3,fgl==5.5.0.1,GLUT==2.5.1.1,GLURaw==1.4.0.1,haskell-src==1.0.1.6,hashable==1.2.2.0,html==1.0.1.2,HTTP==4000.2.10,HUnit==1.2.5.2,mtl==2.1.3.1,network==2.4.2.3,OpenGL==2.9.2.0,OpenGLRaw==1.5.0.0,parallel==3.2.0.4,parsec==3.1.5,primitive==0.5.2.1,QuickCheck==2.6,random==1.0.1.1,regex-base==0.93.2,regex-compat==0.95.1,regex-posix==0.95.2,split==0.2.2,stm==2.4.2,syb==0.4.1,text==1.1.0.0,transformers==0.3.0.0,unordered-containers==0.2.4.0,vector==0.10.9.1,xhtml==3000.2.1,zlib==0.5.4.1" > cabal.config ;;

"2013.2.0.0")
export CABALVER=1.18 ;
export GHCVER=7.6.3 ;
echo "constraints:async==2.0.1.4,attoparsec==0.10.4.0,case-insensitive==1.0.0.1,cgi==3001.1.7.5,fgl==5.4.2.4,GLUT==2.4.0.0,GLURaw==1.3.0.0,haskell-src==1.0.1.5,hashable==1.1.2.5,html==1.0.1.2,HTTP==4000.2.8,HUnit==1.2.5.2,mtl==2.1.2,network==2.4.1.2,OpenGL==2.8.0.0,OpenGLRaw==1.3.0.0,parallel==3.2.0.3,parsec==3.1.3,QuickCheck==2.6,random==1.0.1.1,regex-base==0.93.2,regex-compat==0.95.1,regex-posix==0.95.2,split==0.2.2,stm==2.4.2,syb==0.4.0,text==0.11.3.1,transformers==0.3.0.0,unordered-containers==0.2.3.0,vector==0.10.0.1,xhtml==3000.2.1,zlib==0.5.4.1" > cabal.config ;;

"2012.4.0.0")
export CABALVER=1.18 ;
export GHCVER=7.6.2 ;
echo "constraints:async==2.0.1.3,cgi==3001.1.7.4,fgl==5.4.2.4,GLUT==2.1.2.1,haskell-src==1.0.1.5,html==1.0.1.2,HTTP==4000.2.5,HUnit==1.2.5.1,mtl==2.1.2,network==2.3.1.0,OpenGL==2.2.3.1,parallel==3.2.0.3,parsec==3.1.3,QuickCheck==2.5.1.1,random==1.0.1.1,regex-base==0.93.2,regex-compat==0.95.1,regex-posix==0.95.2,split==0.2.1.1,stm==2.4,syb==0.3.7,text==0.11.2.3,transformers==0.3.0.0,vector==0.10.0.1,xhtml==3000.2.1,zlib==0.5.4.0" > cabal.config ;;

*)
export GHCVER=unknown ;
echo "unknown/invalid Haskell Platform requested" ;
exit 1 ;;

esac

- travis_retry sudo add-apt-repository -y ppa:hvr/ghc
- travis_retry sudo apt-get update
- travis_retry sudo apt-get install cabal-install-$CABALVER ghc-$GHCVER
- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:~/.cabal/bin:$PATH
install:
- cabal --version
- BENCH=${BENCH---enable-benchmarks}
- TEST=${TEST---enable-tests}
- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
- travis_retry cabal update
# stack
- mkdir -p ~/.local/bin
- export PATH=~/.local/bin:$PATH
- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
- stack setup --resolver=lts-3.15
- stack --resolver=lts-3.15 install hpc-coveralls

install:
- cabal install -j ${FLAGS} --only-dependencies --enable-tests --enable-benchmarks
- if [ -f $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz ];
then
zcat $HOME/.cabal/packages/hackage.haskell.org/00-index.tar.gz >
$HOME/.cabal/packages/hackage.haskell.org/00-index.tar;
fi
- travis_retry cabal update -v
- sed -i 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config
- cabal new-build ${TEST} ${BENCH} --dep

# Here starts the actual work to be performed for the package under
# test; any command which exits with a non-zero exit code causes the
# build to fail.
# Here starts the actual work to be performed for the package under test;
# any command which exits with a non-zero exit code causes the build to fail.
script:
- if [ -f configure.ac ]; then autoreconf -i; fi
# -v2 provides useful information for debugging
- |
if [ "$CABALVER" == "1.18" ]; then
cabal configure ${FLAGS} --enable-tests --enable-benchmarks -v2 --enable-library-coverage --ghc-options="-Wall -Werror"
else
cabal configure ${FLAGS} --enable-tests --enable-benchmarks -v2 --enable-coverage --ghc-options="-Wall -Werror"
fi
# this builds all libraries and executables
# (including tests/benchmarks)
- cabal build -j

- run-cabal-test --cabal-name=cabal --show-details=always
- cabal check

# tests that a source-distribution can be generated
- cabal sdist

# check that the generated source-distribution can be built & installed
- export SRC_TGZ=$(cabal info . | awk '{print $2 ".tar.gz";exit}') ;
cd dist/;
if [ -f "$SRC_TGZ" ]; then
cabal install --force-reinstalls "$SRC_TGZ";
else
echo "expected '$SRC_TGZ' not found";
exit 1;
fi

after_script:
- stack exec hpc-coveralls -- test-lifted-async
- stack exec hpc-coveralls -- regression-tests

notifications:
webhooks:
urls:
- https://webhooks.gitter.im/e/f223ceea7f2a00e234b2
on_success: change # options: [always|never|change] default: always
on_failure: always # options: [always|never|change] default: always
on_start: false # default: false
# this builds all libraries and executables (including tests/benchmarks)
- cabal new-build ${TEST} ${BENCH} -v2 # -v2 provides useful information for debugging

# there's no 'cabal new-test' yet, so let's emulate for now
- TESTS=( $(awk 'tolower($0) ~ /^test-suite / { print $2 }' *.cabal) );
RC=true; for T in ${TESTS[@]}; do echo "== $T ==";
if dist-newstyle/build/*/build/$T/$T; then echo "= $T OK =";
else echo "= $T FAILED ="; RC=false; fi; done; $RC
- cabal sdist # test that a source-distribution can be generated

# Check that the resulting source distribution can be built w/o and w tests
- SRC_BASENAME=$(cabal info . | awk '{print $2;exit}')
- tar -C dist/ -xf dist/$SRC_BASENAME.tar.gz
- "echo 'packages: *.cabal' > dist/$SRC_BASENAME/cabal.project"
- cd dist/$SRC_BASENAME/
- cabal new-build --disable-tests --disable-benchmarks
- rm -rf ./dist-newstyle
- cabal new-build ${TEST} ${BENCH}

# EOF
4 changes: 4 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,7 @@
## v0.9.0 - 2016-05-22

* Leverage `StM m a ~ a` in the `Safe` module for faster `wait`/`poll`/`race`/`concurrently`

## v0.8.0.1 - 2015-01-17

* Relax upper bound for constraints
Expand Down
37 changes: 36 additions & 1 deletion benchmarks/Benchmarks.hs
@@ -1,40 +1,46 @@
{-# LANGUAGE BangPatterns #-}
module Main where
import Control.Exception (SomeException(..))

import Criterion.Main
import qualified Control.Concurrent.Async as A
import qualified Control.Concurrent.Async.Lifted as L
import qualified Control.Concurrent.Async.Lifted.Safe as LS

main :: IO ()
main = defaultMain
[ bgroup "async-wait"
[ bench "async" $ whnfIO asyncWait_async
, bench "lifted-async" $ whnfIO asyncWait_liftedAsync
, bench "lifted-async-safe" $ whnfIO asyncWait_liftedAsyncSafe
]
, bgroup "async-cancel-waitCatch"
[ bench "async" $ whnfIO asyncCancelWaitCatch_async
, bench "lifted-async" $ whnfIO asyncCancelWaitCatch_liftedAsync
, bench "lifted-async-safe" $ whnfIO asyncCancelWaitCatch_liftedAsyncSafe
]
, bgroup "waitAny"
[ bench "async" $ whnfIO waitAny_async
, bench "lifted-async" $ whnfIO waitAny_liftedAsync
, bench "lifted-async-safe" $ whnfIO waitAny_liftedAsyncSafe
]
, bgroup "race"
[ bench "async" $ nfIO race_async
, bench "lifted-async" $ nfIO race_liftedAsync
, bench "lifted-async-safe" $ nfIO race_liftedAsyncSafe
, bench "async (inlined)" $ nfIO race_async_inlined
, bench "lifted-async (inlined)" $ nfIO race_liftedAsync_inlined
]
, bgroup "concurrently"
[ bench "async" $ nfIO concurrently_async
, bench "lifted-async" $ nfIO concurrently_liftedAsync
, bench "lifted-async-safe" $ nfIO concurrently_liftedAsyncSafe
, bench "async (inlined)" $ nfIO concurrently_async_inlined
, bench "lifted-async (inlined)" $ nfIO concurrently_liftedAsync_inlined
]
, bgroup "mapConcurrently"
[ bench "async" $ nfIO mapConcurrently_async
, bench "lifted-async" $ nfIO mapConcurrently_liftedAsync
, bench "lifted-async-safe" $ nfIO mapConcurrently_liftedAsyncSafe
]
]

Expand All @@ -48,6 +54,11 @@ asyncWait_liftedAsync = do
a <- L.async (return 1)
L.wait a

asyncWait_liftedAsyncSafe :: IO Int
asyncWait_liftedAsyncSafe = do
a <- LS.async (return 1)
LS.wait a

asyncCancelWaitCatch_async :: IO (Either SomeException Int)
asyncCancelWaitCatch_async = do
a <- A.async (return 1)
Expand All @@ -60,6 +71,12 @@ asyncCancelWaitCatch_liftedAsync = do
L.cancel a
L.waitCatch a

asyncCancelWaitCatch_liftedAsyncSafe :: IO (Either SomeException Int)
asyncCancelWaitCatch_liftedAsyncSafe = do
a <- LS.async (return 1)
LS.cancel a
LS.waitCatch a

waitAny_async :: IO Int
waitAny_async = do
as <- mapM (A.async . return) [1..10]
Expand All @@ -72,6 +89,12 @@ waitAny_liftedAsync = do
(_, n) <- L.waitAny as
return n

waitAny_liftedAsyncSafe :: IO Int
waitAny_liftedAsyncSafe = do
as <- mapM (LS.async . return) [1..10]
(_, n) <- LS.waitAny as
return n

race_async :: IO (Either Int Int)
race_async =
A.race (return 1) (return 2)
Expand All @@ -80,6 +103,10 @@ race_liftedAsync :: IO (Either Int Int)
race_liftedAsync =
L.race (return 1) (return 2)

race_liftedAsyncSafe :: IO (Either Int Int)
race_liftedAsyncSafe =
LS.race (return 1) (return 2)

race_async_inlined :: IO (Either Int Int)
race_async_inlined =
A.withAsync (return 1) $ \a ->
Expand All @@ -100,6 +127,10 @@ concurrently_liftedAsync :: IO (Int, Int)
concurrently_liftedAsync =
L.concurrently (return 1) (return 2)

concurrently_liftedAsyncSafe :: IO (Int, Int)
concurrently_liftedAsyncSafe =
LS.concurrently (return 1) (return 2)

concurrently_async_inlined :: IO (Int, Int)
concurrently_async_inlined =
A.withAsync (return 1) $ \a ->
Expand All @@ -119,3 +150,7 @@ mapConcurrently_async =
mapConcurrently_liftedAsync :: IO [Int]
mapConcurrently_liftedAsync =
L.mapConcurrently return [1..10]

mapConcurrently_liftedAsyncSafe :: IO [Int]
mapConcurrently_liftedAsyncSafe =
LS.mapConcurrently return [1..10]
7 changes: 4 additions & 3 deletions lifted-async.cabal
@@ -1,5 +1,5 @@
name: lifted-async
version: 0.8.0.1
version: 0.9.0
synopsis: Run lifted IO operations asynchronously and wait for their results
homepage: https://github.com/maoe/lifted-async
bug-reports: https://github.com/maoe/lifted-async/issues
Expand All @@ -12,7 +12,8 @@ category: Concurrency
build-type: Simple
cabal-version: >= 1.8
tested-with:
GHC == 7.10.2
GHC == 8.0.1
, GHC == 7.10.2
, GHC == 7.8.4
, GHC == 7.6.3

Expand Down Expand Up @@ -114,5 +115,5 @@ source-repository head

source-repository this
type: git
tag: v0.8.0.1
tag: v0.9.0
location: https://github.com/maoe/lifted-async.git
2 changes: 1 addition & 1 deletion src/Control/Concurrent/Async/Lifted.hs
Expand Up @@ -305,7 +305,7 @@ waitEitherCatchCancel a b =
-- NOTE: This function discards the monadic effects besides IO in the forked
-- computation.
waitEither_
:: MonadBaseControl IO m
:: MonadBase IO m
=> Async a
-> Async b
-> m ()
Expand Down

0 comments on commit 9e31669

Please sign in to comment.