--- doc/clock.n	24 May 2004 23:31:42 -0000	1.17
+++ doc/clock.n	15 Jul 2004 17:06:08 -0000
@@ -35,27 +35,16 @@
 time value as a system-dependent integer value.  The unit of the value
 is system-dependent but should be the highest resolution clock available
 on the system such as a CPU cycle counter. 
-.TP
+
 .VS 8.5
 If the \fIoption\fR argument is \fB\-milliseconds\fR, then the value is
 guaranteed to be an approximate count of milliseconds returned as
 a wide integer; the rule should
 always hold that \fBclock clicks -milliseconds\fR divided by 1000 is the
 same as \fBclock seconds\fR.
-.TP
-It the \fIoption\fR argument is \fB-microseconds\fR, then the value is
-guaranteed to be an approximate count of microseconds returned as a wide
-integer; the rule should hold that \fBclock clicks -microseconds\fR
-divided by 1000 is the same as \fBclock clicks -milliseconds\fR.
-.TP
-On some hardware, the counts of milliseconds and microseconds may diverge
-from the system clock for short periods; the reason is that they can
-be derived from different sources, and a complex procedure is required
-to calibrate them.  Moreover, Tcl makes an effort never to have the clock
-leap forward nor appear to run backward, preferring instead to slow or
-speed up the clock frequency slightly until it's back in synchronization.
-For this reason, most Tcl programmers need never worry about such
-phenomena as leap seconds.
+
+The \fB-milliseconds\fR option is deprecated and may be removed in a
+future version. Use \fBclock milliseconds\fR instead.
 .VE 8.5
 .TP
 \fBclock format \fIclockValue\fR ?\fB\-format \fIstring\fR? ?\fB\-gmt \fIboolean\fR?
@@ -275,6 +264,28 @@
 unit of the value is seconds, allowing it to be used for relative time
 calculations.  The value is usually defined as total elapsed time from
 an ``epoch''.  You shouldn't assume the value of the epoch.
+.TP
+\fBclock milliseconds\fR
+.TP
+\fBclock microseconds\fR
+.VS 8.5
+Return the current date and time as a wide integer counting in
+milliseconds or microseconds repectively.
+
+The rule should always hold that \fBclock milliseconds\fR divided by
+1000 and \fBclock microseconds\fR divided by one million is the same
+as \fBclock seconds\fR.
+
+On some hardware, the counts of milliseconds and microseconds may
+diverge from the system clock for short periods; the reason is that
+they can be derived from different sources, and a complex procedure is
+required to calibrate them.  Moreover, Tcl makes an effort never to
+have the clock leap forward nor appear to run backward, preferring
+instead to slow or speed up the clock frequency slightly until it's
+back in synchronization.  For this reason, most Tcl programmers need
+never worry about such phenomena as leap seconds.
+.VE 8.5
+.TP
 .SH EXAMPLE
 Print out the current date and time, first using the default format
 and then using an ISO 8601 format:
Index: generic/tclClock.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclClock.c,v
retrieving revision 1.28
diff -u -r1.28 tclClock.c
--- generic/tclClock.c	14 May 2004 21:43:28 -0000	1.28
+++ generic/tclClock.c	15 Jul 2004 17:06:08 -0000
@@ -68,10 +68,12 @@
     Tcl_Time now;		/* Current time */
 
     static CONST char *switches[] = {
-	"clicks", "format", "scan", "seconds", (char *) NULL
+	"clicks", "format", "microseconds", "milliseconds",
+	"scan", "seconds", (char *) NULL
     };
     enum command {
-	COMMAND_CLICKS, COMMAND_FORMAT, COMMAND_SCAN, COMMAND_SECONDS
+	COMMAND_CLICKS, COMMAND_FORMAT, COMMAND_MICROSECONDS,
+	COMMAND_MILLISECONDS, COMMAND_SCAN, COMMAND_SECONDS
     };
     static CONST char *clicksSwitches[] = {
 	"-milliseconds", "-microseconds", (char*) NULL
@@ -123,6 +125,26 @@
 	    return TCL_OK;
 	}
 
+	case COMMAND_MICROSECONDS: /* microseconds */
+	    if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 2, objv, NULL);
+		return TCL_ERROR;
+	    }
+	    Tcl_GetTime(&now);
+	    Tcl_SetWideIntObj(resultPtr,
+			      ((Tcl_WideInt) now.sec * 1000000 + now.usec));
+	    return TCL_OK;
+
+	case COMMAND_MILLISECONDS: /* milliseconds */
+	    if (objc != 2) {
+		Tcl_WrongNumArgs(interp, 2, objv, NULL);
+		return TCL_ERROR;
+	    }
+	    Tcl_GetTime(&now);
+	    Tcl_SetWideIntObj(resultPtr,
+			      ((Tcl_WideInt) now.sec * 1000 + now.usec / 1000));
+	    return TCL_OK;
+
 	case COMMAND_FORMAT:			/* format */
 	    if ((objc < 3) || (objc > 7)) {
 		wrongFmtArgs:
Index: tests/clock.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/clock.test,v
retrieving revision 1.34
diff -u -r1.34 clock.test
--- tests/clock.test	10 Jul 2004 21:26:10 -0000	1.34
+++ tests/clock.test	15 Jul 2004 17:06:09 -0000
@@ -41,7 +41,7 @@
 } {1 {wrong # args: should be "clock option ?arg ...?"}}
 test clock-1.2 {clock tests} {
     list [catch {clock foo} msg] $msg
-} {1 {bad option "foo": must be clicks, format, scan, or seconds}}
+} {1 {bad option "foo": must be clicks, format, microseconds, milliseconds, scan, or seconds}}
 
 # clock clicks
 test clock-2.1 {clock clicks tests} {
@@ -709,6 +709,80 @@
     clock scan "1600" -gmt true -base $base
 } 1078848000
 
+###############################################
+# [clock milliseconds] and [clock microseconds]
+
+test clock-12.1 {milliseconds with excess argument} {
+    list [catch {clock milliseconds foo} error] $error
+} {1 {wrong # args: should be "clock milliseconds"}}
+
+test clock-12.2 {clock milliseconds timing test} {
+    set start [clock milli]
+    after 10
+    set end [clock milli]
+    # 60 msecs seems to be the max time slice under Windows 95/98
+    expr {($end > $start) && (($end - $start) <= 60)}
+} {1}
+
+test clock-12.3 {clock microseconds timing test} {
+    set start [clock micro]
+    after 10
+    set end [clock micro]
+    # 60 msecs seems to be the max time slice under Windows 95/98
+    expr {($end > $start) && (($end - $start) <= 60000)}
+} {1}
+
+test clock-12.3 {clock clicks test, millis align with seconds} {
+    set t1 [clock seconds]
+    while { 1 } {
+	set t2 [clock clicks -millis]
+	set t3 [clock seconds]
+	if { $t3 == $t1 } break
+	set t1 $t3
+    }
+    expr { $t2 / 1000 == $t3 }
+} {1}
+
+test clock-12.4 {clock micros align with seconds} {
+    set t1 [clock seconds]
+    while { 1 } {
+	set t2 [clock micros]
+	set t3 [clock seconds]
+	if { $t3 == $t1 } break
+	set t1 $t3
+    }
+    expr { $t2 / 1000000 == $t3 }
+} {1}
+
+test clock-12.5 {clock millis align with micros} {
+    set t1 [clock millis]
+    set i 0
+    while { $i < 1000 } {
+	set t2 [clock micros]
+	set t3 [clock millis]
+	if { $t3 == $t1 } break
+	set t1 $t3
+        incr i
+    }
+    if { $i >= 1000 } {
+        set result {can't test millis/micros alignment, loop running too slow}
+    } else {
+        set result [expr { $t2 / 1000 == $t3 }]
+    }
+    set result
+} {1}
+
+test clock-12.6 {clock milliseconds tests} {
+    expr {[clock milliseconds]+1}
+    concat {}
+} {}
+
+test clock-12.7 {clock microseconds tests} {
+    expr {[clock microseconds]+1}
+    concat {}
+} {}
+
+
 if { [info exists oldlctime] } {
     set env(LC_TIME) $oldlctime
 } else {
