[comp.os.minix] times

hp@vmars.tuwien.ac.at (Peter Holzer) (11/08/90)

These patches fix a problem with the times(2) system call. It always
returned 0, which caused my benchmark programs to dump core on a
division by zero.

To do this I had to change message format 4 from 4 to 5 longs.
As far as I have seen this message format is used nowhere else,
so it should not cause any problems.

WARNING: Check the Index: lines before applying the patch. I
have added them by hand after cat'ing the cdiffs together, and I
am not sure if people who have derived 1.5 from earlier versions
have the same directory layout as the version PH sells.

---8<------8<------8<------8<------8<------8<------8<------8<---
Index: /usr/src/kernel/clock.c
*** orig/clock.c	Sat Oct 27 15:45:24 1990
--- clock.c	Fri Nov  2 18:16:15 1990
***************
*** 16,21 ****
--- 16,23 ----
   * |------------+----------+---------+---------|
   * | GET_TIME   |          |         |         |
   * |------------+----------+---------+---------|
+  * | GET_TICK   |          |         |         |
+  * |------------+----------+---------+---------|
   * | SET_TIME   |          |         | newtime |
   * ---------------------------------------------
   *
***************
*** 32,38 ****
  #include "proc.h"
  
  /* Constant definitions. */
! #define MILLISEC         100	/* how often to call the scheduler (msec) */
  #define SCHED_RATE (MILLISEC*HZ/1000)	/* number of ticks per schedule */
  
  /* Clock parameters. */
--- 34,40 ----
  #include "proc.h"
  
  /* Constant definitions. */
! #define MILLISEC         40	/* how often to call the scheduler (msec) */
  #define SCHED_RATE (MILLISEC*HZ/1000)	/* number of ticks per schedule */
  
  /* Clock parameters. */
***************
*** 61,67 ****
  PRIVATE void (*watch_dog[NR_TASKS+1])();  /* watch_dog functions to call */
  
  FORWARD void do_clocktick();
! FORWARD void do_get_time();
  FORWARD void do_set_time();
  FORWARD void do_setalarm();
  FORWARD void init_clock();
--- 63,70 ----
  PRIVATE void (*watch_dog[NR_TASKS+1])();  /* watch_dog functions to call */
  
  FORWARD void do_clocktick();
! FORWARD void do_time();
! FORWARD void do_ticks();
  FORWARD void do_set_time();
  FORWARD void do_setalarm();
  FORWARD void init_clock();
***************
*** 91,97 ****
  
       switch (opcode) {
  	case SET_ALARM:	 do_setalarm(&mc);	break;
! 	case GET_TIME:	 do_get_time();		break;
  	case SET_TIME:	 do_set_time(&mc);	break;
  	case HARD_INT:   do_clocktick();	break;
  	default: panic("clock task got bad message", mc.m_type);
--- 94,101 ----
  
       switch (opcode) {
  	case SET_ALARM:	 do_setalarm(&mc);	break;
! 	case GET_TIME:	 do_time();		break;
! 	case GET_TICK:	 do_ticks();		break;
  	case SET_TIME:	 do_set_time(&mc);	break;
  	case HARD_INT:   do_clocktick();	break;
  	default: panic("clock task got bad message", mc.m_type);
***************
*** 138,148 ****
  
  
  /*===========================================================================*
!  *				do_get_time				     *
!  *===========================================================================*/
! PRIVATE void do_get_time()
! {
! /* Get and return the current clock time in ticks. */
  
    mc.m_type = REAL_TIME;	/* set message type for reply */
    mc.NEW_TIME = boot_time + realtime/HZ;	/* current real time */
--- 142,152 ----
  
  
  /*===========================================================================*
!  *				  do_time				     *
!  *===========================================================================*/
! PRIVATE void do_time()
! {
! /* Get and return the current clock time in seconds. */
  
    mc.m_type = REAL_TIME;	/* set message type for reply */
    mc.NEW_TIME = boot_time + realtime/HZ;	/* current real time */
***************
*** 150,167 ****
  
  
  /*===========================================================================*
!  *				do_set_time				     *
!  *===========================================================================*/
! PRIVATE void do_set_time(m_ptr)
! message *m_ptr;			/* pointer to request message */
! {
! /* Set the real time clock.  Only the superuser can use this call. */
! 
!   boot_time = m_ptr->NEW_TIME - realtime/HZ;
  }
  
  
  /*===========================================================================*
   *				do_clocktick				     *
   *===========================================================================*/
  PRIVATE void do_clocktick()
--- 154,183 ----
  
  
  /*===========================================================================*
!  *				do_ticks				     *
!  *===========================================================================*/
! PRIVATE void do_ticks()
! {
! /* Get and return the time since startup in ticks. */
! 
!   mc.m_type = UP_TICKS;		/* set message type for reply */
!   mc.NEW_TIME = realtime;	/* current real time */
  }
  
  
  /*===========================================================================*
+  *				do_set_time				     *
+  *===========================================================================*/
+ PRIVATE void do_set_time(m_ptr)
+ message *m_ptr;			/* pointer to request message */
+ {
+ /* Set the real time clock.  Only the superuser can use this call. */
+ 
+   boot_time = m_ptr->NEW_TIME - realtime/HZ;
+ }
+ 
+ 
+ /*===========================================================================*
   *				do_clocktick				     *
   *===========================================================================*/
  PRIVATE void do_clocktick()
Index: /usr/include/minix/com.h
*** orig/com.h	Fri Nov  2 12:27:19 1990
--- com.h	Fri Nov  2 16:46:57 1990
***************
*** 74,80 ****
  #	define SET_ALARM   1	/* fcn code to CLOCK, set up alarm */
  #	define GET_TIME	   3	/* fcn code to CLOCK, get real time */
  #	define SET_TIME	   4	/* fcn code to CLOCK, set real time */
! #	define REAL_TIME   1	/* reply from CLOCK: here is real time */
  
  #define SYSTASK           -2	/* internal functions */
  #	define SYS_XIT     1	/* fcn code for sys_xit(parent, proc) */
--- 74,82 ----
  #	define SET_ALARM   1	/* fcn code to CLOCK, set up alarm */
  #	define GET_TIME	   3	/* fcn code to CLOCK, get real time */
  #	define SET_TIME	   4	/* fcn code to CLOCK, set real time */
! #	define GET_TICK	   5	/* fcn code to CLOCK, get uptime ticks */
! #	define REAL_TIME   1	/* reply from CLOCK: here is real time */
! #	define UP_TICKS    2	/* reply from CLOCK: here is uptime ticks */
  
  #define SYSTASK           -2	/* internal functions */
  #	define SYS_XIT     1	/* fcn code for sys_xit(parent, proc) */
***************
*** 134,139 ****
--- 136,142 ----
  #define SYSTEM_TIME    m4_l2	/* system time consumed by process */
  #define CHILD_UTIME    m4_l3	/* user time consumed by process' children */
  #define CHILD_STIME    m4_l4	/* sys time consumed by process' children */
+ #define UP_TIME        m4_l5	/* system up time */
  
  #define PROC1          m1_i1	/* indicates a process */
  #define PROC2          m1_i2	/* indicates a process */
Index: /usr/include/minix/param.h
*** orig/param.h	Fri Nov  2 12:16:56 1990
--- param.h	Fri Nov  2 12:16:10 1990
***************
*** 51,53 ****
--- 51,54 ----
  #define reply_t2      m1.m4_l2
  #define reply_t3      m1.m4_l3
  #define reply_t4      m1.m4_l4
+ #define reply_t5      m1.m4_l5
Index: /usr/src/fs/time.c
*** orig/time.c	Sat Oct 27 15:46:08 1990
--- time.c	Fri Nov  2 18:23:00 1990
***************
*** 83,93 ****
  /* Perform the times(buffer) system call. */
  
    time_t t[4];
  
    sys_times(who, t);
    reply_t1 = t[0];
    reply_t2 = t[1];
    reply_t3 = t[2];
    reply_t4 = t[3];
!   return(OK);
! }
--- 83,97 ----
  /* Perform the times(buffer) system call. */
  
    time_t t[4];
+   int	k;
  
    sys_times(who, t);
    reply_t1 = t[0];
    reply_t2 = t[1];
    reply_t3 = t[2];
    reply_t4 = t[3];
!   clock_mess.m_type = GET_TICK;
!   if ( (k = sendrec(CLOCK, &clock_mess)) != OK) panic("do_tims err", k);
!   reply_t5 = clock_mess.NEW_TIME;
!   return(OK);
! }
Index: /usr/src/lib/posix/times.c
*** orig/times.c	Mon Nov  5 10:14:37 1990
--- times.c	Fri Nov  2 19:24:40 1990
***************
*** 12,16 ****
    buf->tms_stime = _M.m4_l2;
    buf->tms_cutime = _M.m4_l3;
    buf->tms_cstime = _M.m4_l4;
!   return(k);
! }
--- 12,19 ----
    buf->tms_stime = _M.m4_l2;
    buf->tms_cutime = _M.m4_l3;
    buf->tms_cstime = _M.m4_l4;
!   if (k >= 0) {
!   	k = _M.m4_l5;
!   } 
!   return(k);
! }
Index: /usr/include/minix/type.h
*** orig/type.h	Fri Nov  2 12:28:07 1990
--- type.h	Fri Nov  2 12:31:43 1990
***************
*** 45,51 ****
  typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1;
  typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;} mess_2;
  typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_STRING];} mess_3;
! typedef struct {long m4l1, m4l2, m4l3, m4l4;} mess_4;
  typedef struct {char m5c1, m5c2; int m5i1, m5i2; long m5l1, m5l2, m5l3;} mess_5;
  typedef struct {int m6i1, m6i2, m6i3; long m6l1; void (*m6f1)();} mess_6;
  
--- 45,51 ----
  typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1;
  typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;} mess_2;
  typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_STRING];} mess_3;
! typedef struct {long m4l1, m4l2, m4l3, m4l4, m4l5;} mess_4;
  typedef struct {char m5c1, m5c2; int m5i1, m5i2; long m5l1, m5l2, m5l3;} mess_5;
  typedef struct {int m6i1, m6i2, m6i3; long m6l1; void (*m6f1)();} mess_6;
  
***************
*** 90,95 ****
--- 90,96 ----
  #define m4_l2  m_u.m_m4.m4l2
  #define m4_l3  m_u.m_m4.m4l3
  #define m4_l4  m_u.m_m4.m4l4
+ #define m4_l5  m_u.m_m4.m4l5
  
  #define m5_c1  m_u.m_m5.m5c1
  #define m5_c2  m_u.m_m5.m5c2
---8<------8<------8<------8<------8<------8<------8<------8<---
--
|    _  | Peter J. Holzer                       | Think of it   |
| |_|_) | Technical University Vienna           | as evolution  |
| | |   | Dept. for Real-Time Systems           | in action!    |
| __/   | hp@vmars.tuwien.ac.at                 |     Tony Rand |