1/*
2 * Copyright 2009, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Bruno Albuquerque, bga@bug-br.org.br
7 */
8
9#include <OS.h>
10
11#include <sys/resource.h>
12#include <sys/wait.h>
13
14
15extern pid_t _waitpid(pid_t pid, int* _status, int options,
16		team_usage_info *usage_info);
17
18// prototypes for the compiler
19pid_t _wait3_base(int *status, int options, struct rusage *rusage);
20pid_t _wait4_base(pid_t pid, int *status, int options, struct rusage *rusage);
21pid_t _wait3_current(int *status, int options, struct rusage *rusage);
22pid_t _wait4_current(pid_t pid, int *status, int options,
23	struct rusage *rusage);
24
25
26pid_t
27_wait3_base(int *status, int options, struct rusage *rusage)
28{
29	return _wait4_base(-1, status, options, rusage);
30}
31
32
33pid_t
34_wait4_base(pid_t pid, int *status, int options, struct rusage *rusage)
35{
36	team_usage_info info;
37	pid_t waitPid = _waitpid(pid, status, options,
38		rusage != NULL ? &info : NULL);
39	if (waitPid != -1 && rusage != NULL) {
40		rusage->ru_utime.tv_sec = info.user_time / 1000000;
41		rusage->ru_utime.tv_usec = info.user_time % 1000000;
42
43		rusage->ru_stime.tv_sec = info.kernel_time / 1000000;
44		rusage->ru_stime.tv_usec = info.kernel_time % 1000000;
45	}
46
47	return waitPid;
48}
49
50
51pid_t
52_wait3_current(int *status, int options, struct rusage *rusage)
53{
54	return _wait4_current(-1, status, options, rusage);
55}
56
57
58pid_t
59_wait4_current(pid_t pid, int *status, int options, struct rusage *rusage)
60{
61	pid_t waitPid = _wait4_base(pid, status, options, rusage);
62	if (waitPid != -1 && rusage != NULL) {
63		memset(&rusage->ru_maxrss, 0, sizeof(struct rusage) -
64			offsetof(struct rusage, ru_maxrss));
65	}
66
67	return waitPid;
68}
69
70
71#define DEFINE_LIBBSD_SYMBOL_VERSION(function, symbol, version) \
72	B_DEFINE_SYMBOL_VERSION(function, symbol "LIBBSD_" version)
73
74DEFINE_LIBBSD_SYMBOL_VERSION("_wait3_base", "wait3@", "BASE");
75DEFINE_LIBBSD_SYMBOL_VERSION("_wait4_base", "wait4@", "BASE");
76DEFINE_LIBBSD_SYMBOL_VERSION("_wait3_current", "wait3@@", "1_BETA3");
77DEFINE_LIBBSD_SYMBOL_VERSION("_wait4_current", "wait4@@", "1_BETA3");
78
79