IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 34218


Ignore:
Timestamp:
Jul 30, 2012, 3:54:17 PM (14 years ago)
Author:
bills
Message:

In psphotExtendedSourceFitsReadout allocate a psMetadataIterator for each job
and pass it as an argument to psphotExtendedSourceFits_Threaded.
psMetadataIteratorAlloc and it's associated free function are not thread safe.
This is probably one of the sources of memory corruption failures in psphotStack

Location:
trunk/psphot/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot/src/psphotExtendedSourceFits.c

    r33089 r34218  
    171171            psArrayAdd(job->args, 1, cells->data[j]); // sources
    172172            psArrayAdd(job->args, 1, models);
     173            // Allocate a metadata iterator here because psMetadataIteratorAlloc/Free are not thread safe
     174            psMetadataIterator *iter = psMetadataIteratorAlloc (models, PS_LIST_HEAD, NULL);
     175            psArrayAdd(job->args, 1, iter);
    173176            psArrayAdd(job->args, 1, AnalysisRegion); // XXX make a pointer
    174177
     
    199202            }
    200203            psScalar *scalar = NULL;
    201             scalar = job->args->data[7];
     204            scalar = job->args->data[8];
    202205            Next += scalar->data.S32;
    203             scalar = job->args->data[8];
     206            scalar = job->args->data[9];
    204207            Nconvolve += scalar->data.S32;
    205             scalar = job->args->data[9];
     208            scalar = job->args->data[10];
    206209            NconvolvePass += scalar->data.S32;
    207             scalar = job->args->data[10];
     210            scalar = job->args->data[11];
    208211            Nplain += scalar->data.S32;
    209             scalar = job->args->data[11];
     212            scalar = job->args->data[12];
    210213            NplainPass += scalar->data.S32;
    211             scalar = job->args->data[12];
     214            scalar = job->args->data[13];
    212215            Nfaint += scalar->data.S32;
    213             scalar = job->args->data[13];
     216            scalar = job->args->data[14];
    214217            Nfail += scalar->data.S32;
     218            psFree(job->args->data[3]); // iterator allocated above
    215219            psFree(job);
    216220# endif
     
    231235            } else {
    232236                psScalar *scalar = NULL;
    233                 scalar = job->args->data[7];
     237                scalar = job->args->data[8];
    234238                Next += scalar->data.S32;
    235                 scalar = job->args->data[8];
     239                scalar = job->args->data[9];
    236240                Nconvolve += scalar->data.S32;
    237                 scalar = job->args->data[9];
     241                scalar = job->args->data[10];
    238242                NconvolvePass += scalar->data.S32;
    239                 scalar = job->args->data[10];
     243                scalar = job->args->data[11];
    240244                Nplain += scalar->data.S32;
    241                 scalar = job->args->data[11];
     245                scalar = job->args->data[12];
    242246                NplainPass += scalar->data.S32;
    243                 scalar = job->args->data[12];
     247                scalar = job->args->data[13];
    244248                Nfaint += scalar->data.S32;
    245                 scalar = job->args->data[13];
     249                scalar = job->args->data[14];
    246250                Nfail += scalar->data.S32;
     251                psFree(job->args->data[3]); // metadata iterator allocated above
    247252            }
    248253            psFree(job);
     
    281286    psArray *sources        = job->args->data[1];
    282287    psMetadata *models      = job->args->data[2];
    283     psRegion *region        = job->args->data[3];
    284     int psfSize             = PS_SCALAR_VALUE(job->args->data[4],S32);
    285     psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[5],PS_TYPE_IMAGE_MASK_DATA);
    286     psImageMaskType markVal = PS_SCALAR_VALUE(job->args->data[6],PS_TYPE_IMAGE_MASK_DATA);
     288    psMetadataIterator *iter = job->args->data[3];
     289    psRegion *region        = job->args->data[4];
     290    int psfSize             = PS_SCALAR_VALUE(job->args->data[5],S32);
     291    psImageMaskType maskVal = PS_SCALAR_VALUE(job->args->data[6],PS_TYPE_IMAGE_MASK_DATA);
     292    psImageMaskType markVal = PS_SCALAR_VALUE(job->args->data[7],PS_TYPE_IMAGE_MASK_DATA);
    287293
    288294    // Define source fitting parameters for extended source fits
     
    334340
    335341        // loop here over the models chosen for each source (exclude by S/N)
    336         psMetadataIterator *iter = psMetadataIteratorAlloc (models, PS_LIST_HEAD, NULL);
     342        // Reset the iterator
     343        psMetadataIteratorSet(iter, PS_LIST_HEAD);
    337344        psMetadataItem *item = NULL;
    338345        while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
     
    424431          psFree (modelFit);
    425432        }
    426         psFree (iter);
    427433
    428434        // evaluate the relative quality of the models, choose one
     
    482488
    483489    // change the value of a scalar on the array (wrap this and put it in psArray.h)
    484     scalar = job->args->data[7];
     490    scalar = job->args->data[8];
    485491    scalar->data.S32 = Next;
    486492
    487     scalar = job->args->data[8];
     493    scalar = job->args->data[9];
    488494    scalar->data.S32 = Nconvolve;
    489495
    490     scalar = job->args->data[9];
     496    scalar = job->args->data[10];
    491497    scalar->data.S32 = NconvolvePass;
    492498
    493     scalar = job->args->data[10];
     499    scalar = job->args->data[11];
    494500    scalar->data.S32 = Nplain;
    495501
    496     scalar = job->args->data[11];
     502    scalar = job->args->data[12];
    497503    scalar->data.S32 = NplainPass;
    498504
    499     scalar = job->args->data[12];
     505    scalar = job->args->data[13];
    500506    scalar->data.S32 = Nfaint;
    501507
    502     scalar = job->args->data[13];
     508    scalar = job->args->data[14];
    503509    scalar->data.S32 = Nfail;
    504510
  • trunk/psphot/src/psphotSetThreads.c

    r33964 r34218  
    4040    psFree(task);
    4141
    42     task = psThreadTaskAlloc("PSPHOT_EXTENDED_FIT", 14);
     42    task = psThreadTaskAlloc("PSPHOT_EXTENDED_FIT", 15);
    4343    task->function = &psphotExtendedSourceFits_Threaded;
    4444    psThreadTaskAdd(task);
Note: See TracChangeset for help on using the changeset viewer.