Example #1
0
File: region.c Project: riclas/rstm
/* =============================================================================
 * TMregion_transferBad
 * =============================================================================
 */
void
TMregion_transferBad (TM_ARGDECL  region_t* regionPtr, heap_t* workHeapPtr)
{
  vector_t* badVectorPtr = regionPtr->badVectorPtr;
  long numBad = PVECTOR_GETSIZE(badVectorPtr);
  long i;

  for (i = 0; i < numBad; i++) {
    element_t* badElementPtr = (element_t*)vector_at(badVectorPtr, i);
    if (TMELEMENT_ISGARBAGE(badElementPtr)) {
      TMELEMENT_FREE(badElementPtr);
    } else {
      bool_t status = TMHEAP_INSERT(workHeapPtr, (void*)badElementPtr);
      assert(status);
    }
  }
}
Example #2
0
/* =============================================================================
 * process
 * =============================================================================
 */
static void
process ()
{
    heap_t* workHeapPtr = global_workHeapPtr;
    mesh_t* meshPtr = global_meshPtr;
    region_t* regionPtr;
    long totalNumAdded = 0;
    long numProcess = 0;

    regionPtr = PREGION_ALLOC();
    assert(regionPtr);

    while (1) {

        element_t* elementPtr;

        __transaction_atomic {
            elementPtr = (element_t*)TMHEAP_REMOVE(workHeapPtr);
        }

        if (elementPtr == NULL) {
            break;
        }

        bool_t isGarbage;
        __transaction_atomic {
            isGarbage = TMELEMENT_ISGARBAGE(elementPtr);
        }
        if (isGarbage) {
            /*
             * Handle delayed deallocation
             */
            TMELEMENT_FREE(elementPtr);
            continue;
        }

        long numAdded;
        //[wer210] changed the control flow to get rid of self-abort
        bool_t success = TRUE;
        while (1) {
            __transaction_atomic {
                // TM_SAFE: PVECTOR_CLEAR (regionPtr->badVectorPtr);
                PREGION_CLEARBAD(regionPtr);
                //[wer210] problematic function!
                numAdded = TMREGION_REFINE(regionPtr, elementPtr, meshPtr, &success);
                if (success) break;
                else __transaction_cancel;
            }
        }

        __transaction_atomic {
            TMELEMENT_SETISREFERENCED(elementPtr, FALSE);
            isGarbage = TMELEMENT_ISGARBAGE(elementPtr);
        }
        if (isGarbage) {
            /*
             * Handle delayed deallocation
             */
            TMELEMENT_FREE(elementPtr);
        }

        totalNumAdded += numAdded;

        __transaction_atomic {
            TMREGION_TRANSFERBAD(regionPtr, workHeapPtr);
        }

        numProcess++;

    }

    __transaction_atomic {
        TM_SHARED_WRITE(global_totalNumAdded,
        TM_SHARED_READ(global_totalNumAdded) + totalNumAdded);
        TM_SHARED_WRITE(global_numProcess,
        TM_SHARED_READ(global_numProcess) + numProcess);
    }

    PREGION_FREE(regionPtr);
}