示例#1
0
bool ColorProvider::compareAndSet(Range<float>& toSet,
                                  const float min,
                                  const float max)
{
  return compareAndSet(toSet.min, min) |
         compareAndSet(toSet.max, max);
}
示例#2
0
bool ColorProvider::compareAndSet(ColorReference::HSVColorDefinition& toSet,
                                  const float minH, const float maxH,
                                  const float minS, const float maxS,
                                  const float minV, const float maxV)
{
  return compareAndSet(toSet.hue, minH, maxH) |
         compareAndSet(toSet.saturation, minS, maxS) |
         compareAndSet(toSet.value, minV, maxV);
}
示例#3
0
bool donate(int threadId, Chunk *chunk) {
	LOG_PROLOG();
	//LOG_INFO("donate: threadID %d\n", threadId);
	int i = (getDonorEntry(threadId)->lastDonated + 1) % (memory->n);
	bool *tempBoolObj;
	assert(globalHPStructure->topPointers[threadId] == 0);
	do {
		LOG_INFO("donate: trying to donate to %d", i);
		ReferenceIntegerPair *announceOfThreadToBeHelped = setHazardPointer(globalHPStructure, threadId, getHelperEntry(i)->atomicRef);
		ReferenceIntegerPair *oldTop = setHazardPointer(globalHPStructure, threadId, GET_STACK_THREAD(memory->fullPool, i)->stack->top->atomicRef);
		assert(globalHPStructure->topPointers[threadId] == 2);
	//	int oldTS = announceOfThreadToBeHelped->integer;
		if ((*(bool*)announceOfThreadToBeHelped->reference == true) && (GET_STACK_THREAD(memory->fullPool, i)->stack->top->atomicRef->reference == NULL) && (getHelperEntry(i)->atomicRef->integer == announceOfThreadToBeHelped->integer)) {
			LOG_INFO("donate: %d needed help", i);
			if (putInOtherFullPool(memory->fullPool, i, chunk, oldTop, threadId)) {
				assert(globalHPStructure->topPointers[threadId] == 1);
				LOG_INFO("donate: successfully donated to %d", i);
				tempBoolObj = (bool*)my_malloc(sizeof(bool));
				*tempBoolObj = false;
				if(!compareAndSet(getHelperEntry(i),announceOfThreadToBeHelped->reference, tempBoolObj, announceOfThreadToBeHelped->integer, (announceOfThreadToBeHelped->integer + 1), threadId)) {
					//clearHazardPointer(globalHPStructure, threadId);
					my_free(tempBoolObj);
				}
				assert(globalHPStructure->topPointers[threadId] == 0);
				getDonorEntry(threadId)->lastDonated = i;
				LOG_EPILOG();
				return true;
			}
			LOG_INFO("donate: donation to %d failed: someone else helped", i);
			//getHelperEntry(i)->compareAndSet(...);
			tempBoolObj = (bool*)my_malloc(sizeof(bool));
			*tempBoolObj = false;
			if (!compareAndSet(getHelperEntry(i),announceOfThreadToBeHelped->reference, tempBoolObj, announceOfThreadToBeHelped->integer, (announceOfThreadToBeHelped->integer + 1), threadId)) {
				//clearHazardPointer(globalHPStructure, threadId);
				my_free(tempBoolObj);
			}
			assert(globalHPStructure->topPointers[threadId] == 0);
		}
		else {
			clearHazardPointer(globalHPStructure, threadId);
			clearHazardPointer(globalHPStructure, threadId);
			LOG_INFO("donate: clearing HP of thread. Donation was not needed");
		}
		i = (i + 1) % (memory->n);
		assert(globalHPStructure->topPointers[threadId] == 0);
	} while(i != (getDonorEntry(threadId)->lastDonated + 1) % (memory->n));
	LOG_EPILOG();
	return false;
}
示例#4
0
void* stackPopOther(Stack* stack, int threadIndex)
{
	LOG_PROLOG();
	void *ptr = NULL;if (stack->top->atomicRef->reference == NULL) {
		ptr = NULL;
	}
	else {
		ReferenceIntegerPair *oldTop = setHazardPointer(globalHPStructure, threadIndex, stack->top->atomicRef);
		StackElement *copy = (StackElement*)(oldTop->reference);
		StackElement *nextTopReference = ((StackElement*)(oldTop->reference))->next;
		if (nextTopReference == NULL) {
			clearHazardPointer(globalHPStructure, threadIndex);
			ptr = NULL;
		}
		else if (compareAndSet(stack->top, oldTop->reference, ((StackElement*)oldTop->reference)->next, oldTop->integer, (oldTop->integer + 1), threadIndex)) {
			void* poppedItem = ((StackElement*)oldTop->reference)->value;
			LOG_INFO("stackPopOther: threadid = %d inside CAS \n", threadIndex);
			my_free(copy);
			ptr = poppedItem;
		}
		else
		{
			LOG_INFO("stackPopOther: CAS failed\n");
			ptr = NULL;
		}
	}
	LOG_EPILOG();
	return ptr;
}
示例#5
0
void* stackPopOwner(Stack* stack, int threadId)
{
	LOG_PROLOG();
	void *ptr = NULL;
	ReferenceIntegerPair *oldTop = setHazardPointer(globalHPStructure, threadId, stack->top->atomicRef);

	if(stack->top->atomicRef->reference == NULL){
		LOG_INFO("stackPopOwner: stack was empty\n");
		ptr = NULL;
	}
	else {
		void *oldValue = ((StackElement*)oldTop->reference)->value;
		StackElement *copy = (StackElement*)(oldTop->reference);
		StackElement *nextTopReference = ((StackElement*)(oldTop->reference))->next;
		if (compareAndSet(stack->top, oldTop->reference, nextTopReference, oldTop->integer, (oldTop->integer+1), threadId)) {
			my_free(copy);
			ptr = oldValue;
		}
		else {
			//clearHazardPointer(globalHPStructure, threadId);
			LOG_INFO("stackPopOwner: CAS failed");
			ptr = NULL;
		}
	}
	LOG_EPILOG();
	return ptr;
}
示例#6
0
    long getCountChange() {
		long c;
		bool ret;
		do {
			c = getCount();
			ret = compareAndSet(c, 0);
		} while(!ret);
		return c; 
    }
示例#7
0
bool stackPushOther(Stack *stack, void* element, ReferenceIntegerPair* oldTop, int threadId)
{
	LOG_PROLOG();
	StackElement *node = (StackElement*)my_malloc(sizeof(StackElement));
	node->value = element;
	node->next = (StackElement*)stack->top->atomicRef->reference;
	bool flag = compareAndSet(stack->top, NULL, node, oldTop->integer, (oldTop->integer + 1), threadId);
	LOG_EPILOG();
	return flag;
}
示例#8
0
bool stackPushOwner(Stack *stack, void* element, int threadId)
{
	LOG_PROLOG();
	StackElement *node = (StackElement*)my_malloc(sizeof(StackElement));
	node->value = element;
	node->next = (StackElement*)stack->top->atomicRef->reference;
	//LOG_INFO("stackPushOwner before setting HP\n");
	LOG_INFO("global Structure is %u", globalHPStructure);
	ReferenceIntegerPair *oldTop = setHazardPointer(globalHPStructure, threadId, stack->top->atomicRef);

	bool flag = compareAndSet(stack->top, oldTop->reference, node, oldTop->integer, (oldTop->integer + 1), threadId);
	LOG_EPILOG();
	return flag;
}
/* Test vararg list of arguments searching for the smallest, store it and return.
 *  On next excustion smallest found from previous iteration will be used as
 *  basis for the searching operation.
 *
 * Input values will be valid int numbers (guranteed by forum post).
 */
int min_value(int val1, ...) {
    static int minimumFoundSoFar = INT_MAX;
    va_list ap;
    int candidate;

    /* Initialize the var_args macros subsystem. */
    va_start(ap, val1);

    /* Initialize the loop. */
    candidate = val1;

    /* Iterate over the list of supplied arguments. */
    while(LIST_TERMINATOR != candidate) {
        compareAndSet(&minimumFoundSoFar, candidate);
        /* fetch next argument. */
        candidate = va_arg(ap, int);
    }

    /* Cleanup for va_* macro subsystem. */
    va_end(ap);

    /* return the smallest number found. */
    return minimumFoundSoFar;
}
示例#10
0
//Chunk* doHelp(int threadToBeHelped, Chunk *stolenChunk, Helper *announceOfThreadToBeHelped) {
Chunk* doHelp(int threadId, int threadToBeHelped, Chunk *stolenChunk, ReferenceIntegerPair *announceOfThreadToBeHelped) {
	LOG_PROLOG();
	assert(globalHPStructure->topPointers[threadId] == 1);
	int i = 0;
	//LOG_INFO("doHelp: threadId: %d\n",threadId);
	//LOG_INFO("doHelp: threadId: %d, current annTS: %d, old annTS: %d\n",threadId,getHelperEntry(threadToBeHelped)->atomicRef->integer,announceOfThreadToBeHelped->atomicRef->integer);
	//if (getHelperEntry(threadToBeHelped)->timestamp != announceOfThreadToBeHelped->timestamp)
	if (getHelperEntry(threadToBeHelped)->atomicRef->integer != announceOfThreadToBeHelped->integer) {
		LOG_INFO("doHelp: somebody already helped threadToBeHelped = %d", threadToBeHelped);
		clearHazardPointer(globalHPStructure, threadId);
		LOG_EPILOG();
		return stolenChunk;
	}

	if (stolenChunk == NULL) {
		LOG_INFO("doHelp: stolenChunk is null");
		//LOG_INFO("doHelp: threadId %d, top reference = %u\n", threadId, getStackThread(memory->fullPool, threadToBeHelped)->stack->top->atomicRef->reference);
		//LOG_INFO("doHelp: threadId %d, current annTS = %d, old annTS = %d\n",threadId, getHelperEntry(threadToBeHelped)->atomicRef->integer, announceOfThreadToBeHelped->atomicRef->integer);
		assert(globalHPStructure->topPointers[threadId] == 1);
		while ((GET_STACK_THREAD(memory->fullPool, threadToBeHelped)->stack->top->atomicRef->reference == NULL) && (getHelperEntry(threadToBeHelped)->atomicRef->integer == announceOfThreadToBeHelped->integer)) {
			//LOG_INFO("doHelp: inside while");
			stolenChunk = getFromOtherFullPool(memory->fullPool, i, threadId);
			LOG_INFO("doHelp: victim = %d",i);
			if (stolenChunk != NULL) {
				LOG_INFO("stealAttempt successful");
				break;
			}
			//LOG_INFO("doHelp: dtealAttempt failed\n");
			i = (i + 1) % memory->n;
			if (i == 0) {
				assert(globalHPStructure->topPointers[threadId] == 1);
				stolenChunk = moveFromSharedQueuePools(threadId);
				//LOG_INFO("doHelp: treadId = %d, topPtr value = %d\n", threadId, globalHPStructure->topPointers[threadId]);
				assert(globalHPStructure->topPointers[threadId] == 1);
				//LOG_INFO("allocate: threadID : %d, returned from moveFreomSQP with stolenChunk %u\n", threadId, stolenChunk);
				if (stolenChunk != NULL) {
					LOG_INFO("!!!!!!!!!!!!!!got a chunk from SQP");
					break;
				}
				LOG_INFO("doHelp: returned from moveFreomSQP");
			}
		}
	}
	assert(globalHPStructure->topPointers[threadId] == 1);
	ReferenceIntegerPair *oldTop = setHazardPointer(globalHPStructure, threadId, GET_STACK_THREAD(memory->fullPool, threadToBeHelped)->stack->top->atomicRef);
	//LOG_INFO("doHelp: setting HP of thread %d for oldTop %u\n", threadId, oldTop);
	assert(globalHPStructure->topPointers[threadId] == 2);
	bool *tempBoolObj;
	if ((GET_STACK_THREAD(memory->fullPool, threadToBeHelped)->stack->top->atomicRef->reference == NULL) && (getHelperEntry(threadToBeHelped)->atomicRef->integer == announceOfThreadToBeHelped->integer)) {
		assert(globalHPStructure->topPointers[threadId] == 2);
		if (putInOtherFullPool(memory->fullPool, threadToBeHelped, stolenChunk, oldTop, threadId)) {
			LOG_INFO("successfully helped thread %d", threadToBeHelped);
			assert(globalHPStructure->topPointers[threadId] == 1);
			tempBoolObj = (bool*)my_malloc(sizeof(bool));
			*tempBoolObj = false;
			if (!compareAndSet(getHelperEntry(threadToBeHelped),announceOfThreadToBeHelped->reference, tempBoolObj, announceOfThreadToBeHelped->integer, (announceOfThreadToBeHelped->integer + 1), threadId)) {
				//LOG_INFO("doHelp: thread = %d, removing HP from annouce\n", threadId);
				my_free(tempBoolObj);
			}
			LOG_EPILOG();
			return NULL;
		}
	}
	else {
		assert(globalHPStructure->topPointers[threadId] == 2);
		clearHazardPointer(globalHPStructure, threadId);
		assert(globalHPStructure->topPointers[threadId] == 1);
		//LOG_INFO("doHelp: clearing HP of top thread %d when someone else helped\n", threadId);
	}

	LOG_INFO("thread %d already got help",threadToBeHelped);
	tempBoolObj = (bool*)my_malloc(sizeof(bool));
	*tempBoolObj = false;
	if (!compareAndSet(getHelperEntry(threadToBeHelped),announceOfThreadToBeHelped->reference, tempBoolObj, announceOfThreadToBeHelped->integer, (announceOfThreadToBeHelped->integer + 1), threadId)) {
		my_free(tempBoolObj);
	}
	assert(globalHPStructure->topPointers[threadId] == 0);
	LOG_EPILOG();
	return stolenChunk;
}