void processSet( struct pcb_t *p, memaddr start, int priority){ // Abilita gli interrupt, il Local Timer e la kernel-mode p->p_s.cpsr = STATUS_ALL_INT_ENABLE(p->p_s.cpsr) | STATUS_SYS_MODE; // Disabilita la memoria virtuale p->p_s.CP15_Control = (p->p_s.CP15_Control) & ~(ENABLE_VM); p->p_s.cpsr = STATUS_ENABLE_TIMER(p->p_s.cpsr); p->p_s.sp = RAM_TOP - FRAME_SIZE; // Assegna a PC l'indirizzo della funzione esterna test() p->p_s.pc = (memaddr) start; p->priority = priority; //assegno un pid al processo p->pid = newpid(); activeProcesses[first->pid-1] = p; //inserisco il processo dove di competenza insertProcQ(priority_queue( priority ), p); }
// Test basic functionality TEST_F(PriorityQueueTest, BasicTest) { int num_elements = 100; uint32_t value; PriorityQueue<uint32_t> priority_queue(num_elements); priority_queue.Push(1); priority_queue.Push(2); priority_queue.Push(3); priority_queue.Push(4); EXPECT_EQ(priority_queue.GetSize(), 4); priority_queue.Pop(value); EXPECT_EQ(value, 4); }
//gestore degli interrupt void int_handler(){ interruptStart = getTODLO(); //tempo in cui comincia la gestione dell'interrupt, da //assegnare poi ad un eventuale processo svegliato dall'interrupt state_t *returnState = (state_t*) INT_OLDAREA; returnState->pc -= 4; if( current_process != NULL){ copy_state( returnState, ¤t_process->p_s ); current_process->userTime += interruptStart - userTimeStart;//se c'è un processo aggiorno il suo userTime current_process->CPUTime += interruptStart - CPUTimeStart; } int cause = getCAUSE(); if(CAUSE_IP_GET(cause, IL_TIMER)){ if( current_timer == PSEUDO_CLOCK ){ while( devSem[CLOCK_SEM] < 0 ){ //Ad ogni pseudo clock tick mi assicuro che il semaforo sia sempre a zero verhogen( &devSem[CLOCK_SEM], 1, 0, getTODLO() - interruptStart); } } else if(current_timer == TIME_SLICE ){ if( current_process != NULL ){ insertProcQ( priority_queue(current_process->priority), current_process); current_process->CPUTime += getTODLO() - interruptStart; //se metto in pausa il processo aggiorno anche il suo CPUTime current_process = NULL; } } } else if(CAUSE_IP_GET(cause, IL_DISK)){ dtnp_interrupt(IL_DISK); } else if(CAUSE_IP_GET(cause, IL_TAPE)){ dtnp_interrupt(IL_TAPE); } else if(CAUSE_IP_GET(cause, IL_ETHERNET)){ dtnp_interrupt(IL_ETHERNET); } else if(CAUSE_IP_GET(cause, IL_PRINTER)){ dtnp_interrupt(IL_PRINTER); } else if(CAUSE_IP_GET(cause, IL_TERMINAL)){ terminal_interrupt(); } scheduler(); }
inline static stream_t new_stream(device_t input, device_t output, double sample_rate, long max_buffer_size) { stream_t stream = fa_new(audio_stream); stream->impl = &audio_stream_impl; stream->input = input; stream->output = output; stream->input_channels = fa_audio_input_channels(input); stream->output_channels = fa_audio_output_channels(output); stream->sample_rate = sample_rate; stream->max_buffer_size = max_buffer_size; stream->signal_count = 0; stream->sample_count = 0; stream->in_controls = atomic_queue(); stream->controls = priority_queue(); return stream; }