Esempio n. 1
0
File: cpu.c Progetto: DuyH/TCSS422
void CPU_scheduler(CPU_p cpu, Interrupt_type interrupt_type, int PC) {
    while (!Queue_isEmpty(cpu->newProcessesQueue)) {
        PCB_p temp_pcb = Queue_dequeue(cpu->newProcessesQueue);
        PCB_set_state(temp_pcb, ready);
        //PCB_set_pc(temp_pcb, PC);
        Queue_enqueue(cpu->readyQueue, temp_pcb);
        fprintf(file, "Process ID: %u Enqueued\n", temp_pcb->pid);
        fprintf(file, "%s", PCB_toString(temp_pcb));
    }
    fprintf(file, "\n");
    switch (interrupt_type) {
        case timer:
            // 1. Put process back into the readyQueue
            Queue_enqueue(cpu->readyQueue, cpu->currentProcess);

            // 2. Change its state from interrupted to ready
            PCB_set_state(cpu->currentProcess, ready);

            // 3. Make call to dispatcher
            CPU_dispatcher(cpu, timer);

            // 4. Returned from dispatcher, do any housekeeping
            // Nothing here to do at the moment!

            // 5. Returns to pseudo-ISR
            return;
            break;
        default:
            CPU_dispatcher(cpu, normal);
            break;
    }
    return;
}
bool DLL_EXPORT check(Queue_t queue){
    if(Queue_getSize(queue) < 3) return false;

    while(Queue_getSize(queue) > 3){
        Queue_dequeue(queue);
    }

    while(!Queue_isEmpty(queue)){
        if(Queue_dequeue(queue) > 0) return false;
    }
    return true;
}
Esempio n. 3
0
/*
* Return:  0 - succeed
*
*/
int    Queue_clear(Queue *q)
{

	if(q == NULL)
    {
        return 0;
    }

#ifdef QUEUE_DEBUG
    printf("[%s()]: q->header=[%d], q->tail=[%d]\n", __LINE__, q->header, q->tail);
#endif

    if(Queue_isEmpty(q) == QUEUE_IS_EMPTY)
    {
        return 0;
    }

    q->header = q->tail = 0;

    return 0;
}
Esempio n. 4
0
File: cpu.c Progetto: DuyH/TCSS422
void CPU_dispatcher(CPU_p cpu, Interrupt_type interrupt_type) {

    // Save pointers to the previous and next process (needed so we can print)
    PCB_p prevProcess = cpu->currentProcess;
    PCB_p nextProcess = Queue_peek(cpu->readyQueue);
    if (CTX_SWITCH_COUNT % 4 == 0) {
    	if (prevProcess != NULL)
    		fprintf(file, "Running process: %s", PCB_toString(prevProcess));
    	if (nextProcess != NULL)
    		fprintf(file, "Switching to: %s", PCB_toString(nextProcess));
    }
    // 1. Save the state of current process into its PCB (PC value)
    // Per Canvas Discussions, DON'T DO THIS AGAIN HERE! It's in ISR.

    // 2. Then dequeue next waiting process
    if (!Queue_isEmpty(cpu->readyQueue))
        cpu->currentProcess = Queue_dequeue(cpu->readyQueue);

    // 3. Change its state to running
    PCB_set_state(cpu->currentProcess, running);

    if (interrupt_type == timer) {
        // 4. Copy its PC value to sysStack, replacing the interrupted process
        CPU_push_sysStack(cpu, PCB_get_PC(cpu->currentProcess));
    } else if (interrupt_type == normal) {
        CPU_set_pc(cpu, cpu->sysStack);
    }

    if (CTX_SWITCH_COUNT % 4 == 0) {
    	if (prevProcess != NULL)
    		fprintf(file, "Last Process: %s", PCB_toString(prevProcess));
    	if (nextProcess != NULL)
    		fprintf(file, "Current running Process: %s", PCB_toString(nextProcess));
    	fprintf(file, "Ready Queue: %s", Queue_toString(cpu->readyQueue, 0));
    }

    // 5. Return to the scheduler
    // returns prevalent stuff to scheduler, but not for this project
    return;
}
Esempio n. 5
0
void Queue_test()
{
	queue_t testQueue;
	Queue_init(&testQueue, 5, sizeof(int));

	assert( Queue_isEmpty(&testQueue) == true );
	assert( Queue_isFull(&testQueue) == false );

	int a = 34;
	int b = 35;
	int c = 36;
	int d = 37;
	int e = 38;

	assert( Queue_push( &testQueue, (uint8_t*)&a ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&b ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&c ) == true);

	assert( Queue_isEmpty(&testQueue) == false );
	assert( Queue_isFull(&testQueue) == false );

	assert( Queue_push( &testQueue, (uint8_t*)&d ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&e ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&e ) == false);

	assert( Queue_isEmpty(&testQueue) == false );
	assert( Queue_isFull(&testQueue) == true );

	int read;

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == true);
	assert(read == 34);

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == true);
	assert(read == 35);

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == true);
	assert(read == 36);

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == true);
	assert(read == 37);

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == true);
	assert(read == 38);

	assert( Queue_pop( &testQueue, (uint8_t*)&read ) == false);
	assert(read == 38);

	assert( Queue_isEmpty(&testQueue) == true );
	assert( Queue_isFull(&testQueue) == false );


	assert( Queue_push( &testQueue, (uint8_t*)&a ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&b ) == true);
	assert( Queue_push( &testQueue, (uint8_t*)&c ) == true);

	Queue_clear(&testQueue);

	assert( Queue_isEmpty(&testQueue) == true );
	assert( Queue_isFull(&testQueue) == false );
}