1 /*
2 * Copyright (c) 2004, Bull S.A.. All rights reserved.
3 * Created by: Sebastien Decugis
4
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it would be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
17 * This sample test aims to check the following assertion:
18 *
19 * The CPU-time clock of the new process/ new process's thread is initialized to 0.
20
21 * The steps are:
22 * -> compute until the parent process CPU-time clock is greater than 1 sec.
23 * -> fork
24 * -> check the child process process CPU time and thread CPU time clocks.
25
26 * The test fails if any of these clocks are > 1sec.
27
28 */
29
30 #include <pthread.h>
31 #include <stdarg.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <unistd.h>
36
37 #include <sys/wait.h>
38 #include <errno.h>
39
40 #include <time.h>
41
42 #include "../testfrmw/testfrmw.h"
43 #include "../testfrmw/testfrmw.c"
44
45 #ifndef VERBOSE
46 #define VERBOSE 1
47 #endif
48
main(void)49 int main(void)
50 {
51 int ret, status;
52 pid_t child, ctl;
53
54 long ctp, ctt;
55 clockid_t clp, clt;
56
57 struct timespec tp;
58
59 output_init();
60
61 ctp = sysconf(_SC_CPUTIME);
62 ctt = sysconf(_SC_THREAD_CPUTIME);
63
64 if ((ctp == -1) && (ctt == -1)) {
65 UNTESTED
66 ("The testcase needs CPUTIME or THREAD_CPUTIME support");
67 }
68 #if VERBOSE > 0
69 output("System abilities:\n");
70
71 output(" _POSIX_CPUTIME : %ld\n", ctp);
72
73 output(" _POSIX_THREAD_CPUTIME : %ld\n", ctt);
74
75 #endif
76 if (ctp > 0) {
77 ret = clock_getcpuclockid(0, &clp);
78
79 if (ret != 0) {
80 UNRESOLVED(ret,
81 "Unable to get cpu-time clock id of the process");
82 }
83
84 do {
85 ret = clock_gettime(clp, &tp);
86
87 if (ret != 0) {
88 UNRESOLVED(errno,
89 "Failed to read CPU time clock");
90 }
91 }
92 while (tp.tv_sec < 1);
93 }
94
95 if (ctt > 0) {
96 ret = pthread_getcpuclockid(pthread_self(), &clt);
97
98 if (ret != 0) {
99 UNRESOLVED(ret,
100 "Unable to get cpu-time clock id of the thread");
101 }
102
103 do {
104 ret = clock_gettime(clt, &tp);
105
106 if (ret != 0) {
107 UNRESOLVED(errno,
108 "Failed to read thread CPU time clock");
109 }
110 }
111 while (tp.tv_sec < 1);
112 }
113
114 /* Create the child */
115 child = fork();
116
117 if (child == -1) {
118 UNRESOLVED(errno, "Failed to fork");
119 }
120
121 /* child */
122 if (child == 0) {
123 if (ctp > 0) {
124 ret = clock_getcpuclockid(0, &clp);
125
126 if (ret != 0) {
127 UNRESOLVED(ret,
128 "Unable to get cpu-time clock id of the process");
129 }
130
131 ret = clock_gettime(clp, &tp);
132
133 if (ret != 0) {
134 UNRESOLVED(errno,
135 "Failed to read CPU time clock");
136 }
137
138 if (tp.tv_sec > 0) {
139 FAILED
140 ("The process CPU-time clock was not reset in child\n");
141 }
142 }
143
144 if (ctt > 0) {
145 ret = pthread_getcpuclockid(pthread_self(), &clt);
146
147 if (ret != 0) {
148 UNRESOLVED(ret,
149 "Unable to get cpu-time clock id of the thread");
150 }
151
152 ret = clock_gettime(clt, &tp);
153
154 if (ret != 0) {
155 UNRESOLVED(errno,
156 "Failed to read thread CPU time clock");
157 }
158
159 if (tp.tv_sec > 0) {
160 FAILED
161 ("The thread CPU-time clock was not reset in child\n");
162 }
163 }
164
165 exit(PTS_PASS);
166 }
167
168 /* Parent joins the child */
169 ctl = waitpid(child, &status, 0);
170
171 if (ctl != child) {
172 UNRESOLVED(errno, "Waitpid returned the wrong PID");
173 }
174
175 if (!WIFEXITED(status) || (WEXITSTATUS(status) != PTS_PASS)) {
176 FAILED("Child exited abnormally");
177 }
178
179 #if VERBOSE > 0
180 output("Test passed\n");
181 #endif
182 PASSED;
183 }
184