1d6b92ffaSHans Petter Selasky /* 2d6b92ffaSHans Petter Selasky * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved. 3d6b92ffaSHans Petter Selasky * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. 4d6b92ffaSHans Petter Selasky * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 5d6b92ffaSHans Petter Selasky * 6d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two 7d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 8d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file 9d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the 10d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below: 11d6b92ffaSHans Petter Selasky * 12d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or 13d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following 14d6b92ffaSHans Petter Selasky * conditions are met: 15d6b92ffaSHans Petter Selasky * 16d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above 17d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 18d6b92ffaSHans Petter Selasky * disclaimer. 19d6b92ffaSHans Petter Selasky * 20d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above 21d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following 22d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials 23d6b92ffaSHans Petter Selasky * provided with the distribution. 24d6b92ffaSHans Petter Selasky * 25d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32d6b92ffaSHans Petter Selasky * SOFTWARE. 33d6b92ffaSHans Petter Selasky * 34d6b92ffaSHans Petter Selasky */ 35d6b92ffaSHans Petter Selasky 36d6b92ffaSHans Petter Selasky /* 37d6b92ffaSHans Petter Selasky * Abstract: 38d6b92ffaSHans Petter Selasky * Declaration of timer abstraction. 39d6b92ffaSHans Petter Selasky */ 40d6b92ffaSHans Petter Selasky 41d6b92ffaSHans Petter Selasky #ifndef _CL_TIMER_H_ 42d6b92ffaSHans Petter Selasky #define _CL_TIMER_H_ 43d6b92ffaSHans Petter Selasky 44d6b92ffaSHans Petter Selasky #include <complib/cl_types.h> 45d6b92ffaSHans Petter Selasky 46d6b92ffaSHans Petter Selasky #ifdef __cplusplus 47d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS extern "C" { 48d6b92ffaSHans Petter Selasky # define END_C_DECLS } 49d6b92ffaSHans Petter Selasky #else /* !__cplusplus */ 50d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS 51d6b92ffaSHans Petter Selasky # define END_C_DECLS 52d6b92ffaSHans Petter Selasky #endif /* __cplusplus */ 53d6b92ffaSHans Petter Selasky 54d6b92ffaSHans Petter Selasky BEGIN_C_DECLS 55d6b92ffaSHans Petter Selasky /****h* Component Library/Timer 56d6b92ffaSHans Petter Selasky * NAME 57d6b92ffaSHans Petter Selasky * Timer 58d6b92ffaSHans Petter Selasky * 59d6b92ffaSHans Petter Selasky * DESCRIPTION 60d6b92ffaSHans Petter Selasky * The Timer provides the ability to schedule a function to be invoked at 61d6b92ffaSHans Petter Selasky * a given time in the future. 62d6b92ffaSHans Petter Selasky * 63d6b92ffaSHans Petter Selasky * The timer callback function must not perform any blocking operations. 64d6b92ffaSHans Petter Selasky * 65d6b92ffaSHans Petter Selasky * The timer functions operate on a cl_timer_t structure which should be 66d6b92ffaSHans Petter Selasky * treated as opaque and should be manipulated only through the provided 67d6b92ffaSHans Petter Selasky * functions. 68d6b92ffaSHans Petter Selasky * 69d6b92ffaSHans Petter Selasky * SEE ALSO 70d6b92ffaSHans Petter Selasky * Structures: 71d6b92ffaSHans Petter Selasky * cl_timer_t 72d6b92ffaSHans Petter Selasky * 73d6b92ffaSHans Petter Selasky * Callbacks: 74d6b92ffaSHans Petter Selasky * cl_pfn_timer_callback_t 75d6b92ffaSHans Petter Selasky * 76d6b92ffaSHans Petter Selasky * Initialization: 77d6b92ffaSHans Petter Selasky * cl_timer_construct, cl_timer_init, cl_timer_destroy 78d6b92ffaSHans Petter Selasky * 79d6b92ffaSHans Petter Selasky * Manipulation: 80d6b92ffaSHans Petter Selasky * cl_timer_start, cl_timer_stop 81d6b92ffaSHans Petter Selasky *********/ 82d6b92ffaSHans Petter Selasky /****d* Component Library: Timer/cl_pfn_timer_callback_t 83d6b92ffaSHans Petter Selasky * NAME 84d6b92ffaSHans Petter Selasky * cl_pfn_timer_callback_t 85d6b92ffaSHans Petter Selasky * 86d6b92ffaSHans Petter Selasky * DESCRIPTION 87d6b92ffaSHans Petter Selasky * The cl_pfn_timer_callback_t function type defines the prototype for 88d6b92ffaSHans Petter Selasky * functions used to notify users of a timer expiration. 89d6b92ffaSHans Petter Selasky * 90d6b92ffaSHans Petter Selasky * SYNOPSIS 91d6b92ffaSHans Petter Selasky */ 92d6b92ffaSHans Petter Selasky typedef void (*cl_pfn_timer_callback_t) (IN void *context); 93d6b92ffaSHans Petter Selasky /* 94d6b92ffaSHans Petter Selasky * PARAMETERS 95d6b92ffaSHans Petter Selasky * context 96d6b92ffaSHans Petter Selasky * [in] Value specified in a previous call to cl_timer_init. 97d6b92ffaSHans Petter Selasky * 98d6b92ffaSHans Petter Selasky * RETURN VALUE 99d6b92ffaSHans Petter Selasky * This function does not return a value. 100d6b92ffaSHans Petter Selasky * 101d6b92ffaSHans Petter Selasky * NOTES 102d6b92ffaSHans Petter Selasky * This function type is provided as function prototype reference for the 103d6b92ffaSHans Petter Selasky * function provided by users as a parameter to the cl_timer_init function. 104d6b92ffaSHans Petter Selasky * 105d6b92ffaSHans Petter Selasky * SEE ALSO 106d6b92ffaSHans Petter Selasky * Timer, cl_timer_init 107d6b92ffaSHans Petter Selasky *********/ 108d6b92ffaSHans Petter Selasky 109d6b92ffaSHans Petter Selasky /* 110d6b92ffaSHans Petter Selasky * This include file defines the timer structure, and depends on the timer 111d6b92ffaSHans Petter Selasky * callback definition. 112d6b92ffaSHans Petter Selasky */ 113d6b92ffaSHans Petter Selasky #include <complib/cl_timer_osd.h> 114d6b92ffaSHans Petter Selasky 115d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_construct 116d6b92ffaSHans Petter Selasky * NAME 117d6b92ffaSHans Petter Selasky * cl_timer_construct 118d6b92ffaSHans Petter Selasky * 119d6b92ffaSHans Petter Selasky * DESCRIPTION 120d6b92ffaSHans Petter Selasky * The cl_timer_construct function initializes the state of a timer. 121d6b92ffaSHans Petter Selasky * 122d6b92ffaSHans Petter Selasky * SYNOPSIS 123d6b92ffaSHans Petter Selasky */ 124d6b92ffaSHans Petter Selasky void cl_timer_construct(IN cl_timer_t * const p_timer); 125d6b92ffaSHans Petter Selasky /* 126d6b92ffaSHans Petter Selasky * PARAMETERS 127d6b92ffaSHans Petter Selasky * p_timer 128d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure whose state to initialize. 129d6b92ffaSHans Petter Selasky * 130d6b92ffaSHans Petter Selasky * RETURN VALUE 131d6b92ffaSHans Petter Selasky * This function does not return a value. 132d6b92ffaSHans Petter Selasky * 133d6b92ffaSHans Petter Selasky * NOTES 134d6b92ffaSHans Petter Selasky * Allows calling cl_timer_destroy without first calling cl_timer_init. 135d6b92ffaSHans Petter Selasky * 136d6b92ffaSHans Petter Selasky * Calling cl_timer_construct is a prerequisite to calling any other 137d6b92ffaSHans Petter Selasky * timer function except cl_timer_init. 138d6b92ffaSHans Petter Selasky * 139d6b92ffaSHans Petter Selasky * SEE ALSO 140d6b92ffaSHans Petter Selasky * Timer, cl_timer_init, cl_timer_destroy 141d6b92ffaSHans Petter Selasky *********/ 142d6b92ffaSHans Petter Selasky 143d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_init 144d6b92ffaSHans Petter Selasky * NAME 145d6b92ffaSHans Petter Selasky * cl_timer_init 146d6b92ffaSHans Petter Selasky * 147d6b92ffaSHans Petter Selasky * DESCRIPTION 148d6b92ffaSHans Petter Selasky * The cl_timer_init function initializes a timer for use. 149d6b92ffaSHans Petter Selasky * 150d6b92ffaSHans Petter Selasky * SYNOPSIS 151d6b92ffaSHans Petter Selasky */ 152d6b92ffaSHans Petter Selasky cl_status_t 153d6b92ffaSHans Petter Selasky cl_timer_init(IN cl_timer_t * const p_timer, 154d6b92ffaSHans Petter Selasky IN cl_pfn_timer_callback_t pfn_callback, 155d6b92ffaSHans Petter Selasky IN const void *const context); 156d6b92ffaSHans Petter Selasky /* 157d6b92ffaSHans Petter Selasky * PARAMETERS 158d6b92ffaSHans Petter Selasky * p_timer 159d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure to initialize. 160d6b92ffaSHans Petter Selasky * 161d6b92ffaSHans Petter Selasky * pfn_callback 162d6b92ffaSHans Petter Selasky * [in] Address of a callback function to be invoked when a timer expires. 163d6b92ffaSHans Petter Selasky * See the cl_pfn_timer_callback_t function type definition for details 164d6b92ffaSHans Petter Selasky * about the callback function. 165d6b92ffaSHans Petter Selasky * 166d6b92ffaSHans Petter Selasky * context 167d6b92ffaSHans Petter Selasky * [in] Value to pass to the callback function. 168d6b92ffaSHans Petter Selasky * 169d6b92ffaSHans Petter Selasky * RETURN VALUES 170d6b92ffaSHans Petter Selasky * CL_SUCCESS if the timer was successfully initialized. 171d6b92ffaSHans Petter Selasky * 172d6b92ffaSHans Petter Selasky * CL_ERROR otherwise. 173d6b92ffaSHans Petter Selasky * 174d6b92ffaSHans Petter Selasky * NOTES 175d6b92ffaSHans Petter Selasky * Allows calling cl_timer_start and cl_timer_stop. 176d6b92ffaSHans Petter Selasky * 177d6b92ffaSHans Petter Selasky * SEE ALSO 178d6b92ffaSHans Petter Selasky * Timer, cl_timer_construct, cl_timer_destroy, cl_timer_start, 179d6b92ffaSHans Petter Selasky * cl_timer_stop, cl_pfn_timer_callback_t 180d6b92ffaSHans Petter Selasky *********/ 181d6b92ffaSHans Petter Selasky 182d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_destroy 183d6b92ffaSHans Petter Selasky * NAME 184d6b92ffaSHans Petter Selasky * cl_timer_destroy 185d6b92ffaSHans Petter Selasky * 186d6b92ffaSHans Petter Selasky * DESCRIPTION 187d6b92ffaSHans Petter Selasky * The cl_timer_destroy function performs any necessary cleanup of a timer. 188d6b92ffaSHans Petter Selasky * 189d6b92ffaSHans Petter Selasky * SYNOPSIS 190d6b92ffaSHans Petter Selasky */ 191d6b92ffaSHans Petter Selasky void cl_timer_destroy(IN cl_timer_t * const p_timer); 192d6b92ffaSHans Petter Selasky /* 193d6b92ffaSHans Petter Selasky * PARAMETERS 194d6b92ffaSHans Petter Selasky * p_timer 195d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure to destroy. 196d6b92ffaSHans Petter Selasky * 197d6b92ffaSHans Petter Selasky * RETURN VALUE 198d6b92ffaSHans Petter Selasky * This function does not return a value. 199d6b92ffaSHans Petter Selasky * 200d6b92ffaSHans Petter Selasky * NOTES 201d6b92ffaSHans Petter Selasky * cl_timer_destroy cancels any pending callbacks. 202d6b92ffaSHans Petter Selasky * 203d6b92ffaSHans Petter Selasky * This function should only be called after a call to cl_timer_construct 204d6b92ffaSHans Petter Selasky * or cl_timer_init. 205d6b92ffaSHans Petter Selasky * 206d6b92ffaSHans Petter Selasky * SEE ALSO 207d6b92ffaSHans Petter Selasky * Timer, cl_timer_construct, cl_timer_init 208d6b92ffaSHans Petter Selasky *********/ 209d6b92ffaSHans Petter Selasky 210d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_start 211d6b92ffaSHans Petter Selasky * NAME 212d6b92ffaSHans Petter Selasky * cl_timer_start 213d6b92ffaSHans Petter Selasky * 214d6b92ffaSHans Petter Selasky * DESCRIPTION 215d6b92ffaSHans Petter Selasky * The cl_timer_start function sets a timer to expire after a given interval. 216d6b92ffaSHans Petter Selasky * 217d6b92ffaSHans Petter Selasky * SYNOPSIS 218d6b92ffaSHans Petter Selasky */ 219d6b92ffaSHans Petter Selasky cl_status_t 220d6b92ffaSHans Petter Selasky cl_timer_start(IN cl_timer_t * const p_timer, IN const uint32_t time_ms); 221d6b92ffaSHans Petter Selasky /* 222d6b92ffaSHans Petter Selasky * PARAMETERS 223d6b92ffaSHans Petter Selasky * p_timer 224d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure to schedule. 225d6b92ffaSHans Petter Selasky * 226d6b92ffaSHans Petter Selasky * time_ms 227d6b92ffaSHans Petter Selasky * [in] Time, in milliseconds, before the timer should expire. 228d6b92ffaSHans Petter Selasky * 229d6b92ffaSHans Petter Selasky * RETURN VALUES 230d6b92ffaSHans Petter Selasky * CL_SUCCESS if the timer was successfully scheduled. 231d6b92ffaSHans Petter Selasky * 232d6b92ffaSHans Petter Selasky * CL_ERROR otherwise. 233d6b92ffaSHans Petter Selasky * 234d6b92ffaSHans Petter Selasky * NOTES 235d6b92ffaSHans Petter Selasky * cl_timer_start implicitly stops the timer before being scheduled. 236d6b92ffaSHans Petter Selasky * 237d6b92ffaSHans Petter Selasky * The interval specified by the time_ms parameter is a minimum interval. 238d6b92ffaSHans Petter Selasky * The timer is guaranteed to expire no sooner than the desired interval, but 239d6b92ffaSHans Petter Selasky * may take longer to expire. 240d6b92ffaSHans Petter Selasky * 241d6b92ffaSHans Petter Selasky * SEE ALSO 242d6b92ffaSHans Petter Selasky * Timer, cl_timer_stop, cl_timer_trim 243d6b92ffaSHans Petter Selasky *********/ 244d6b92ffaSHans Petter Selasky 245d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_stop 246d6b92ffaSHans Petter Selasky * NAME 247d6b92ffaSHans Petter Selasky * cl_timer_stop 248d6b92ffaSHans Petter Selasky * 249d6b92ffaSHans Petter Selasky * DESCRIPTION 250d6b92ffaSHans Petter Selasky * The cl_timer_stop function stops a pending timer from expiring. 251d6b92ffaSHans Petter Selasky * 252d6b92ffaSHans Petter Selasky * SYNOPSIS 253d6b92ffaSHans Petter Selasky */ 254d6b92ffaSHans Petter Selasky void cl_timer_stop(IN cl_timer_t * const p_timer); 255d6b92ffaSHans Petter Selasky /* 256d6b92ffaSHans Petter Selasky * PARAMETERS 257d6b92ffaSHans Petter Selasky * p_timer 258d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure. 259d6b92ffaSHans Petter Selasky * 260d6b92ffaSHans Petter Selasky * RETURN VALUE 261d6b92ffaSHans Petter Selasky * This function does not return a value. 262d6b92ffaSHans Petter Selasky * 263d6b92ffaSHans Petter Selasky * SEE ALSO 264d6b92ffaSHans Petter Selasky * Timer, cl_timer_start, cl_timer_trim 265d6b92ffaSHans Petter Selasky *********/ 266d6b92ffaSHans Petter Selasky 267d6b92ffaSHans Petter Selasky /****f* Component Library: Timer/cl_timer_trim 268d6b92ffaSHans Petter Selasky * NAME 269d6b92ffaSHans Petter Selasky * cl_timer_trim 270d6b92ffaSHans Petter Selasky * 271d6b92ffaSHans Petter Selasky * DESCRIPTION 272d6b92ffaSHans Petter Selasky * The cl_timer_trim function pulls in the absolute expiration 273d6b92ffaSHans Petter Selasky * time of a timer if the current expiration time exceeds the specified 274d6b92ffaSHans Petter Selasky * interval. 275d6b92ffaSHans Petter Selasky * 276d6b92ffaSHans Petter Selasky * sets a timer to expire after a given 277d6b92ffaSHans Petter Selasky * interval if that interval is less than the current timer expiration. 278d6b92ffaSHans Petter Selasky * 279d6b92ffaSHans Petter Selasky * SYNOPSIS 280d6b92ffaSHans Petter Selasky */ 281d6b92ffaSHans Petter Selasky cl_status_t 282d6b92ffaSHans Petter Selasky cl_timer_trim(IN cl_timer_t * const p_timer, IN const uint32_t time_ms); 283d6b92ffaSHans Petter Selasky /* 284d6b92ffaSHans Petter Selasky * PARAMETERS 285d6b92ffaSHans Petter Selasky * p_timer 286d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_timer_t structure to schedule. 287d6b92ffaSHans Petter Selasky * 288d6b92ffaSHans Petter Selasky * time_ms 289d6b92ffaSHans Petter Selasky * [in] Maximum time, in milliseconds, before the timer should expire. 290d6b92ffaSHans Petter Selasky * 291d6b92ffaSHans Petter Selasky * RETURN VALUES 292d6b92ffaSHans Petter Selasky * CL_SUCCESS if the timer was successfully scheduled. 293d6b92ffaSHans Petter Selasky * 294d6b92ffaSHans Petter Selasky * CL_ERROR otherwise. 295d6b92ffaSHans Petter Selasky * 296d6b92ffaSHans Petter Selasky * NOTES 297d6b92ffaSHans Petter Selasky * cl_timer_trim has no effect if the time interval is greater than the 298d6b92ffaSHans Petter Selasky * remaining time when the timer is set. 299d6b92ffaSHans Petter Selasky * 300d6b92ffaSHans Petter Selasky * If the new interval time is less than the remaining time, cl_timer_trim 301d6b92ffaSHans Petter Selasky * implicitly stops the timer before resetting it. 302d6b92ffaSHans Petter Selasky * 303d6b92ffaSHans Petter Selasky * If the timer is reset, it is guaranteed to expire no sooner than the 304d6b92ffaSHans Petter Selasky * new interval, but may take longer to expire. 305d6b92ffaSHans Petter Selasky * 306d6b92ffaSHans Petter Selasky * SEE ALSO 307d6b92ffaSHans Petter Selasky * Timer, cl_timer_start, cl_timer_stop 308d6b92ffaSHans Petter Selasky *********/ 309d6b92ffaSHans Petter Selasky 310d6b92ffaSHans Petter Selasky /****f* Component Library: Time Stamp/cl_get_time_stamp 311d6b92ffaSHans Petter Selasky * NAME 312d6b92ffaSHans Petter Selasky * cl_get_time_stamp 313d6b92ffaSHans Petter Selasky * 314d6b92ffaSHans Petter Selasky * DESCRIPTION 315d6b92ffaSHans Petter Selasky * The cl_get_time_stamp function returns the current time stamp in 316d6b92ffaSHans Petter Selasky * microseconds since the system was booted. 317d6b92ffaSHans Petter Selasky * 318d6b92ffaSHans Petter Selasky * SYNOPSIS 319d6b92ffaSHans Petter Selasky */ 320d6b92ffaSHans Petter Selasky uint64_t cl_get_time_stamp(void); 321d6b92ffaSHans Petter Selasky /* 322d6b92ffaSHans Petter Selasky * RETURN VALUE 323d6b92ffaSHans Petter Selasky * Time elapsed, in microseconds, since the system was booted. 324d6b92ffaSHans Petter Selasky * 325d6b92ffaSHans Petter Selasky * SEE ALSO 326d6b92ffaSHans Petter Selasky * Timer, cl_get_time_stamp_sec 327d6b92ffaSHans Petter Selasky *********/ 328d6b92ffaSHans Petter Selasky 329d6b92ffaSHans Petter Selasky /****f* Component Library: Time Stamp/cl_get_time_stamp_sec 330d6b92ffaSHans Petter Selasky * NAME 331d6b92ffaSHans Petter Selasky * cl_get_time_stamp_sec 332d6b92ffaSHans Petter Selasky * 333d6b92ffaSHans Petter Selasky * DESCRIPTION 334d6b92ffaSHans Petter Selasky * The cl_get_time_stamp_sec function returns the current time stamp in 335d6b92ffaSHans Petter Selasky * seconds since the system was booted. 336d6b92ffaSHans Petter Selasky * 337d6b92ffaSHans Petter Selasky * SYNOPSIS 338d6b92ffaSHans Petter Selasky */ 339d6b92ffaSHans Petter Selasky uint32_t cl_get_time_stamp_sec(void); 340d6b92ffaSHans Petter Selasky /* 341d6b92ffaSHans Petter Selasky * RETURN VALUE 342d6b92ffaSHans Petter Selasky * Time elapsed, in seconds, since the system was booted. 343d6b92ffaSHans Petter Selasky * 344d6b92ffaSHans Petter Selasky * SEE ALSO 345d6b92ffaSHans Petter Selasky * Timer, cl_get_time_stamp 346d6b92ffaSHans Petter Selasky *********/ 347d6b92ffaSHans Petter Selasky 348d6b92ffaSHans Petter Selasky END_C_DECLS 349d6b92ffaSHans Petter Selasky #endif /* _CL_TIMER_H_ */ 350