Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision c10ee66d0c4a079e4da1a33ec95eab1c8d49d061)
+++ Jenkins/FullBuild	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -9,28 +9,25 @@
 
 	try {
-		//Prevent the build from exceeding 30 minutes
-		timeout(60) {
+		//Wrap build to add timestamp to command line
+		wrap([$class: 'TimestamperBuildWrapper']) {
 
-			//Wrap build to add timestamp to command line
-			wrap([$class: 'TimestamperBuildWrapper']) {
+			stage('Build') {
 
-				stage 'Build'
+				results = [null, null]
 
-					results = [null, null]
+				parallel (
+					gcc_6_x64: { trigger_build( 'gcc-6',   'x64', true  ) },
+					gcc_6_x86: { trigger_build( 'gcc-6',   'x86', true  ) },
+					gcc_5_x64: { trigger_build( 'gcc-5',   'x64', false ) },
+					gcc_5_x86: { trigger_build( 'gcc-5',   'x86', false ) },
+					gcc_4_x64: { trigger_build( 'gcc-4.9', 'x64', false ) },
+					gcc_4_x86: { trigger_build( 'gcc-4.9', 'x86', false ) },
+					clang_x64: { trigger_build( 'clang',   'x64', false ) },
+					clang_x86: { trigger_build( 'clang',   'x86', false ) },
+				)
+			}
 
-					parallel (
-						gcc_6_x64: { trigger_build( 'gcc-6',   'x64', true  ) },
-						gcc_6_x86: { trigger_build( 'gcc-6',   'x86', true  ) },
-						gcc_5_x64: { trigger_build( 'gcc-5',   'x64', false ) },
-						gcc_5_x86: { trigger_build( 'gcc-5',   'x86', false ) },
-						gcc_4_x64: { trigger_build( 'gcc-4.9', 'x64', false ) },
-						gcc_4_x86: { trigger_build( 'gcc-4.9', 'x86', false ) },
-						clang_x64: { trigger_build( 'clang',   'x64', false ) },
-						clang_x86: { trigger_build( 'clang',   'x86', false ) },
-					)
-
-				//Push latest changes to do-lang repo
-				push_build()
-			}
+			//Push latest changes to do-lang repo
+			push_build()
 		}
 	}
@@ -99,5 +96,5 @@
 def push_build() {
 	//Don't use the build_stage function which outputs the compiler
-	stage 'Push'
+	stage('Push') {
 
 		status_prefix = 'Push'
@@ -122,4 +119,5 @@
 		//sh "GIT_SSH_COMMAND=\"ssh -v\" git push DoLang ${gitRefNewValue}:master"
 		echo('BUILD NOT PUSH SINCE DO-LANG SERVER WAS DOWN')
+	}
 }
 
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision c10ee66d0c4a079e4da1a33ec95eab1c8d49d061)
+++ Jenkinsfile	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -28,27 +28,23 @@
 		wrap([$class: 'TimestamperBuildWrapper']) {
 
-			//Prevent the build from exceeding 60 minutes
-			timeout(60) {
-
-				notify_server()
-
-				prepare_build()
-
-				checkout()
-
-				build()
-
-				test()
-
-				benchmark()
-
-				clean()
-
-				build_doc()
-
-				publish()
-
-				notify_server()
-			}
+			notify_server()
+
+			prepare_build()
+
+			checkout()
+
+			build()
+
+			test()
+
+			benchmark()
+
+			clean()
+
+			build_doc()
+
+			publish()
+
+			notify_server()
 		}
 	}
@@ -89,4 +85,6 @@
 def collect_git_info() {
 
+	checkout scm
+
 	//create the temporary output directory in case it doesn't already exist
 	def out_dir = pwd tmp: true
@@ -95,7 +93,5 @@
 	//parse git logs to find what changed
 	gitRefName = env.BRANCH_NAME
-	dir("../${gitRefName}@script") {
-		sh "git reflog > ${out_dir}/GIT_COMMIT"
-	}
+	sh "git reflog > ${out_dir}/GIT_COMMIT"
 	git_reflog = readFile("${out_dir}/GIT_COMMIT")
 	gitRefOldValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][1]
@@ -170,7 +166,7 @@
 }
 
-def build_stage(String name) {
+def build_stage(String name, Closure block ) {
 	stage_name = name
-	stage name
+	stage(name, block)
 }
 
@@ -245,5 +241,5 @@
 //Compilation script is done here but environnement set-up and error handling is done in main loop
 def checkout() {
-	build_stage'Checkout'
+	build_stage('Checkout') {
 		//checkout the source code and clean the repo
 		checkout scm
@@ -254,8 +250,9 @@
 		//Reset the git repo so no local changes persist
 		sh 'git reset --hard'
+	}
 }
 
 def build() {
-	build_stage'Build'
+	build_stage('Build') {
 	
 		def install_dir = pwd tmp: true
@@ -269,8 +266,9 @@
 		//Compile the project
 		sh 'make -j 8 --no-print-directory V=0 install'
+	}
 }
 
 def test() {
-	build_stage'Test'
+	build_stage('Test') {
 
 		//Run the tests from the tests directory
@@ -282,8 +280,9 @@
 			sh 'make -C src/tests'
 		}
+	}
 }
 
 def benchmark() {
-	build_stage'Benchmark'
+	build_stage('Benchmark') {
 
 		if( !do_benchmark ) return
@@ -294,15 +293,17 @@
 		//Append bench results
 		sh 'make -C src/benchmark --no-print-directory csv-data >> bench.csv'
+	}
 }
 
 def clean() {
-	build_stage'Cleanup'
+	build_stage('Cleanup') {
 
 		//do a maintainer-clean to make sure we need to remake from scratch
 		sh 'make maintainer-clean > /dev/null'
+	}
 }
 
 def build_doc() {
-	build_stage'Documentation'
+	build_stage('Documentation') {
 
 		if( !do_doc ) return
@@ -315,8 +316,9 @@
 			make_doc()
 		}
+	}
 }
 
 def publish() {
-	build_stage'Publish'
+	build_stage('Publish') {
 
 		if( !do_publish ) return
@@ -324,4 +326,5 @@
 		//Then publish the results
 		sh 'curl --silent --data @bench.csv http://plg2:8082/jenkins/publish > /dev/null || true'
+	}
 }
 
Index: src/CodeGen/LineStream.cc
===================================================================
--- src/CodeGen/LineStream.cc	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
+++ src/CodeGen/LineStream.cc	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -0,0 +1,101 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LineStream.cc -- Modified stream that inserts line directives into output.
+//
+// Author           : Andrew Beach
+// Created On       : Thr May 4 13:15:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri May 5 14:29:00 2017
+// Update Count     : 0
+//
+
+#include "LineStream.h"
+
+namespace CodeGen {
+
+	LineStream::LineStream(std::ostream & baseStream, bool insertLines) :
+		baseStream(baseStream), insertLines(insertLines)
+	{}
+
+	void LineStream::printLineDirective(CodeLocation const & location) {
+		baseStream << "\n# " << location.linenumber;
+		if (std::string("") != location.filename) {
+			baseStream << " \"" << location.filename  << '"';
+		}
+		baseStream << '\n';
+	}
+
+	bool LineStream::actualDiffersFromExpected() const {
+		return actualLocation.isSet() &&
+			// actualLocation & expectedLocation must match at the line.
+			(actualLocation.linenumber != expectedLocation.linenumber ||
+			 actualLocation.filename != expectedLocation.filename);
+	}
+
+	void LineStream::emptyBuffer(bool addNewline) {
+		if (actualDiffersFromExpected()) {
+			printLineDirective(actualLocation);
+			expectedLocation = actualLocation;
+		}
+		actualLocation.unset();
+
+		if (addNewLine) {
+			expectedLocation.linenumber += 1;
+			buffer.put('\n');
+		}
+
+		baseStream << buffer.str() << std::flush;
+		buffer.str("");
+	}
+
+	void LineStream::setLoc(CodeLocation const & location) {
+		if (insertLines) {
+			if (expectedLocation.isUnset()) {
+				expectedLocation = actualLocation = location;
+			} else if (actualLocation.isUnset()) {
+				actualLocation = location;
+			} else if (actualLocation.filename != location.filename) {
+				emptyBuffer(true);
+				actualLocation = location;
+			} else if (location.linenumber <= actualLocation.linenumber){
+				actualLocation.linenumber = location.linenumber;
+			}
+		}
+	}
+
+	LineStream & LineStream::operator<<(char const * str) {
+		buffer << str;
+		return *this;
+	}
+
+	LineStream & LineStream::operator<<(std::string const & str) {
+		buffer << str;
+		return *this;
+	}
+
+	LineStream & LineStream::operator<<(StreamFlag flag) {
+		static StringFlag const endlCopy = std::endl;
+		if (!insertLines) {
+			baseStream << flag;
+		} else if (endlCopy == flag) {
+			emptyBuffer(true);
+		} else {
+			buffer << flag;
+		}
+		return *this;
+	}
+
+	LineStream & LineStream::flush() {
+		if (insertLines) {
+			emptyBuffer(false);
+		} else {
+			baseStream.flush();
+		}
+		return *this;
+	}
+
+} // CodeGen
Index: src/CodeGen/LineStream.h
===================================================================
--- src/CodeGen/LineStream.h	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
+++ src/CodeGen/LineStream.h	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -0,0 +1,59 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// LineStream.h -- Modified stream that inserts line directives into output.
+//
+// Author           : Andrew Beach
+// Created On       : Wed May 4 09:15:00 2017
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri May 5 14:29:00 2017
+// Update Count     : 1
+//
+
+#ifndef LINE_STREAM_H
+#define LINE_STREAM_H
+
+#include <ostream>
+#include <sstream>
+#include <string>
+
+#include "Common/utility.h"
+
+namespace CodeGen {
+
+	class LineStream : public std::ostream {
+		std::ostream & baseStream;
+		std::ostringstream buffer;
+
+		bool const insertLines;
+
+		CodeLocation actualLocation;
+		CodeLocation expectedLocation;
+
+		void printLineDirective(CodeLocation const & location);
+		bool actualDiffersFromExpected() const;
+		void emptyBuffer(bool addNewline);
+
+	public:
+		typedef std::ostream &(*StreamFlag)(std::ostream &);
+
+		LineStream(std::ostream & baseStream, bool insertLines) :
+			baseStream(baseStream), insertLines(insertLines)
+		{}
+
+		/// Update the currentLocation in source code.
+		void setLoc(CodeLocation const & location);
+
+		/// Formated output is buffered until flushed.
+		std::ostream & operator<<(char const *str);
+		std::ostream & operator<<(std::string str);
+		std::ostream & operator<<(StreamFlag flag);
+
+	}; // LineStream
+
+} // CodeGen
+
+#endif // LINE_STREAM_H
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision c10ee66d0c4a079e4da1a33ec95eab1c8d49d061)
+++ src/Common/utility.h	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 14 21:25:25 2016
-// Update Count     : 31
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri May 5 11:03:00 2017
+// Update Count     : 32
 //
 
@@ -322,17 +322,34 @@
 	std::string filename;
 
-	CodeLocation() 
+    /// Create a new unset CodeLocation.
+	CodeLocation()
 		: linenumber( -1 )
 		, filename("")
 	{}
 
+    /// Create a new CodeLocation with the given values.
 	CodeLocation( const char* filename, int lineno )
 		: linenumber( lineno )
 		, filename(filename ? filename : "")
 	{}
+
+    bool isSet () const {
+        return -1 != linenumber;
+    }
+
+    bool isUnset () const {
+        return !isSet();
+    }
+
+	void unset () {
+		linenumber = -1;
+		filename = "";
+	}
+
+	// Use field access for set.
 };
 
 inline std::string to_string( const CodeLocation& location ) {
-	return location.linenumber >= 0 ? location.filename + ":" + std::to_string(location.linenumber) + " " : "";
+	return location.isSet() ? location.filename + ":" + std::to_string(location.linenumber) + " " : "";
 }
 #endif // _UTILITY_H
Index: src/benchmark/csv-data.c
===================================================================
--- src/benchmark/csv-data.c	(revision c10ee66d0c4a079e4da1a33ec95eab1c8d49d061)
+++ src/benchmark/csv-data.c	(revision 298581c262ddd363b651f744e19dacb75b96edbc)
@@ -100,4 +100,102 @@
 }
 
+//-----------------------------------------------------------------------------
+// single internal sched entry
+mon_t mon1;
+
+condition cond1a; 
+condition cond1b;
+
+thread thrd1a { long long int * out; };
+thread thrd1b {};
+
+void ?{}( thrd1a * this, long long int * out ) {
+	this->out = out;
+}
+
+void side1A( mon_t * mutex a, long long int * out ) {
+	long long int StartTime, EndTime;
+
+	StartTime = Time();
+	for( int i = 0;; i++ ) {
+		signal(&cond1a);
+		if( i > N ) break;
+		wait(&cond1b);
+	}
+	EndTime = Time();
+
+	*out = ( EndTime - StartTime ) / N;
+}
+
+void side1B( mon_t * mutex a ) {
+	for( int i = 0;; i++ ) {
+		signal(&cond1b);
+		if( i > N ) break;
+		wait(&cond1a);
+	}
+}
+
+void main( thrd1a * this ) { side1A( &mon1, this->out ); }
+void main( thrd1b * this ) { side1B( &mon1 ); }
+
+long long int measure_1_sched_int() {
+	long long int t;
+	{
+		thrd1a a = { &t };
+		thrd1b b;
+	}
+	return t;
+}
+
+//-----------------------------------------------------------------------------
+// multi internal sched entry
+mon_t mon2;
+
+condition cond2a; 
+condition cond2b;
+
+thread thrd2a { long long int * out; };
+thread thrd2b {};
+
+void ?{}( thrd2a * this, long long int * out ) {
+	this->out = out;
+}
+
+void side2A( mon_t * mutex a, mon_t * mutex b, long long int * out ) {
+	long long int StartTime, EndTime;
+
+	StartTime = Time();
+	for( int i = 0;; i++ ) {
+		signal(&cond2a);
+		if( i > N ) break;
+		wait(&cond2b);
+	}
+	EndTime = Time();
+
+	*out = ( EndTime - StartTime ) / N;
+}
+
+void side2B( mon_t * mutex a, mon_t * mutex b ) {
+	for( int i = 0;; i++ ) {
+		signal(&cond2b);
+		if( i > N ) break;
+		wait(&cond2a);
+	}
+}
+
+void main( thrd2a * this ) { side2A( &mon1, &mon2, this->out ); }
+void main( thrd2b * this ) { side2B( &mon1, &mon2 ); }
+
+long long int measure_2_sched_int() {
+	long long int t;
+	{
+		thrd2a a = { &t };
+		thrd2b b;
+	}
+	return t;
+}
+
+//-----------------------------------------------------------------------------
+// main loop
 int main()
 {
@@ -106,4 +204,6 @@
 	sout | measure_thread() | ',';
 	sout | measure_1_monitor_entry() | ',';
-	sout | measure_2_monitor_entry() | endl;
-}
+	sout | measure_2_monitor_entry() | ',';
+	sout | measure_1_sched_int() | ',';
+	sout | measure_2_sched_int() | endl;
+}
