diff packages/language/c/libc/current/src/time/clock.cxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/language/c/libc/current/src/time/clock.cxx
@@ -0,0 +1,130 @@
+//===========================================================================
+//
+//      clock.cxx
+//
+//      ANSI standard clock() routine defined in section 7.12.2.1
+//
+//===========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   jlarmour
+// Contributors:  jlarmour@cygnus.co.uk
+// Date:        1998-02-13
+// Purpose:     
+// Description: 
+// Usage:       
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// CONFIGURATION
+
+#include <pkgconf/libc.h>    // Configuration header
+
+#ifdef CYGPKG_KERNEL
+# include <pkgconf/kernel.h> // Kernel config header
+#endif
+
+// Include the C library?
+#ifdef CYGPKG_LIBC     
+
+// INCLUDES
+
+#include <cyg/infra/cyg_type.h>  // Common type definitions and support
+#include <cyg/infra/cyg_trac.h>  // Tracing support
+#include <cyg/infra/cyg_ass.h>   // Assertion support
+#include <stddef.h>              // NULL and size_t from compiler
+
+#include <time.h>                // Header for all time-related functions
+#include "clibincl/timesupp.hxx" // Support for time functions
+
+#if defined(CYGFUN_KERNEL_THREADS_TIMER) && \
+    defined(CYGVAR_KERNEL_COUNTERS_CLOCK)
+# include <cyg/kernel/clock.hxx>  // Kernel clock definitions
+# include <cyg/kernel/clock.inl>  // Kernel clock inline functions
+#endif
+
+
+// TRACE
+
+# if defined(CYGDBG_USE_TRACING) && defined(CYGNUM_LIBC_CLOCK_TRACE_LEVEL)
+static int clock_trace = CYGNUM_LIBC_CLOCK_TRACE_LEVEL;
+#  define TL1 (0 < clock_trace)
+# else
+#  define TL1 (0)
+# endif
+
+
+// EXPORTED SYMBOLS
+
+externC clock_t
+clock( void ) CYGPRI_LIBC_WEAK_ALIAS("_clock");
+
+// FUNCTIONS
+
+clock_t
+_clock( void )
+{
+    CYG_REPORT_FUNCNAMETYPE( "_clock", "returning clock tick %d" );
+    CYG_REPORT_FUNCARGVOID();
+
+    // Only if the kernel has clock device support
+#if defined(CYGFUN_KERNEL_THREADS_TIMER) && defined(CYGVAR_KERNEL_COUNTERS_CLOCK)
+    cyg_tick_count curr_clock;            // kernel clock value
+    Cyg_Clock::cyg_resolution resolution; // kernel clock resolution
+    clock_t clocks;
+
+    CYG_TRACE0( TL1, "getting clock resolution" );
+    
+    // get the resolution
+    resolution = Cyg_Clock::real_time_clock->get_resolution();
+
+    CYG_TRACE2( TL1, "got resolution dividend %d divisor %d. Getting "
+                "clock value", resolution.dividend, resolution.divisor );
+
+    // get the value
+    curr_clock = Cyg_Clock::real_time_clock->current_value();
+
+    CYG_TRACE1( TL1, "got clock value %d", curr_clock );
+    
+    // scale the value so that clock()/CLOCKS_PER_SEC works - clock_t
+    // should be big enough to cope
+    clocks = ((clock_t)curr_clock * resolution.dividend) / 
+      (resolution.divisor * (1000000000 / CLOCKS_PER_SEC));
+
+    CYG_REPORT_RETVAL( clocks );
+    return clocks;
+
+#else
+    CYG_REPORT_RETVAL( -1 );
+    return (clock_t) -1;
+#endif
+
+} // _clock()
+
+#endif // ifdef CYGPKG_LIBC     
+
+// EOF clock.cxx