Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ Jenkins/FullBuild	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -25,8 +25,7 @@
 				)
 			}
+		}
 
-			//Push latest changes to do-lang repo
-			push_build()
-		}
+		promote_email(true)
 	}
 
@@ -43,5 +42,5 @@
 
 		//Send email to notify the failure
-		promote_failure_email()
+		promote_email(false)
 	}
 
@@ -92,32 +91,4 @@
 }
 
-def push_build() {
-	//Don't use the build_stage function which outputs the compiler
-	stage('Push') {
-
-		status_prefix = 'Push'
-
-		def out_dir = pwd tmp: true
-		sh "mkdir -p ${out_dir}"
-
-		//checkout the code to make sure this is a valid git repo
-		checkout scm
-
-		collect_git_info()
-
-		//parse git logs to find what changed
-		sh "git remote > ${out_dir}/GIT_REMOTE"
-		git_remote = readFile("${out_dir}/GIT_REMOTE")
-		remoteDoLangExists = git_remote.contains("DoLang")
-
-		if( !remoteDoLangExists ) {
-			sh 'git remote add DoLang git@gitlab.do-lang.org:internal/cfa-cc.git'
-		}
-
-		//sh "GIT_SSH_COMMAND=\"ssh -v\" git push DoLang ${gitRefNewValue}:master"
-		echo('BUILD NOT PUSH SINCE DO-LANG SERVER WAS DOWN')
-	}
-}
-
 //Helper routine to collect information about the git history
 def collect_git_info() {
@@ -141,20 +112,26 @@
 
 //Email notification on a full build failure
-def promote_failure_email() {
+def promote_email(boolean success) {
 	echo('notifying users')
+
+	def result = success ? "PROMOTE - SUCCESS" : "PROMOTE - FAILURE"
 
 	//Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
 	//Configurations for email format
-	def email_subject = "[cforall git][PROMOTE - FAILURE]"
-	def email_body = """This is an automated email from the Jenkins build machine. It was
-generated because of a git hooks/post-receive script following
-a ref change was pushed to the repository containing
-the project "UNNAMED PROJECT".
+	def email_subject = "[cforall git][${result}]"
+	def email_body = """<p>This is an automated email from the Jenkins build machine. It was
+generated following the result of the C\u2200 nightly build.</p>
 
-Check console output at ${env.BUILD_URL} to view the results.
+<p>Check console output at ${env.BUILD_URL} to view the results.</p>
 
-- Status --------------------------------------------------------------
+<p>- Status --------------------------------------------------------------</p>
 
-PROMOTE FAILURE
+<p>${result}</p>
+
+<p>- Performance ---------------------------------------------------------</p>
+
+<img src="https://cforall.uwaterloo.ca/jenkins/job/Cforall/job/master/plot/Compilation/getPlot?index=0" >
+
+<p>- Logs ----------------------------------------------------------------</p>
 """
 
@@ -162,4 +139,4 @@
 
 	//send email notification
-	emailext body: email_body, subject: email_subject, to: email_to, attachLog: true
+	emailext body: email_body, subject: email_subject, to: email_to, attachLog: !success
 }
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ Jenkinsfile	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -1,3 +1,5 @@
 #!groovy
+
+import groovy.transform.Field
 
 //===========================================================================================================
@@ -22,6 +24,4 @@
 		wrap([$class: 'TimestamperBuildWrapper']) {
 
-			notify_server(0)
-
 			Settings = prepare_build()
 
@@ -34,6 +34,4 @@
 				checkout()
 
-				notify_server(0)
-
 				build()
 
@@ -50,6 +48,4 @@
 			BuildDir  = pwd tmp: true
 			SrcDir    = pwd tmp: false
-
-			notify_server(45)
 		}
 	}
@@ -72,7 +68,5 @@
 	finally {
 		//Send email with final results if this is not a full build
-		if( Settings && !Settings.Silent ) {
-			email(log_needed, Settings.IsSandbox)
-		}
+		email(log_needed)
 
 		echo 'Build Completed'
@@ -116,5 +110,5 @@
 			//Also specify the compiler by hand
 			targets=""
-			if( Settings.RunAllTests ) {
+			if( Settings.RunAllTests || Settings.RunBenchmark ) {
 				targets="--with-target-hosts='host:debug,host:nodebug'"
 			} else {
@@ -153,5 +147,5 @@
 		dir (BuildDir) {
 			//Append bench results
-			sh "${SrcDir}/benchmark/jenkins.sh ${Settings.GitNewRef} ${Settings.Architecture} ${BuildDir}/bench.json"
+			sh "make --no-print-directory -C benchmark jenkins"
 		}
 	}
@@ -176,8 +170,14 @@
 	build_stage('Publish') {
 
-		if( !Settings.Publish ) return
+		if( !Settings.RunBenchmark ) { echo 'No results to publish!!!' }
+
+		def groupCompile = new PlotGroup('Compilation', 'seconds', true)
+		def groupConcurrency = new PlotGroup('Concurrency', 'nanoseconds', false)
 
 		//Then publish the results
-		sh 'curl --silent --show-error -H \'Content-Type: application/json\' --data @${BuildDir}/bench.json https://cforall.uwaterloo.ca:8082/jenkins/publish > /dev/null || true'
+		do_plot(Settings.RunBenchmark && Settings.Publish, 'compile'  , groupCompile    , 'Compilation')
+		do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch', groupConcurrency, 'Context Switching')
+		do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex'    , groupConcurrency, 'Mutual Exclusion')
+		do_plot(Settings.RunBenchmark && Settings.Publish, 'signal'   , groupConcurrency, 'Internal and External Scheduling')
 	}
 }
@@ -196,23 +196,31 @@
 
 	return """
+<pre>
 The branch ${env.BRANCH_NAME} has been updated.
 ${gitUpdate}
-
-Check console output at ${env.BUILD_URL} to view the results.
-
-- Status --------------------------------------------------------------
-
-BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}
-
-- Log -----------------------------------------------------------------
+</pre>
+
+<p>Check console output at ${env.BUILD_URL} to view the results.</p>
+
+<p>- Status --------------------------------------------------------------</p>
+
+<p>BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}</p>
+
+<p>- Log -----------------------------------------------------------------</p>
+
+<pre>
 ${gitLog}
------------------------------------------------------------------------
+</pre>
+
+<p>-----------------------------------------------------------------------</p>
+<pre>
 Summary of changes:
 ${gitDiff}
+</pre>
 """
 }
 
 //Standard build email notification
-def email(boolean log, boolean bIsSandbox) {
+def email(boolean log) {
 	//Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
 	//Configurations for email format
@@ -221,12 +229,12 @@
 	def project_name = (env.JOB_NAME =~ /(.+)\/.+/)[0][1].toLowerCase()
 	def email_subject = "[${project_name} git][BUILD# ${env.BUILD_NUMBER} - ${currentBuild.result}] - branch ${env.BRANCH_NAME}"
-	def email_body = """This is an automated email from the Jenkins build machine. It was
+	def email_body = """<p>This is an automated email from the Jenkins build machine. It was
 generated because of a git hooks/post-receive script following
-a ref change which was pushed to the Cforall repository.
+a ref change which was pushed to the C\u2200 repository.</p>
 """ + GitLogMessage()
 
-	def email_to = "cforall@lists.uwaterloo.ca"
-
-	if( Settings && !Settings.IsSandbox ) {
+	def email_to = !Settings.IsSandbox ? "cforall@lists.uwaterloo.ca" : "tdelisle@uwaterloo.ca"
+
+	if( Settings && !Settings.Silent ) {
 		//send email notification
 		emailext body: email_body, subject: email_subject, to: email_to, attachLog: log
@@ -311,4 +319,5 @@
 		}
 
+		this.IsSandbox          = (branch == "jenkins-sandbox")
 		this.RunAllTests        = param.RunAllTests
 		this.RunBenchmark       = param.RunBenchmark
@@ -316,5 +325,4 @@
 		this.Publish            = param.Publish
 		this.Silent             = param.Silent
-		this.IsSandbox          = (branch == "jenkins-sandbox")
 
 		def full = param.RunAllTests ? " (Full)" : ""
@@ -333,4 +341,16 @@
 		this.GitNewRef = ''
 		this.GitOldRef = ''
+	}
+}
+
+class PlotGroup implements Serializable {
+	public String name
+	public String unit
+	public boolean log
+
+	PlotGroup(String name, String unit, boolean log) {
+		this.name = name
+		this.unit = unit
+		this.log = log
 	}
 }
@@ -398,9 +418,4 @@
 }
 
-def notify_server(int wait) {
-	sh """curl --silent --show-error --data "wait=${wait}" -X POST https://cforall.uwaterloo.ca:8082/jenkins/notify > /dev/null || true"""
-	return
-}
-
 def make_doc() {
 	def err = null
@@ -417,2 +432,30 @@
 	}
 }
+
+def do_plot(boolean silent, String file, PlotGroup group, String title) {
+
+	def series = silent ? [] : [[
+				file: "${file}.csv",
+				exclusionValues: '',
+				displayTableFlag: false,
+				inclusionFlag: 'OFF',
+				url: ''
+			]];
+
+	echo "file is ${BuildDir}/benchmark/${file}.csv, group ${group}, title ${title}"
+	dir("${BuildDir}/benchmark/") {
+		plot csvFileName: "cforall-${env.BRANCH_NAME}-${file}.csv",
+			csvSeries: series,
+			group: "${group.name}",
+			title: "${title}",
+			style: 'lineSimple',
+			exclZero: false,
+			keepRecords: false,
+			logarithmic: group.log,
+			numBuilds: '120',
+			useDescr: true,
+			yaxis: group.unit,
+			yaxisMaximum: '',
+			yaxisMinimum: ''
+	}
+}
Index: benchmark/Makefile.am
===================================================================
--- benchmark/Makefile.am	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ benchmark/Makefile.am	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -67,4 +67,5 @@
 
 .NOTPARALLEL:
+.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
 
 ## =========================================================================================================
@@ -94,38 +95,51 @@
 ## =========================================================================================================
 
+FIX_NEW_LINES = cat $@ | tr "\n" "\t" | sed -r 's/\t,/,/' | tr "\t" "\n" > $@
+
 jenkins$(EXEEXT):
-	@echo "{"
-	@echo -e '\t"githash": "'${githash}'",'
-	@echo -e '\t"arch": "'   ${arch}   '",'
 @DOifskipcompile@
-	@echo -e '\t"compile": {'
-	@+make compile TIME_FORMAT='%e,' PRINT_FORMAT='\t\t\"%s\" :'
-	@echo -e '\t\t"dummy" : {}'
-	@echo -e '\t},'
+	@+make compile.csv
 @DOendif@
-	@echo -e '\t"ctxswitch": {'
-	@echo -en '\t\t"coroutine":'
-	@+make ctxswitch-cfa_coroutine.runquiet
-	@echo -en '\t\t,"thread":'
-	@+make ctxswitch-cfa_thread.runquiet
-	@echo -e '\t},'
-	@echo -e '\t"mutex": ['
-	@echo -en '\t\t'
-	@+make mutex-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make mutex-cfa2.runquiet
-	@echo -e '\t],'
-	@echo -e '\t"scheduling": ['
-	@echo -en '\t\t'
-	@+make signal-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make signal-cfa2.runquiet
-	@echo -en '\t\t,'
-	@+make waitfor-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make waitfor-cfa2.runquiet
-	@echo -e '\n\t],'
-	@echo -e '\t"epoch": ' $(shell date +%s)
-	@echo "}"
+	@+make ctxswitch.csv
+	@+make mutex.csv
+	@+make signal.csv
+@DOifskipcompile@
+	@cat compile.csv
+@DOendif@
+	@cat ctxswitch.csv
+	@cat mutex.csv
+	@cat signal.csv
+
+compile.csv:
+	@echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
+	@+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+ctxswitch.csv:
+	@echo "coroutine,thread" > $@
+	@+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	@+make ctxswitch-cfa_thread.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+mutex.csv:
+	@echo "1-monitor,2-monitor" > $@
+	@+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make mutex-cfa2.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+signal.csv:
+	@echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
+	@+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	@+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make waitfor-cfa2.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
 
 ## =========================================================================================================
Index: benchmark/Makefile.in
===================================================================
--- benchmark/Makefile.in	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ benchmark/Makefile.in	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -401,4 +401,5 @@
 PRINT_FORMAT = %20s: #Comments needed for spacing
 dummy_SOURCES = dummyC.c dummyCXX.cpp
+FIX_NEW_LINES = cat $@ | tr "\n" "\t" | sed -r 's/\t,/,/' | tr "\t" "\n" > $@
 CTXSWITCH_DEPEND = loop.run function.run fetch_add.run \
 	tls-fetch_add.run ctxswitch-pthread.run \
@@ -731,4 +732,5 @@
 
 .NOTPARALLEL:
+.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
 
 all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
@@ -756,37 +758,48 @@
 
 jenkins$(EXEEXT):
-	@echo "{"
-	@echo -e '\t"githash": "'${githash}'",'
-	@echo -e '\t"arch": "'   ${arch}   '",'
 @DOifskipcompile@
-	@echo -e '\t"compile": {'
-	@+make compile TIME_FORMAT='%e,' PRINT_FORMAT='\t\t\"%s\" :'
-	@echo -e '\t\t"dummy" : {}'
-	@echo -e '\t},'
+	@+make compile.csv
 @DOendif@
-	@echo -e '\t"ctxswitch": {'
-	@echo -en '\t\t"coroutine":'
-	@+make ctxswitch-cfa_coroutine.runquiet
-	@echo -en '\t\t,"thread":'
-	@+make ctxswitch-cfa_thread.runquiet
-	@echo -e '\t},'
-	@echo -e '\t"mutex": ['
-	@echo -en '\t\t'
-	@+make mutex-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make mutex-cfa2.runquiet
-	@echo -e '\t],'
-	@echo -e '\t"scheduling": ['
-	@echo -en '\t\t'
-	@+make signal-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make signal-cfa2.runquiet
-	@echo -en '\t\t,'
-	@+make waitfor-cfa1.runquiet
-	@echo -en '\t\t,'
-	@+make waitfor-cfa2.runquiet
-	@echo -e '\n\t],'
-	@echo -e '\t"epoch": ' $(shell date +%s)
-	@echo "}"
+	@+make ctxswitch.csv
+	@+make mutex.csv
+	@+make signal.csv
+@DOifskipcompile@
+	@cat compile.csv
+@DOendif@
+	@cat ctxswitch.csv
+	@cat mutex.csv
+	@cat signal.csv
+
+compile.csv:
+	@echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
+	@+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
+	@+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+ctxswitch.csv:
+	@echo "coroutine,thread" > $@
+	@+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
+	@+make ctxswitch-cfa_thread.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+mutex.csv:
+	@echo "1-monitor,2-monitor" > $@
+	@+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make mutex-cfa2.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
+
+signal.csv:
+	@echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
+	@+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
+	@+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
+	@+make waitfor-cfa2.runquiet >> $@
+	@$(srcdir)/fixcsv.sh $@
 
 loop$(EXEEXT):
Index: benchmark/fixcsv.sh
===================================================================
--- benchmark/fixcsv.sh	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
+++ benchmark/fixcsv.sh	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+CSV=$1
+tmpfile=$(mktemp)
+function finish {
+  rm -rf "$tmpfile"
+}
+trap finish EXIT
+
+mv $CSV $tmpfile
+cat $tmpfile | tr "\n" "\t" | sed -r 's/\t,/,/g;s/,\t/,/g' | tr "\t" "\n" > $CSV
Index: nchmark/jenkins.sh
===================================================================
--- benchmark/jenkins.sh	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ 	(revision )
@@ -1,9 +1,0 @@
-#!/bin/bash
-
-set -o pipefail
-
-GitNewRef=$1
-Architecture=$2
-Out=$3
-
-make --no-print-directory -C benchmark jenkins githash=${GitNewRef} arch=${Architecture} | tee ${Out}
Index: tools/PrettyGitLogs.sh
===================================================================
--- tools/PrettyGitLogs.sh	(revision b10c39a0eabbc4a5be7be30e5a79480917e65b87)
+++ tools/PrettyGitLogs.sh	(revision a3dc4cc4ef5635afc24f2c0ce599f4f81b697692)
@@ -27,3 +27,3 @@
 git rev-list --format=short ${GitOldRef}...${GitNewRef} >  ${GIT_LOG}
 
-git diff --stat ${GitNewRef} ${GitOldRef} >  ${GIT_DIFF}
+git diff --stat --color ${GitNewRef} ${GitOldRef} | sed -e 's/\[32m/<span style\=\"color\: \#00AA00\;\">/g' -e 's/\[31m/<span style\=\"color\: \#AA0000\;\">/g' -e 's/\[m/<\/span>/g' >  ${GIT_DIFF}
