Example #1
0
void* YKQPend(YKQ* queue) {

	void* message;
	int i;
	TCB* runningTask;

	if (queue == null) return null;
	
	YKEnterMutex();
	if (*queue->messages == null) {
		runningTask = removePriorityQueue(&readyQueue);
		runningTask->state = T_BLOCKED;
		insertPriorityQueue((&(queue->queue)), runningTask);
		YKExitMutex();
		asm("int 0x20");
	}

	message = queue->messages[0];
	for (i = 0; i < queue->currentSize-1; i++) {
		queue->messages[i] = queue->messages[i+1];
	}
	queue->currentSize--;
	queue->messages[queue->currentSize] = null;

	YKExitMutex();
	return message;
	
}
Example #2
0
int YKQPost(YKQ* queue, void* msg) {

	TCB* readyTask;
	int retVal;

	YKEnterMutex();
	if (queue->currentSize < queue->maxSize) {
		queue->messages[queue->currentSize] = msg;
		queue->currentSize++;
		retVal = 1;

	} else {
		retVal = 1;
	}
		
	readyTask = removePriorityQueue(&(queue->queue));
	if (readyTask == null) {
		YKExitMutex();
		return retVal;
	} else {
		readyTask->state = T_READY;
		insertPriorityQueue(&readyQueue, readyTask);
		YKExitMutex();
		if (YKGetISRCallDepth() == 0) {
			asm("int 0x20");
		}
	}
	return retVal;

}
Example #3
0
void YKDelayTask(unsigned int count) {

	TCB* delayedTask;

	if (count == 0) return;

	delayedTask = removePriorityQueue(&readyQueue);
	delayedTask->state = T_BLOCKED;
	delayedTask->delayCount = count;
	insertDelayQueue(delayedTask);
	asm("int 0x20");
	return;

}
Example #4
0
void YKSemPost(YKSEM* semaphore) {
	
	TCB* readyTask;

	YKEnterMutex();
	semaphore->value++;
	readyTask = removePriorityQueue(&(semaphore->queue));
	if (readyTask == null) {
		YKExitMutex();
		return;
	}
	readyTask->state = T_READY;
	insertPriorityQueue(&readyQueue, readyTask);
	YKExitMutex();
	if (YKGetISRCallDepth() == 0) {
		asm("int 0x20");
	}
	return;

}
Example #5
0
void YKSemPend(YKSEM* semaphore) {

	TCB* runningTask;

	YKEnterMutex();
	if (semaphore->value < 1) {
		semaphore->value--;
		runningTask = removePriorityQueue(&readyQueue);
		runningTask->state = T_BLOCKED;
		insertPriorityQueue((&(semaphore->queue)), runningTask);
		YKExitMutex();
		asm("int 0x20");
		return;

	} else {
		semaphore->value--;
		YKExitMutex();
		return;
	}

}