Index: /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c
===================================================================
--- /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c	(revision 18879)
+++ /branches/eam_branch_20080804/psModules/src/detrend/pmBias.c	(revision 18880)
@@ -18,31 +18,18 @@
 #include "pmBias.h"
 
-typedef struct {
-  pmReadout *in;
-  pmReadout *sub;
-  float scan;
-  int xOffset, yOffset;
-  int rowStart, rowStop;
-} pmBiasSubtractScanArgs;
-
-void pmBiasSubtractScanArgsFree (pmBiasSubtractScanArgs *args) {
-  return;
-}
-
-pmBiasSubtractScanArgs *pmBiasSubtractScanArgsAlloc () {
-
-}
+// XXX create scalar macro lookups: PS_SCALAR_VALUE(DATA,TYPE)
+
+# define PS_SCALAR_VALUE(DATA,TYPE) ((psScalar *)(DATA)->data.##TYPE)
 
 pmBiasSubtractScan_Threaded (psThreadJob *job) {
-
-      args->in = in;
-      args->sub = sub;
-      args->scan = scan;
-      args->xOffset = xOffset;
-      args->yOffset = yOffset;
-      args->rowStart = rowStart;
-      args->rowStop = rowStop;
-      bool status = pmBiasSubtractScan (args->in, args->sub, args->scan, args->xOffset, args->yOffset, args->rowStart, args->rowStop);
-      return status;
+    pmReadout *in = job->args->data[0];
+    pmReadout *sub = job->args->data[1];
+    float scan   = PS_SCALAR_VALUE(job->args->data[2],F32);
+    int xOffset  = PS_SCALAR_VALUE(job->args->data[3],S32);
+    int yOffset  = PS_SCALAR_VALUE(job->args->data[4],S32);
+    int rowStart = PS_SCALAR_VALUE(job->args->data[5],S32);
+    int rowStop  = PS_SCALAR_VALUE(job->args->data[6],S32);
+    bool status = pmBiasSubtractScan (in, sub, scan, xOffset, yOffset, rowStart, rowStop);
+    return status;
 }
 
@@ -149,19 +136,13 @@
       int rowStop = PS_MIN (rowStart + scanRows, inImage->numRows);
 
-      // allocate a job
+      // allocate a job, construct the arguments for this job
       psThreadJob *job = psThreadJobAlloc ("PSMODULES_DETREND_BIAS");
-
-      pmBiasSubtractScanArgs *args = pmBiasSubtractScanArgsAlloc ();
-      args->in = in;
-      args->sub = sub;
-      args->scan = scan;
-      args->xOffset = xOffset;
-      args->yOffset = yOffset;
-      args->rowStart = rowStart;
-      args->rowStop = rowStop;
-
-      // construct the arguments for this job
-      psArrayAdd (job->args, 1, args);
-      psFree (args);
+      psArrayAdd (job->args, 1, in);
+      psArrayAdd (job->args, 1, sub);
+      psArrayAdd (job->args, 1, psScalarAlloc(scan, PS_TYPE_F32));
+      psArrayAdd (job->args, 1, psScalarAlloc(xOffset, PS_TYPE_S32));
+      psArrayAdd (job->args, 1, psScalarAlloc(yOffset, PS_TYPE_S32));
+      psArrayAdd (job->args, 1, psScalarAlloc(rowStart, PS_TYPE_S32));
+      psArrayAdd (job->args, 1, psScalarAlloc(rowStop, PS_TYPE_S32));
 
       // ppImageDetrendReadout(config, options, view)
@@ -169,6 +150,21 @@
 	return false;
       }
-
-      pmBiasSubtractScan (in, sub, scan, xOffset, yOffset, rowStart, rowStop);
+      // pmBiasSubtractScan (in, sub, scan, xOffset, yOffset, rowStart, rowStop);
+    }
+
+    // wait here for the threaded jobs to finish
+    if (!psThreadPoolWait ()) {
+	psError(PS_ERR_UNKNOWN, false, "Unable to interpolate image.");
+	return false;
+    }
+    fprintf (stderr, "success for threaded jobs\n");
+
+    // each job records its own goodPixel values; sum them here
+    // we have only supplied one type of job, so we can assume the types here
+    psThreadJob *job = NULL;
+    while ((job = psThreadJobGetDone()) != NULL) {
+	pswarpTransformTileArgs *args = job->args->data[0];
+	goodPixels += args->goodPixels;
+	psFree (job);
     }
 
