14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  ptimer.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptimer.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmutex.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef _WIN32
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  Note that this implementation assumes that QueryPerformanceCounter is
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  available (requires NT 3.1 and above) and that 64 bit arithmetic is
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  available (requires VC)
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct PTimer_t
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LARGE_INTEGER PerformanceFreq;
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LARGE_INTEGER RefTime;
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LARGE_INTEGER elapsed;
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Creates a new timer object.
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **/
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerCreate(PTimer **timer)
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimer *tmp = NULL;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL)
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tmp = NEW(PTimer, "PTimer");
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (tmp == NULL)
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (QueryPerformanceFrequency(&tmp->PerformanceFreq) == 0)
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(tmp);
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_NOT_SUPPORTED;
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tmp->PerformanceFreq.QuadPart /= 1000;
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tmp->RefTime.QuadPart = 0;
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tmp->elapsed.QuadPart = 0;
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *timer = tmp;
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerDestroy(PTimer *timer)
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(timer);
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Starts the timer. This sets the reference time from which all new elapsed
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * time are computed.  This does not reset the elapsed time to 0.  This is
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * useful to pause the timer.
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **/
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerStart(PTimer *timer)
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return (QueryPerformanceCounter(&timer->RefTime) ?
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          ESR_SUCCESS :
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          ESR_NOT_SUPPORTED);
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Stops the timer.
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **/
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerStop(PTimer *timer)
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer->RefTime.QuadPart != 0)
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LARGE_INTEGER now;
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!QueryPerformanceCounter(&now)) return ESR_NOT_SUPPORTED;
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    timer->elapsed.QuadPart += now.QuadPart - timer->RefTime.QuadPart;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    timer->RefTime.QuadPart = 0;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Returns the timer elapsed time.  If the Timer is in the stopped state,
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * successive calls to getElapsed() will always return the same value.  If
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the Timer is in the started state, successive calls will return the
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * elapsed time since the last time PTimerStart() was called.
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerGetElapsed(PTimer *timer, asr_uint32_t* elapsed)
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL || elapsed == NULL)
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer->RefTime.QuadPart != 0)
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    LARGE_INTEGER now;
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!QueryPerformanceCounter(&now)) return ESR_NOT_SUPPORTED;
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *elapsed = (asr_uint32_t) ((timer->elapsed.QuadPart + (now.QuadPart - timer->RefTime.QuadPart))
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           / timer->PerformanceFreq.QuadPart);
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *elapsed = (asr_uint32_t) (timer->elapsed.QuadPart / timer->PerformanceFreq.QuadPart);
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Resets the elapsed time to 0 and resets the reference time of the Timer.
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * This effectively reset the timer in the same state it was right after creation.
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project **/
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerReset(PTimer *timer)
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer->RefTime.QuadPart = 0;
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer->elapsed.QuadPart = 0;
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#elif defined(POSIX)
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptrd.h"
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectPOSIX has a timer
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Clocks and timers: clock_settime, clock_gettime, clock_getres, timer_xxx and nanosleep */
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _POSIX_TIMERS
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef __vxworks /* __vxworks does not define it! */
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#error "Timer is not defined!"
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* __vxworks */
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* _POSIX_TIMERS */
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define TIMER_MAX_VAL 10000
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct PTimer_t
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer_t  timer;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_uint32_t elapsed;
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project};
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* Creates a new timer object.
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**/
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerCreate(PTimer **timer)
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PTimer *tmp = NULL;
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tmp = NEW(PTimer, "PTimer");
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (tmp == NULL) return ESR_OUT_OF_MEMORY;
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *timer = tmp;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer_create(CLOCK_REALTIME, NULL, &(tmp->timer)) < 0)
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_NOT_SUPPORTED;
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerDestroy(PTimer *timer)
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer_delete(timer->timer);
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(timer);
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* Starts the timer. This sets the reference time from which all new elapsed
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* time are computed.  This does not reset the elapsed time to 0.  This is
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* useful to pause the timer.
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**/
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerStart(PTimer *timer)
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  struct itimerspec expire_time;
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  expire_time.it_value.tv_sec = TIMER_MAX_VAL; /* set a large time for the timer */
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  expire_time.it_value.tv_nsec = 0;
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return (timer_settime(timer->timer, 0, &expire_time, NULL) == 0 ?
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          ESR_SUCCESS :
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          ESR_NOT_SUPPORTED);
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* Stops the timer.
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**/
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerStop(PTimer *timer)
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  struct itimerspec remaining;
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer_gettime(timer->timer, &remaining) != 0) return ESR_NOT_SUPPORTED;
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(__vxworks)
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer_cancel(timer->timer);
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer->elapsed = (asr_uint32_t) ((TIMER_MAX_VAL - remaining.it_value.tv_sec) * SECOND2MSECOND
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project						- remaining.it_value.tv_nsec / MSECOND2NSECOND);
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* Returns the timer elapsed time.  If the Timer is in the stopped state,
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* successive calls to getElapsed() will always return the same value.  If
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* the Timer is in the started state, successive calls will return the
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* elapsed time since the last time PTimerStart() was called.
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerGetElapsed(PTimer *timer, asr_uint32_t* elapsed)
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL || elapsed == NULL)
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer->elapsed == 0) /* stop is not called */
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    struct itimerspec remaining;
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (timer_gettime(timer->timer, &remaining) != 0) return ESR_NOT_SUPPORTED;
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *elapsed = (asr_uint32_t) ((TIMER_MAX_VAL - remaining.it_value.tv_sec) * SECOND2MSECOND
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project						- remaining.it_value.tv_nsec / MSECOND2NSECOND);
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *elapsed = timer->elapsed;
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* Resets the elapsed time to 0 and resets the reference time of the Timer.
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project* This effectively reset the timer in the same state it was right after creation.
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**/
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PTimerReset(PTimer *timer)
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (timer == NULL) return ESR_INVALID_ARGUMENT;
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  timer->elapsed = 0;
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#error "Ptimer not implemented for this platform."
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
265