Index: src/backend/access/transam/slru.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/slru.c,v
retrieving revision 1.47
diff -u -3 -p -r1.47 slru.c
--- src/backend/access/transam/slru.c	2 Apr 2009 20:59:10 -0000	1.47
+++ src/backend/access/transam/slru.c	31 Aug 2009 18:29:39 -0000
@@ -57,6 +57,7 @@
 #include "storage/fd.h"
 #include "storage/shmem.h"
 #include "miscadmin.h"
+#include "pg_trace.h"
 
 
 /*
@@ -372,6 +373,7 @@ SimpleLruReadPage(SlruCtl ctl, int pagen
 {
 	SlruShared	shared = ctl->shared;
 
+	TRACE_POSTGRESQL_SLRU_READPAGE_START((uintptr_t)ctl, pageno, write_ok, xid);
 	/* Outer loop handles restart if we must wait for someone else's I/O */
 	for (;;)
 	{
@@ -399,6 +401,7 @@ SimpleLruReadPage(SlruCtl ctl, int pagen
 			}
 			/* Otherwise, it's ready to use */
 			SlruRecentlyUsed(shared, slotno);
+			TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno);
 			return slotno;
 		}
 
@@ -446,6 +449,7 @@ SimpleLruReadPage(SlruCtl ctl, int pagen
 			SlruReportIOError(ctl, pageno, xid);
 
 		SlruRecentlyUsed(shared, slotno);
+		TRACE_POSTGRESQL_SLRU_READPAGE_DONE(slotno);
 		return slotno;
 	}
 }
@@ -470,6 +474,8 @@ SimpleLruReadPage_ReadOnly(SlruCtl ctl, 
 	SlruShared	shared = ctl->shared;
 	int			slotno;
 
+	TRACE_POSTGRESQL_SLRU_READPAGE_READONLY((uintptr_t)ctl, pageno, xid);
+
 	/* Try to find the page while holding only shared lock */
 	LWLockAcquire(shared->ControlLock, LW_SHARED);
 
@@ -511,6 +517,8 @@ SimpleLruWritePage(SlruCtl ctl, int slot
 	int			pageno = shared->page_number[slotno];
 	bool		ok;
 
+	TRACE_POSTGRESQL_SLRU_WRITEPAGE_START((uintptr_t)ctl, pageno, slotno);
+
 	/* If a write is in progress, wait for it to finish */
 	while (shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS &&
 		   shared->page_number[slotno] == pageno)
@@ -525,7 +533,10 @@ SimpleLruWritePage(SlruCtl ctl, int slot
 	if (!shared->page_dirty[slotno] ||
 		shared->page_status[slotno] != SLRU_PAGE_VALID ||
 		shared->page_number[slotno] != pageno)
+	{
+		TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE();
 		return;
+	}
 
 	/*
 	 * Mark the slot write-busy, and clear the dirtybit.  After this point, a
@@ -569,6 +580,8 @@ SimpleLruWritePage(SlruCtl ctl, int slot
 	/* Now it's okay to ereport if we failed */
 	if (!ok)
 		SlruReportIOError(ctl, pageno, InvalidTransactionId);
+
+	TRACE_POSTGRESQL_SLRU_WRITEPAGE_DONE();
 }
 
 /*
@@ -593,6 +606,8 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 
 	SlruFileName(ctl, path, segno);
 
+	TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_START((uintptr_t)ctl, path, pageno, slotno);
+
 	/*
 	 * In a crash-and-restart situation, it's possible for us to receive
 	 * commands to set the commit status of transactions whose bits are in
@@ -607,6 +622,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 		{
 			slru_errcause = SLRU_OPEN_FAILED;
 			slru_errno = errno;
+			TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 			return false;
 		}
 
@@ -614,6 +630,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 				(errmsg("file \"%s\" doesn't exist, reading as zeroes",
 						path)));
 		MemSet(shared->page_buffer[slotno], 0, BLCKSZ);
+		TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, slru_errcause, slru_errno);
 		return true;
 	}
 
@@ -622,6 +639,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 		slru_errcause = SLRU_SEEK_FAILED;
 		slru_errno = errno;
 		close(fd);
+		TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 		return false;
 	}
 
@@ -631,6 +649,7 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 		slru_errcause = SLRU_READ_FAILED;
 		slru_errno = errno;
 		close(fd);
+		TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 		return false;
 	}
 
@@ -638,9 +657,12 @@ SlruPhysicalReadPage(SlruCtl ctl, int pa
 	{
 		slru_errcause = SLRU_CLOSE_FAILED;
 		slru_errno = errno;
+		TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 		return false;
 	}
 
+	TRACE_POSTGRESQL_SLRU_READPAGE_PHYSICAL_DONE(true, slru_errcause, slru_errno);
+
 	return true;
 }
 
@@ -668,6 +690,8 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 	char		path[MAXPGPATH];
 	int			fd = -1;
 
+	TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_START((uintptr_t)ctl, pageno, slotno);
+
 	/*
 	 * Honor the write-WAL-before-data rule, if appropriate, so that we do not
 	 * write out data before associated WAL records.  This is the same action
@@ -753,6 +777,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 		{
 			slru_errcause = SLRU_OPEN_FAILED;
 			slru_errno = errno;
+			TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 			return false;
 		}
 
@@ -781,6 +806,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 		slru_errno = errno;
 		if (!fdata)
 			close(fd);
+		TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 		return false;
 	}
 
@@ -794,6 +820,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 		slru_errno = errno;
 		if (!fdata)
 			close(fd);
+		TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 		return false;
 	}
 
@@ -808,6 +835,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 			slru_errcause = SLRU_FSYNC_FAILED;
 			slru_errno = errno;
 			close(fd);
+			TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 			return false;
 		}
 
@@ -815,10 +843,12 @@ SlruPhysicalWritePage(SlruCtl ctl, int p
 		{
 			slru_errcause = SLRU_CLOSE_FAILED;
 			slru_errno = errno;
+			TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(false, slru_errcause, slru_errno);
 			return false;
 		}
 	}
 
+	TRACE_POSTGRESQL_SLRU_WRITEPAGE_PHYSICAL_DONE(true, slru_errcause,slru_errno);
 	return true;
 }
 
Index: src/backend/executor/execScan.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/execScan.c,v
retrieving revision 1.46
diff -u -3 -p -r1.46 execScan.c
--- src/backend/executor/execScan.c	2 Apr 2009 20:59:10 -0000	1.46
+++ src/backend/executor/execScan.c	31 Aug 2009 18:29:39 -0000
@@ -21,6 +21,7 @@
 #include "executor/executor.h"
 #include "miscadmin.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 static bool tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, TupleDesc tupdesc);
@@ -60,6 +61,8 @@ ExecScan(ScanState *node,
 	qual = node->ps.qual;
 	projInfo = node->ps.ps_ProjInfo;
 
+	TRACE_POSTGRESQL_EXECUTOR_SCAN((uintptr_t)node, ((Scan *)node->ps.plan)->scanrelid, (uintptr_t)accessMtd);
+
 	/*
 	 * If we have neither a qual to check nor a projection to do, just skip
 	 * all the overhead and return the raw scan tuple.
Index: src/backend/executor/nodeAgg.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeAgg.c,v
retrieving revision 1.168
diff -u -3 -p -r1.168 nodeAgg.c
--- src/backend/executor/nodeAgg.c	23 Jul 2009 20:45:27 -0000	1.168
+++ src/backend/executor/nodeAgg.c	31 Aug 2009 18:29:39 -0000
@@ -88,6 +88,7 @@
 #include "utils/syscache.h"
 #include "utils/tuplesort.h"
 #include "utils/datum.h"
+#include "pg_trace.h"
 
 
 /*
@@ -818,6 +819,8 @@ ExecAgg(AggState *node)
 		node->ss.ps.ps_TupFromTlist = false;
 	}
 
+	TRACE_POSTGRESQL_EXECUTOR_AGG((uintptr_t)node, ((Agg *) node->ss.ps.plan)->aggstrategy);
+
 	/*
 	 * Exit if nothing left to do.  (We must do the ps_TupFromTlist check
 	 * first, because in some cases agg_done gets set before we emit the
Index: src/backend/executor/nodeGroup.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeGroup.c,v
retrieving revision 1.75
diff -u -3 -p -r1.75 nodeGroup.c
--- src/backend/executor/nodeGroup.c	2 Apr 2009 20:59:10 -0000	1.75
+++ src/backend/executor/nodeGroup.c	31 Aug 2009 18:29:39 -0000
@@ -24,6 +24,7 @@
 
 #include "executor/executor.h"
 #include "executor/nodeGroup.h"
+#include "pg_trace.h"
 
 
 /*
@@ -49,6 +50,8 @@ ExecGroup(GroupState *node)
 	numCols = ((Group *) node->ss.ps.plan)->numCols;
 	grpColIdx = ((Group *) node->ss.ps.plan)->grpColIdx;
 
+	TRACE_POSTGRESQL_EXECUTOR_GROUP((uintptr_t)node, numCols);
+
 	/*
 	 * Check to see if we're still projecting out tuples from a previous group
 	 * tuple (because there is a function-returning-set in the projection
Index: src/backend/executor/nodeHash.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeHash.c,v
retrieving revision 1.121
diff -u -3 -p -r1.121 nodeHash.c
--- src/backend/executor/nodeHash.c	11 Jun 2009 14:48:57 -0000	1.121
+++ src/backend/executor/nodeHash.c	31 Aug 2009 18:29:39 -0000
@@ -79,6 +79,8 @@ MultiExecHash(HashState *node)
 	ExprContext *econtext;
 	uint32		hashvalue;
 
+	TRACE_POSTGRESQL_EXECUTOR_HASH_MULTI((uintptr_t)node);
+
 	/* must provide our own instrumentation support */
 	if (node->ps.instrument)
 		InstrStartNode(node->ps.instrument);
Index: src/backend/executor/nodeHashjoin.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v
retrieving revision 1.101
diff -u -3 -p -r1.101 nodeHashjoin.c
--- src/backend/executor/nodeHashjoin.c	11 Jun 2009 14:48:57 -0000	1.101
+++ src/backend/executor/nodeHashjoin.c	31 Aug 2009 18:29:39 -0000
@@ -20,6 +20,7 @@
 #include "executor/nodeHash.h"
 #include "executor/nodeHashjoin.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 /* Returns true for JOIN_LEFT and JOIN_ANTI jointypes */
@@ -61,6 +62,8 @@ ExecHashJoin(HashJoinState *node)
 	uint32		hashvalue;
 	int			batchno;
 
+	TRACE_POSTGRESQL_EXECUTOR_HASHJOIN((uintptr_t)node);
+
 	/*
 	 * get information from HashJoin node
 	 */
Index: src/backend/executor/nodeLimit.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeLimit.c,v
retrieving revision 1.39
diff -u -3 -p -r1.39 nodeLimit.c
--- src/backend/executor/nodeLimit.c	11 Jun 2009 14:48:57 -0000	1.39
+++ src/backend/executor/nodeLimit.c	31 Aug 2009 18:29:39 -0000
@@ -23,6 +23,7 @@
 
 #include "executor/executor.h"
 #include "executor/nodeLimit.h"
+#include "pg_trace.h"
 
 static void recompute_limits(LimitState *node);
 
@@ -41,6 +42,8 @@ ExecLimit(LimitState *node)
 	TupleTableSlot *slot;
 	PlanState  *outerPlan;
 
+	TRACE_POSTGRESQL_EXECUTOR_LIMIT((uintptr_t)node);
+
 	/*
 	 * get information from the node
 	 */
Index: src/backend/executor/nodeMaterial.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v
retrieving revision 1.69
diff -u -3 -p -r1.69 nodeMaterial.c
--- src/backend/executor/nodeMaterial.c	11 Jun 2009 14:48:57 -0000	1.69
+++ src/backend/executor/nodeMaterial.c	31 Aug 2009 18:29:39 -0000
@@ -24,6 +24,7 @@
 #include "executor/executor.h"
 #include "executor/nodeMaterial.h"
 #include "miscadmin.h"
+#include "pg_trace.h"
 
 /* ----------------------------------------------------------------
  *		ExecMaterial
@@ -45,6 +46,8 @@ ExecMaterial(MaterialState *node)
 	bool		eof_tuplestore;
 	TupleTableSlot *slot;
 
+	TRACE_POSTGRESQL_EXECUTOR_MATERIAL((uintptr_t)node);
+
 	/*
 	 * get state info from node
 	 */
Index: src/backend/executor/nodeMergejoin.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeMergejoin.c,v
retrieving revision 1.97
diff -u -3 -p -r1.97 nodeMergejoin.c
--- src/backend/executor/nodeMergejoin.c	11 Jun 2009 14:48:57 -0000	1.97
+++ src/backend/executor/nodeMergejoin.c	31 Aug 2009 18:29:40 -0000
@@ -102,6 +102,7 @@
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
 #include "utils/syscache.h"
+#include "pg_trace.h"
 
 
 /*
@@ -565,6 +566,8 @@ ExecMergeJoin(MergeJoinState *node)
 	bool		doFillOuter;
 	bool		doFillInner;
 
+	TRACE_POSTGRESQL_EXECUTOR_MERGEJOIN((uintptr_t)node);
+
 	/*
 	 * get information from node
 	 */
Index: src/backend/executor/nodeNestloop.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeNestloop.c,v
retrieving revision 1.53
diff -u -3 -p -r1.53 nodeNestloop.c
--- src/backend/executor/nodeNestloop.c	11 Jun 2009 14:48:57 -0000	1.53
+++ src/backend/executor/nodeNestloop.c	31 Aug 2009 18:29:40 -0000
@@ -24,6 +24,7 @@
 #include "executor/execdebug.h"
 #include "executor/nodeNestloop.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 /* ----------------------------------------------------------------
@@ -67,6 +68,8 @@ ExecNestLoop(NestLoopState *node)
 	List	   *otherqual;
 	ExprContext *econtext;
 
+	TRACE_POSTGRESQL_EXECUTOR_NESTLOOP((uintptr_t)node);
+
 	/*
 	 * get information from the node
 	 */
Index: src/backend/executor/nodeSetOp.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeSetOp.c,v
retrieving revision 1.31
diff -u -3 -p -r1.31 nodeSetOp.c
--- src/backend/executor/nodeSetOp.c	11 Jun 2009 14:48:57 -0000	1.31
+++ src/backend/executor/nodeSetOp.c	31 Aug 2009 18:29:40 -0000
@@ -47,6 +47,7 @@
 #include "executor/executor.h"
 #include "executor/nodeSetOp.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 /*
@@ -196,6 +197,8 @@ ExecSetOp(SetOpState *node)
 	SetOp	   *plannode = (SetOp *) node->ps.plan;
 	TupleTableSlot *resultTupleSlot = node->ps.ps_ResultTupleSlot;
 
+	TRACE_POSTGRESQL_EXECUTOR_SETOP((uintptr_t)node);
+
 	/*
 	 * If the previously-returned tuple needs to be returned more than once,
 	 * keep returning it.
Index: src/backend/executor/nodeSort.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeSort.c,v
retrieving revision 1.65
diff -u -3 -p -r1.65 nodeSort.c
--- src/backend/executor/nodeSort.c	2 Apr 2009 20:59:10 -0000	1.65
+++ src/backend/executor/nodeSort.c	31 Aug 2009 18:29:40 -0000
@@ -19,6 +19,7 @@
 #include "executor/nodeSort.h"
 #include "miscadmin.h"
 #include "utils/tuplesort.h"
+#include "pg_trace.h"
 
 
 /* ----------------------------------------------------------------
@@ -53,6 +54,8 @@ ExecSort(SortState *node)
 	dir = estate->es_direction;
 	tuplesortstate = (Tuplesortstate *) node->tuplesortstate;
 
+	TRACE_POSTGRESQL_EXECUTOR_SORT((uintptr_t)node, dir);
+
 	/*
 	 * If first time through, read all tuples from outer plan and pass them to
 	 * tuplesort.c. Subsequent calls just fetch tuples from tuplesort.
Index: src/backend/executor/nodeSubplan.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeSubplan.c,v
retrieving revision 1.99
diff -u -3 -p -r1.99 nodeSubplan.c
--- src/backend/executor/nodeSubplan.c	11 Jun 2009 14:48:57 -0000	1.99
+++ src/backend/executor/nodeSubplan.c	31 Aug 2009 18:29:40 -0000
@@ -27,6 +27,7 @@
 #include "utils/array.h"
 #include "utils/lsyscache.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 static Datum ExecSubPlan(SubPlanState *node,
@@ -92,6 +93,8 @@ ExecHashSubPlan(SubPlanState *node,
 	ExprContext *innerecontext = node->innerecontext;
 	TupleTableSlot *slot;
 
+	TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_HASH((uintptr_t)node);
+
 	/* Shouldn't have any direct correlation Vars */
 	if (subplan->parParam != NIL || node->args != NIL)
 		elog(ERROR, "hashed subplan with direct correlation not supported");
@@ -227,6 +230,8 @@ ExecScanSubPlan(SubPlanState *node,
 	ListCell   *l;
 	ArrayBuildState *astate = NULL;
 
+	TRACE_POSTGRESQL_EXECUTOR_SUBPLAN_SCAN((uintptr_t)node);
+
 	/*
 	 * We are probably in a short-lived expression-evaluation context. Switch
 	 * to the per-query context for manipulating the child plan's chgParam,
Index: src/backend/executor/nodeUnique.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/nodeUnique.c,v
retrieving revision 1.61
diff -u -3 -p -r1.61 nodeUnique.c
--- src/backend/executor/nodeUnique.c	11 Jun 2009 14:48:57 -0000	1.61
+++ src/backend/executor/nodeUnique.c	31 Aug 2009 18:29:40 -0000
@@ -36,6 +36,7 @@
 #include "executor/executor.h"
 #include "executor/nodeUnique.h"
 #include "utils/memutils.h"
+#include "pg_trace.h"
 
 
 /* ----------------------------------------------------------------
@@ -50,6 +51,8 @@ ExecUnique(UniqueState *node)
 	TupleTableSlot *slot;
 	PlanState  *outerPlan;
 
+	TRACE_POSTGRESQL_EXECUTOR_UNIQUE((uintptr_t)node);
+
 	/*
 	 * get information from the node
 	 */
Index: src/backend/utils/probes.d
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/probes.d,v
retrieving revision 1.11
diff -u -3 -p -r1.11 probes.d
--- src/backend/utils/probes.d	2 Apr 2009 20:59:10 -0000	1.11
+++ src/backend/utils/probes.d	31 Aug 2009 18:29:40 -0000
@@ -15,6 +15,7 @@
  * in probe definitions, as they cause compilation errors on Mac OS X 10.5.
  */
 #define LocalTransactionId unsigned int
+#define TransactionId unsigned int
 #define LWLockId int
 #define LWLockMode int
 #define LOCKMODE int
@@ -90,4 +91,29 @@ provider postgresql {
 	probe xlog__switch();
 	probe wal__buffer__write__dirty__start();
 	probe wal__buffer__write__dirty__done();
+
+	probe slru__readpage__start(unsigned int, int, bool, TransactionId);
+	probe slru__readpage__done(int);
+	probe slru__readpage__readonly(unsigned int, int, TransactionId);
+	probe slru__writepage__start(unsigned int, int, int);
+	probe slru__writepage__done();
+	probe slru__readpage__physical__start(unsigned int, char *, int, int);
+	probe slru__readpage__physical__done(int, int, int);
+	probe slru__writepage__physical__start(unsigned int, int, int);
+	probe slru__writepage__physical__done(int, int, int);
+ 
+	probe executor__scan(unsigned int, unsigned int, unsigned int);
+	probe executor__agg(unsigned int, int);
+	probe executor__group(unsigned int, int);
+	probe executor__hash__multi(unsigned int);
+	probe executor__hashjoin(unsigned int);
+	probe executor__limit(unsigned int);
+	probe executor__material(unsigned int);
+	probe executor__mergejoin(unsigned int);
+	probe executor__nestloop(unsigned int);
+	probe executor__setop(unsigned int);
+	probe executor__sort(unsigned int, int);
+	probe executor__subplan__hash(unsigned int);
+	probe executor__subplan__scan(unsigned int);
+	probe executor__unique(unsigned int);
 };