/* * pit_irq_handler * DESCRIPTION: Handles scheduling/context switching and setup of PIT called from the handler from irq.c * INPUTS: none * OUTPUTS: None * RETURN VALUE: none * SIDE EFFECTS: schedules current processes running using round robin */ void pit_irq_handler(){ schedule_handler(); // printf("PIT %d\n",counter); }
int schedule_main(void) /****************************************************************/ { //Variables int i, j; // int fd_max; fd_set reads, temps; struct timeval tv; // int server_socket; int client_socket; struct sockaddr_in server_addr; struct sockaddr_in client_addr; // int fd; int sin_size; int server_port; int status; //Initialize i = j = 0; // fd_max = 0; FD_ZERO(&reads); FD_ZERO(&temps); tv.tv_sec = 0; tv.tv_usec = 10000; //0.01sec // server_socket = 0; client_socket = 0; memset(&server_addr, 0, sizeof(server_addr)); memset(&client_addr, 0, sizeof(client_addr)); // fd = 0; sin_size = sizeof(client_addr); server_port = SCHED_SERVER_PORT; status = INIT_PROCESS; //Ignore broken_pipe signal signal(SIGPIPE, SIG_IGN); IfaceGhpSchedSelectSleep(3,0); while(1) { IfaceGhpSchedSelectSleep(0,500); switch(status) { case INIT_PROCESS: { server_socket = socket(PF_INET, SOCK_STREAM, 0); printf("Schedule-Server Started, Port [%d]\n", server_port); // server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(server_port); // setsockopt(server_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // if(bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { printf("[ERROR] In Bind of Schedule-Server\n"); close(server_socket); status = INIT_PROCESS; //sleep(10); IfaceGhpSchedSelectSleep(10,0); break; } // if(listen(server_socket, 10) < 0) { printf("[ERROR] In Listen of Schedule-Server\n"); close(server_socket); status = INIT_PROCESS; //sleep(10); IfaceGhpSchedSelectSleep(10,0); break; } // FD_ZERO(&reads); FD_SET(server_socket, &reads); fd_max = server_socket; // status = SELECT_PROCESS; break; } // case SELECT_PROCESS: { // temps = reads; // if(select(fd_max+1, &temps, 0, 0, &tv) == -1) { printf("[ERROR] In Select of Schedule-Server\n"); status = INIT_PROCESS; //sleep(10); IfaceGhpSchedSelectSleep(10,0); break; } // status = SELECT_PROCESS; // for(fd = 0; fd < (fd_max + 1); fd++) { if(FD_ISSET(fd, &temps)) { //if connection's been requested, if(fd == server_socket) { status = CONNECTION_REQUESTED; break; } else { status = HANDLE_COMMAND; break; } } } break; } // case CONNECTION_REQUESTED: { client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &sin_size); // if (client_socket == -1) { printf("[Error] In Accept of Schedule-Server\n"); status = SELECT_PROCESS; break; } // FD_SET(client_socket, &reads); if(fd_max < client_socket) fd_max = client_socket; // status = SELECT_PROCESS; break; } // case HANDLE_COMMAND: { schedule_handler(fd, &reads); status = SELECT_PROCESS; break; } } } // //return; }