diff options
| author | Thomas Bushnell <thomas@gnu.org> | 1997-08-20 20:31:38 +0000 | 
|---|---|---|
| committer | Thomas Bushnell <thomas@gnu.org> | 1997-08-20 20:31:38 +0000 | 
| commit | 1ed9c11c8bac06eee70182600c872f24552e8dd4 (patch) | |
| tree | 37ad773785169d6f5ce51000ff58fad81bf95842 | |
| parent | 4c4451c49c52b33f1714f3dd61c055cc84a91a8e (diff) | |
Wed Aug 20 16:05:19 1997  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>
	* kern/thread.h (struct thread): New member `creation_time'.
	* include/mach/thread_info.h: New member `creation_time'.
	* kern/thread.c (thread_create): Set creation time stamp.
	(thread_info) [THREAD_BASIC_INFO]: Fill in new creation time
	field.  Carefully preserve compatibility with old callers.
	* kern/task.h (struct task): New member `creation_time'.
	* include/mach/task_info.h: New member `creation_time'.
	* kern/task.c (task_create): Set creation time stamp.
	(task_info) [TASK_BASIC_INFO]: Fill in new creation time field.
	Carefully preserve compatibility with old callers.
	* kern/mach_clock.c (record_time_stamp): New function.
	* kern/time_out.h (record_time_stamp): Add prototype.
| -rw-r--r-- | kern/mach_clock.c | 13 | ||||
| -rw-r--r-- | kern/task.c | 12 | ||||
| -rw-r--r-- | kern/task.h | 2 | ||||
| -rw-r--r-- | kern/thread.c | 12 | ||||
| -rw-r--r-- | kern/thread.h | 3 | ||||
| -rw-r--r-- | kern/time_out.h | 3 | 
6 files changed, 41 insertions, 4 deletions
diff --git a/kern/mach_clock.c b/kern/mach_clock.c index 9076ef4..ee9896a 100644 --- a/kern/mach_clock.c +++ b/kern/mach_clock.c @@ -369,6 +369,19 @@ void init_timeout()  }  /* + * Record a timestamp in STAMP.  + */ +void +record_time_stamp (time_value_t *stamp) +{ +	do { +		stamp->seconds = mtime->seconds; +		stamp->microseconds = mtime->microseconds; +	} while (stamp->seconds != mtime->check_seconds); +} + + +/*   * Read the time.   */  kern_return_t diff --git a/kern/task.c b/kern/task.c index f72bb0f..9302e6a 100644 --- a/kern/task.c +++ b/kern/task.c @@ -166,6 +166,8 @@ kern_return_t task_create(  	new_task->total_system_time.seconds = 0;  	new_task->total_system_time.microseconds = 0; +	record_time_stamp (&new_task->creation_time); +  	if (parent_task != TASK_NULL) {  		task_lock(parent_task);  		pset = parent_task->processor_set; @@ -774,7 +776,11 @@ kern_return_t task_info(  	    {  		register task_basic_info_t	basic_info; -		if (*task_info_count < TASK_BASIC_INFO_COUNT) { +		/* Allow *task_info_count to be one smaller than +		   the usual amount, because creation_time is a new member +		   that some callers might not know about. */ +		   +		if (*task_info_count < TASK_BASIC_INFO_COUNT - 1) {  		    return KERN_INVALID_ARGUMENT;  		} @@ -797,9 +803,11 @@ kern_return_t task_info(  				= task->total_system_time.seconds;  		basic_info->system_time.microseconds   				= task->total_system_time.microseconds; +		basic_info->creation_time = task->creation_time;  		task_unlock(task); -		*task_info_count = TASK_BASIC_INFO_COUNT; +		if (*task_info_count > TASK_BASIC_INFO_COUNT) +		  *task_info_count = TASK_BASIC_INFO_COUNT;  		break;  	    } diff --git a/kern/task.h b/kern/task.h index 52733b9..ec80058 100644 --- a/kern/task.h +++ b/kern/task.h @@ -86,6 +86,8 @@ struct task {  	time_value_t	total_system_time;  				/* total system time for dead threads */ +	time_value_t	creation_time; /* time stamp at creation */ +  	/* IPC structures */  	decl_simple_lock_data(, itk_lock_data)  	struct ipc_port *itk_self;	/* not a right, doesn't hold ref */ diff --git a/kern/thread.c b/kern/thread.c index 1d7a378..d186298 100644 --- a/kern/thread.c +++ b/kern/thread.c @@ -429,6 +429,8 @@ kern_return_t thread_create(  	*new_thread = thread_template; +	record_time_stamp (&new_thread->creation_time); +  	/*  	 *	Initialize runtime-dependent fields  	 */ @@ -1473,7 +1475,11 @@ kern_return_t thread_info(  	if (flavor == THREAD_BASIC_INFO) {  	    register thread_basic_info_t	basic_info; -	    if (*thread_info_count < THREAD_BASIC_INFO_COUNT) { +	    /* Allow *thread_info_count to be one smaller than the +	       usual amount, because creation_time is a new member +	       that some callers might not know about. */ + +	    if (*thread_info_count < THREAD_BASIC_INFO_COUNT - 1) {  		return KERN_INVALID_ARGUMENT;  	    } @@ -1496,6 +1502,7 @@ kern_return_t thread_info(  			&basic_info->system_time);  	    basic_info->base_priority	= thread->priority;  	    basic_info->cur_priority	= thread->sched_pri; +	    basic_info->creation_time  = thread->creation_time;  	    /*  	     *	To calculate cpu_usage, first correct for timer rate, @@ -1547,7 +1554,8 @@ kern_return_t thread_info(  	    thread_unlock(thread);  	    splx(s); -	    *thread_info_count = THREAD_BASIC_INFO_COUNT; +	    if (*thread_info_count > THREAD_BASIC_INFO_COUNT) +	      *thread_info_count = THREAD_BASIC_INFO_COUNT;  	    return KERN_SUCCESS;  	}  	else if (flavor == THREAD_SCHED_INFO) { diff --git a/kern/thread.h b/kern/thread.h index 07b7463..9958e2b 100644 --- a/kern/thread.h +++ b/kern/thread.h @@ -195,6 +195,9 @@ struct thread {  	unsigned int	cpu_delta;	/* cpu usage since last update */  	unsigned int	sched_delta;	/* weighted cpu usage since update */ +	/* Creation time stamp */ +	time_value_t	creation_time; +  	/* Time-outs */  	timer_elt_data_t timer;		/* timer for thread */  	timer_elt_data_t depress_timer;	/* timer for priority depression */ diff --git a/kern/time_out.h b/kern/time_out.h index 4dff7df..5fbf4e3 100644 --- a/kern/time_out.h +++ b/kern/time_out.h @@ -43,6 +43,9 @@ extern unsigned long elapsed_ticks; /* number of ticks elapsed since bootup */  extern int	hz;		/* number of ticks per second */  extern int	tick;		/* number of usec per tick */ +/* Read the current time into STAMP */ +void record_time_stamp (time_value_t *stamp); +  /*   *	Time-out element.   */  | 
