diff --git a/smp/callback002/Main.hs b/smp/callback002/Main.hs new file mode 100644 index 0000000000000000000000000000000000000000..d0ad9c9895b42c609a3783096af9113154420744 --- /dev/null +++ b/smp/callback002/Main.hs @@ -0,0 +1,28 @@ +{-# OPTIONS_GHC -fffi #-} +-- Measure raw callback performance. + +module Main where + +import Control.Concurrent +import Control.Monad +import Foreign +import Foreign.C +import Data.IORef +import System.Environment +import System.IO + +main = do + [s] <- getArgs + poke pcount (fromIntegral (read s)) + callC =<< mkFunc (return ()) + +type FUNC = IO () + +foreign import ccall "&count" pcount :: Ptr CInt + +foreign import ccall unsafe "wrapper" + mkFunc :: FUNC -> IO (FunPtr FUNC) + +foreign import ccall threadsafe "cbits.h callC" + callC:: FunPtr FUNC -> IO () + diff --git a/smp/callback002/Makefile b/smp/callback002/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..5ad0b5c2722bedbb42adf2ec77c074e8f630f70f --- /dev/null +++ b/smp/callback002/Makefile @@ -0,0 +1,10 @@ +TOP = ../.. +include $(TOP)/mk/boilerplate.mk + +FAST_OPTS = 300000 +NORM_OPTS = 3000000 +SLOW_OPTS = 30000000 + +OBJS += Main_stub.o + +include $(TOP)/mk/target.mk diff --git a/smp/callback002/cbits.c b/smp/callback002/cbits.c new file mode 100644 index 0000000000000000000000000000000000000000..47ac47f10116fa057a42fa9498ebb0ee1fde151a --- /dev/null +++ b/smp/callback002/cbits.c @@ -0,0 +1,8 @@ +#include "cbits.h" + +int count; + +void callC( FUNC* f) { + int i; + for(i=0;i<count;i++) f(); +} diff --git a/smp/callback002/cbits.h b/smp/callback002/cbits.h new file mode 100644 index 0000000000000000000000000000000000000000..d0d8517ca5f9af90dd067d40ada27f0b37aa9348 --- /dev/null +++ b/smp/callback002/cbits.h @@ -0,0 +1,3 @@ +typedef void FUNC(); + +void callC( FUNC* f);