source: rtems/cpukit/posix/src/timergettime.c

Last change on this file was 380fb9f, checked in by Joel Sherrill <joel@…>, on 02/16/22 at 22:32:05

cpukit/posix/src/[p-z]*.c: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup POSIXAPI
7 *
8 * @brief Function Fetches State of POSIX Per-Process Timers
9 */
10
11/*
12 *  14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
13 *
14 *  COPYRIGHT (c) 1989-2008.
15 *  On-Line Applications Research Corporation (OAR).
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#ifdef HAVE_CONFIG_H
40#include "config.h"
41#endif
42
43#include <time.h>
44#include <errno.h>
45
46#include <rtems/posix/timerimpl.h>
47#include <rtems/score/todimpl.h>
48#include <rtems/score/watchdogimpl.h>
49#include <rtems/seterr.h>
50#include <rtems/timespec.h>
51
52/*
53 *          - When a timer is initialized, the value of the time in
54 *            that moment is stored.
55 *          - When this function is called, it returns the difference
56 *            between the current time and the initialization time.
57 */
58
59int timer_gettime(
60  timer_t            timerid,
61  struct itimerspec *value
62)
63{
64  POSIX_Timer_Control *ptimer;
65  ISR_lock_Context lock_context;
66  Per_CPU_Control *cpu;
67  struct timespec now;
68  struct timespec expire;
69  struct timespec result;
70
71  if ( !value )
72    rtems_set_errno_and_return_minus_one( EINVAL );
73
74  ptimer = _POSIX_Timer_Get( timerid, &lock_context );
75  if ( ptimer == NULL ) {
76    rtems_set_errno_and_return_minus_one( EINVAL );
77  }
78
79  cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
80  rtems_timespec_from_ticks( ptimer->Timer.expire, &expire );
81
82  if ( ptimer->clock_type == CLOCK_MONOTONIC ) {
83  _Timecounter_Nanouptime(&now);
84  } else  if (ptimer->clock_type == CLOCK_REALTIME) {
85    _TOD_Get(&now);
86  } else {
87    _POSIX_Timer_Release( cpu, &lock_context );
88    rtems_set_errno_and_return_minus_one( EINVAL );
89  }
90
91
92 if ( rtems_timespec_less_than( &now, &expire ) ) {
93      rtems_timespec_subtract( &now, &expire, &result );
94  } else {
95    result.tv_nsec = 0;
96    result.tv_sec  = 0;
97  }
98
99  value->it_value = result;
100  value->it_interval = ptimer->timer_data.it_interval;
101
102  _POSIX_Timer_Release( cpu, &lock_context );
103  return 0;
104}
Note: See TracBrowser for help on using the repository browser.