IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 33089 for trunk/psLib


Ignore:
Timestamp:
Jan 11, 2012, 10:16:48 AM (15 years ago)
Author:
bills
Message:

Fix problems with IPP threading. In psThreadPoolWait wait until all threads have
finished before returning even if one of the threads has a fault.
Return false if any thread faults. Also add a new argument bool harvestOnFailure
which tells psThreadPoolWait to harvest the done jobs if there is a failure.
Many functions previously used psThreadPoolWait(harvest = false) because they
wanted to examine the jobs structs afterwards. However they weren't cleaning up the
jobs in the failure case.
These now call psThreadPoolWait(harvest = false, harvestOnFailure = true)
which causes the jobs to be cleaned up on fault. These lingering jobs were the
cause of the "Unknown task" failure in psImageConvolve*
Also changed psphotReadout to check for failure of psphotGuessModels and return
to the caller. This yields quality = 3007

Location:
trunk/psLib/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageConvolve.c

    r32745 r33089  
    10391039            }
    10401040        }
    1041         if (!psThreadPoolWait(true)) {
     1041        if (!psThreadPoolWait(true, true)) {
    10421042            psError(PS_ERR_UNKNOWN, false, "Error waiting for threads.");
    10431043            psFree(gaussNorm);
     
    13901390              }
    13911391              // wait here for the threaded jobs to finish (NOP if threading is not active)
    1392               if (!psThreadPoolWait(true)) {
     1392              if (!psThreadPoolWait(true, true)) {
    13931393                  psError(PS_ERR_UNKNOWN, false, "Unable to smooth image");
    13941394                  psFree(calculation);
     
    14371437
    14381438              // wait here for the threaded jobs to finish (NOP if threading is not active)
    1439               if (!psThreadPoolWait(true)) {
     1439              if (!psThreadPoolWait(true, true)) {
    14401440                  psError(PS_ERR_UNKNOWN, false, "Unable to smooth image");
    14411441                  psFree(calculation);
     
    17521752            }
    17531753        }
    1754         if (!psThreadPoolWait(true)) {
     1754        if (!psThreadPoolWait(true, true)) {
    17551755            psError(PS_ERR_UNKNOWN, false, "Error waiting for threads.");
    17561756            psFree(conv);
     
    17871787            }
    17881788        }
    1789         if (!psThreadPoolWait(true)) {
     1789        if (!psThreadPoolWait(true, true)) {
    17901790            psError(PS_ERR_UNKNOWN, false, "Error waiting for threads.");
    17911791            psFree(conv);
  • trunk/psLib/src/imageops/psImageCovariance.c

    r32714 r33089  
    193193    }
    194194
    195     if (threaded && !psThreadPoolWait(true)) {
     195    if (threaded && !psThreadPoolWait(true, true)) {
    196196        psError(PS_ERR_UNKNOWN, false, "Error waiting for threads.");
    197197        return false;
     
    360360        }
    361361    }
    362     if (threaded && !psThreadPoolWait(true)) {
     362    if (threaded && !psThreadPoolWait(true, true)) {
    363363        psError(PS_ERR_UNKNOWN, false, "Error waiting for threads.");
    364364        return false;
  • trunk/psLib/src/sys/psThread.c

    r32715 r33089  
    179179    PS_ASSERT_THREAD_TASK_NON_NULL(task, false);
    180180
     181    // fprintf(stderr, "adding task %s\n", task->type);
     182
    181183    if (!tasks) {
    182184        tasks = psHashAlloc(TASK_BUCKETS);
     
    189191{
    190192    PS_ASSERT_STRING_NON_EMPTY(type, false);
     193    // fprintf(stderr, "removing task %s\n", type);
    191194
    192195    return psHashRemove(tasks, type);
     
    223226
    224227        psThreadTask *task = psHashLookup(tasks, job->type); // Task to execute job
     228        // fprintf(stderr, "launching job %s\n", job->type);
    225229#ifdef HAVE_BACKTRACE
    226230        if (!task && bt_buffer) {
     
    246250                 "invalid number of arguments to %s (%ld supplied, expected %d)",
    247251                 task->type, job->args->n, task->nArgs);
     252        // fprintf(stderr, "    thread for %s %p launching on %p\n", job->type, task->function, self);
     253
     254        // Run the job's function
    248255        bool status = task->function(job); // Status of executing task
     256
     257        // fprintf(stderr, "    thread for %s %p finished on %p with status %d\n", job->type, task->function, self, status);
    249258
    250259        // Put the completed job on the 'done' queue
     
    306315
    307316// call this function after you have added jobs to the queue and
    308 bool psThreadPoolWait(bool harvest)
    309 {
     317bool psThreadPoolWait(bool harvest, bool harvestOnFailure)
     318{
     319    // fprintf(stderr, "psThreadPoolWait called with harvest: %d\n", harvest);
    310320    if (!pool || pool->n == 0) {
    311321        // No threads initialised, so everything's done
     
    326336#endif
    327337
     338    // accumulate the number of faulted jobs that we encounter
     339    int numFaults = 0;
    328340    while (1) {
    329341        // check for an error
     
    331343            psThread *thread = pool->data[i];
    332344            if (thread->fault) {
    333                 return false;
     345                numFaults++;
    334346            }
    335347        }
     
    354366            // Nothing in the queue and nothing more to add
    355367            // Ensure everything is harvested, if requested
    356             if (harvest) {
     368            if (harvest || (numFaults && harvestOnFailure)) {
    357369                psThreadJobHarvest();
    358370            }
    359371            psThreadUnlock();
    360             return true;
     372            return numFaults == 0;
    361373        }
    362374
  • trunk/psLib/src/sys/psThread.h

    r28405 r33089  
    116116/// Wait for the thread pool to finish
    117117///
    118 /// This function blocks (waits in usleep) until either an error is detected on one of the threads or until ll
    119 /// threads are idle and no jobs are left on the queue
    120 bool psThreadPoolWait(bool harvest      // Harvest the jobs from the queue?
     118/// This function blocks (waits in usleep) until all  threads are idle and no jobs
     119/// are left on the queue
     120/// returns success if all jobs return success, otherwise returns false
     121bool psThreadPoolWait(bool harvest,         // Harvest the jobs from the queue?
     122                      bool harvestOnFailure // If harvest is false, harvest the jobs if a failure is encountered
    121123    );
    122124
Note: See TracChangeset for help on using the changeset viewer.