/* ============================================================================= * 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); } } }
/* ============================================================================= * 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); }