added some more code for processing scheduling
This commit is contained in:
		
							
								
								
									
										174
									
								
								stix/lib/exec.c
									
									
									
									
									
								
							
							
						
						
									
										174
									
								
								stix/lib/exec.c
									
									
									
									
									
								
							| @ -105,64 +105,32 @@ static stix_oop_process_t make_process (stix_t* stix, stix_oop_context_t c) | ||||
| 	stix_oop_process_t proc; | ||||
|  | ||||
| /* TODO: do something about the stack. */ | ||||
| 	stix_pushtmp (stix, &c); | ||||
| 	stix_pushtmp (stix, (stix_oop_t*)&c); | ||||
| 	proc = (stix_oop_process_t)stix_instantiate (stix, stix->_process, STIX_NULL, stix->option.dfl_procstk_size); | ||||
| 	stix_poptmp (stix); | ||||
| 	if (!proc) return STIX_NULL; | ||||
|  | ||||
| 	proc->state = STIX_OOP_FROM_SMINT(0); | ||||
| 	proc->context = c; | ||||
| 	proc->initial_context = c; | ||||
|  | ||||
| 	return proc; | ||||
| } | ||||
|  | ||||
| static void resume_process (stix_t* stix, stix_oop_process_t proc) | ||||
| { | ||||
| 	if (proc->state == STIX_OOP_FROM_SMINT(0)) | ||||
| 	{ | ||||
| 		stix_ooi_t tally; | ||||
| 		STIX_ASSERT (proc->prev == stix->_nil); | ||||
| 		STIX_ASSERT (proc->next == stix->_nil); | ||||
|  | ||||
| 		tally = STIX_OOP_TO_SMINT(stix->scheduler->tally); | ||||
| 		if (tally <= 0) | ||||
| 		{ | ||||
| 			stix->scheduler->head = proc; | ||||
| 			stix->scheduler->tail = proc; | ||||
| 			stix->scheduler->tally  = STIX_OOP_FROM_SMINT(1); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* TODO: over flow check or maximum number of process check? */ | ||||
| 			proc->next = stix->scheduler->head; | ||||
| 			stix->scheduler->head->prev = proc; | ||||
| 			stix->scheduler->head = proc; | ||||
| 			stix->scheduler->tally = STIX_OOP_FROM_SMINT(tally + 1); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	stix->scheduler->active = proc; | ||||
| 	proc->state = STIX_OOP_FROM_SMINT(1); /* TODO: change the code properly... changing state alone doesn't help */ | ||||
| } | ||||
|  | ||||
| static stix_oop_process_t start_new_process (stix_t* stix, stix_oop_context_t c) | ||||
| { | ||||
| 	stix_oop_process_t proc; | ||||
|  | ||||
| 	proc = make_process (stix, c); | ||||
| 	if (!proc) return STIX_NULL; | ||||
|  | ||||
| 	resume_process (stix, proc); | ||||
| 	return proc; | ||||
| } | ||||
|  | ||||
| static void switch_process (stix_t* stix, stix_oop_process_t proc) | ||||
| { | ||||
| 	if (stix->scheduler->active != proc) | ||||
| 	{ | ||||
| 		SWITCH_ACTIVE_CONTEXT (stix, proc->context); | ||||
| printf ("ACTUAL PROCESS SWITCHING BF...%d %p\n", (int)stix->ip, stix->active_context); | ||||
|  | ||||
| /* store the active context to the active process */ | ||||
| stix->scheduler->active->active_context = stix->active_context; | ||||
|  | ||||
| 		SWITCH_ACTIVE_CONTEXT (stix, proc->active_context); | ||||
| printf ("ACTUAL PROCESS SWITCHING AF...%d %p\n", (int)stix->ip, stix->active_context); | ||||
| 		/*TODO: set the state to RUNNING */ | ||||
| 		stix->scheduler->active = proc; | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -179,6 +147,55 @@ static void switch_to_next_process (stix_t* stix) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void schedule_process (stix_t* stix, stix_oop_process_t proc) | ||||
| { | ||||
| 	if (proc->state == STIX_OOP_FROM_SMINT(0)) | ||||
| 	{ | ||||
| 		stix_ooi_t tally; | ||||
| 		STIX_ASSERT ((stix_oop_t)proc->prev == stix->_nil); | ||||
| 		STIX_ASSERT ((stix_oop_t)proc->next == stix->_nil); | ||||
|  | ||||
| 		tally = STIX_OOP_TO_SMINT(stix->scheduler->tally); | ||||
| 		if (tally <= 0) | ||||
| 		{ | ||||
| 			stix->scheduler->head = proc; | ||||
| 			stix->scheduler->tail = proc; | ||||
| 			stix->scheduler->tally  = STIX_OOP_FROM_SMINT(1); | ||||
| printf ("ADD NEW PROCESS X - %d\n", (int)1); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* TODO: over flow check or maximum number of process check using the tally field? */ | ||||
| 			proc->next = stix->scheduler->head; | ||||
| 			stix->scheduler->head->prev = proc; | ||||
| 			stix->scheduler->head = proc; | ||||
| 			stix->scheduler->tally = STIX_OOP_FROM_SMINT(tally + 1); | ||||
| printf ("ADD NEW PROCESS Y - %d\n", (int)tally + 1); | ||||
| 		} | ||||
|  | ||||
| 		proc->state = STIX_OOP_FROM_SMINT(1); /* TODO: change the code properly... changing state alone doesn't help */ | ||||
| 		proc->active_context = proc->initial_context; | ||||
|  | ||||
| 		switch_process (stix, proc); | ||||
| 	} | ||||
| 	else if (stix->scheduler->active != proc) | ||||
| 	{ | ||||
| 		switch_process (stix, proc); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static stix_oop_process_t start_new_process (stix_t* stix, stix_oop_context_t c) | ||||
| { | ||||
| 	stix_oop_process_t proc; | ||||
|  | ||||
| 	proc = make_process (stix, c); | ||||
| 	if (!proc) return STIX_NULL; | ||||
|  | ||||
| 	schedule_process (stix, proc); | ||||
| 	return proc; | ||||
| } | ||||
|  | ||||
|  | ||||
| static STIX_INLINE int activate_new_method (stix_t* stix, stix_oop_method_t mth) | ||||
| { | ||||
| 	stix_oop_context_t ctx; | ||||
| @ -1122,11 +1139,25 @@ static int prim_integer_ge (stix_t* stix, stix_ooi_t nargs) | ||||
|  | ||||
| static int prim_scheduler_add (stix_t* stix, stix_ooi_t nargs) | ||||
| { | ||||
| 	return 0; | ||||
| 	stix_oop_t rcv, arg; | ||||
|  | ||||
| 	STIX_ASSERT (nargs == 1); | ||||
|  | ||||
| 	rcv = ACTIVE_STACK_GET(stix, stix->sp - 1); | ||||
| 	arg = ACTIVE_STACK_GET(stix, stix->sp); | ||||
|  | ||||
| 	if (rcv != (stix_oop_t)stix->scheduler || STIX_CLASSOF(stix,arg) != stix->_process) | ||||
| 	{ | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	schedule_process (stix, (stix_oop_process_t)arg); | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| static int prim_scheduler_remove (stix_t* stix, stix_ooi_t nargs) | ||||
| { | ||||
| /* TODO: */ | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -1631,10 +1662,15 @@ int stix_execute (stix_t* stix) | ||||
| 	{ | ||||
|  | ||||
|  | ||||
| switch_to_next_process (stix); | ||||
| #if 0 | ||||
| printf ("IP => %d ", (int)stix->ip); | ||||
|  | ||||
| #if 1 | ||||
| printf ("IP<BF> => %d\n", (int)stix->ip); | ||||
| #endif | ||||
| switch_to_next_process (stix); | ||||
| #if 1 | ||||
| printf ("IP<AF> => %d\n", (int)stix->ip); | ||||
| #endif | ||||
|  | ||||
| 		FETCH_BYTE_CODE_TO (stix, bcode); | ||||
| 		/*while (bcode == BCODE_NOOP) FETCH_BYTE_CODE_TO (stix, bcode);*/ | ||||
|  | ||||
| @ -2417,21 +2453,29 @@ printf ("<<LEAVING>> SP=%d\n", (int)stix->sp); | ||||
| 				 */ | ||||
| 				stix->ip--;  | ||||
|  | ||||
| 				SWITCH_ACTIVE_CONTEXT (stix, (stix_oop_context_t)stix->active_context->origin->sender); | ||||
|  | ||||
| 				/* push the return value to the stack of the new active context */ | ||||
| 				ACTIVE_STACK_PUSH (stix, return_value); | ||||
|  | ||||
| 				if (stix->active_context->sender == stix->_nil) | ||||
| 				if (stix->scheduler->active->initial_context == stix->active_context) | ||||
| 				{ | ||||
| 					/* the sending context of the intial context has been set to nil. | ||||
| 					 * use this fact to tell an initial context from a normal context. */ | ||||
| 					STIX_ASSERT (stix->active_context->receiver_or_source == stix->_nil); | ||||
| /* TODO: terminate a proces... */ | ||||
| printf ("TERMINATING XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					SWITCH_ACTIVE_CONTEXT (stix, (stix_oop_context_t)stix->active_context->origin->sender); | ||||
|  | ||||
| 					/* push the return value to the stack of the new active context */ | ||||
| 					ACTIVE_STACK_PUSH (stix, return_value); | ||||
|  | ||||
| 					if (stix->active_context->sender == stix->_nil) | ||||
| 					{ | ||||
| 						/* the sending context of the intial context has been set to nil. | ||||
| 						 * use this fact to tell an initial context from a normal context. */ | ||||
| 						STIX_ASSERT (stix->active_context->receiver_or_source == stix->_nil); | ||||
| #if defined(STIX_DEBUG_EXEC) | ||||
| printf ("<<<RETURNIGN TO THE INITIAL CONTEXT>>>\n"); | ||||
| #endif | ||||
| 					STIX_ASSERT (stix->sp == 0); | ||||
| 					goto done; | ||||
| 						STIX_ASSERT (stix->sp == 0); | ||||
| 						goto done; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				break; | ||||
| @ -2441,9 +2485,19 @@ printf ("<<<RETURNIGN TO THE INITIAL CONTEXT>>>\n"); | ||||
|  | ||||
| 				STIX_ASSERT(STIX_CLASSOF(stix, stix->active_context)  == stix->_block_context); | ||||
|  | ||||
| 				return_value = ACTIVE_STACK_GETTOP(stix); | ||||
| 				SWITCH_ACTIVE_CONTEXT (stix, (stix_oop_context_t)stix->active_context->sender); | ||||
| 				ACTIVE_STACK_PUSH (stix, return_value); | ||||
| 				if (stix->active_context == stix->scheduler->active->initial_context) | ||||
| 				{ | ||||
| 					/* TODO: terminate the process */ | ||||
| printf ("TERMINATE A PROCESS............\n"); | ||||
| /* **************************************** */ | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					return_value = ACTIVE_STACK_GETTOP(stix); | ||||
| 					SWITCH_ACTIVE_CONTEXT (stix, (stix_oop_context_t)stix->active_context->sender); | ||||
| 					ACTIVE_STACK_PUSH (stix, return_value); | ||||
| 				} | ||||
|  | ||||
| 				break; | ||||
|  | ||||
| 			case BCODE_MAKE_BLOCK: | ||||
|  | ||||
		Reference in New Issue
	
	Block a user