From 6711398b597b44d57f176a6ae6570c057cc1c4c0 Mon Sep 17 00:00:00 2001
From: Simon Marlow <marlowsd@gmail.com>
Date: Tue, 9 Mar 2010 15:22:32 +0000
Subject: [PATCH] add a raw callback performance benchmark

---
 smp/callback002/Main.hs  | 28 ++++++++++++++++++++++++++++
 smp/callback002/Makefile | 10 ++++++++++
 smp/callback002/cbits.c  |  8 ++++++++
 smp/callback002/cbits.h  |  3 +++
 4 files changed, 49 insertions(+)
 create mode 100644 smp/callback002/Main.hs
 create mode 100644 smp/callback002/Makefile
 create mode 100644 smp/callback002/cbits.c
 create mode 100644 smp/callback002/cbits.h

diff --git a/smp/callback002/Main.hs b/smp/callback002/Main.hs
new file mode 100644
index 00000000..d0ad9c98
--- /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 00000000..5ad0b5c2
--- /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 00000000..47ac47f1
--- /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 00000000..d0d8517c
--- /dev/null
+++ b/smp/callback002/cbits.h
@@ -0,0 +1,3 @@
+typedef void FUNC();
+
+void callC( FUNC* f);
-- 
GitLab