VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTProcWait.cpp@ 102792

Last change on this file since 102792 was 99775, checked in by vboxsync, 17 months ago

*: Mark functions as static if not used outside of a given compilation unit. Enables the compiler to optimize inlining, reduces the symbol tables, exposes unused functions and in some rare cases exposes mismtaches between function declarations and definitions, but most importantly reduces the number of parfait reports for the extern-function-no-forward-declaration category. This should not result in any functional changes, bugref:3409

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1/* $Id: tstRTProcWait.cpp 99775 2023-05-12 12:21:58Z vboxsync $ */
2/** @file
3 * IPRT Testcase - RTProcWait.
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * The contents of this file may alternatively be used under the terms
26 * of the Common Development and Distribution License Version 1.0
27 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28 * in the VirtualBox distribution, in which case the provisions of the
29 * CDDL are applicable instead of those of the GPL.
30 *
31 * You may elect to license modified versions of this file under the
32 * terms and conditions of either the GPL or the CDDL or both.
33 *
34 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35 */
36
37
38/*********************************************************************************************************************************
39* Header Files *
40*********************************************************************************************************************************/
41#include <iprt/initterm.h>
42#include <iprt/process.h>
43#include <iprt/thread.h>
44#include <iprt/stream.h>
45#include <iprt/semaphore.h>
46#include <iprt/env.h>
47#include <iprt/errcore.h>
48#include <iprt/string.h>
49
50
51
52
53typedef struct SpawnerArgs
54{
55 RTPROCESS Process;
56 const char *pszExe;
57} SPAWNERARGS, *PSPAWNERARGS;
58
59
60static DECLCALLBACK(int) SpawnerThread(RTTHREAD Thread, void *pvUser)
61{
62 RT_NOREF1(Thread);
63 PSPAWNERARGS pArgs = (PSPAWNERARGS)pvUser;
64 pArgs->Process = NIL_RTPROCESS;
65 const char *apszArgs[3] = { pArgs->pszExe, "child", NULL };
66 return RTProcCreate(apszArgs[0], apszArgs, RTENV_DEFAULT, 0, &pArgs->Process);
67}
68
69
70static int DisplaySignalList(void)
71{
72 for (int iSig = 0; iSig < 128; iSig++)
73 RTPrintf("%4d: %s\n", iSig, RTProcSignalName(iSig));
74 return 0;
75}
76
77
78int main(int argc, char **argv)
79{
80 RTR3InitExe(argc, &argv, 0);
81 if (argc == 2 && !strcmp(argv[1], "child"))
82 return 42;
83 if (argc == 2 && !strcmp(argv[1], "signal-list"))
84 return DisplaySignalList();
85
86 RTPrintf("tstRTWait: spawning a child in a separate thread and waits for it in the main thread...\n");
87 RTTHREAD Thread;
88 SPAWNERARGS Args = { NIL_RTPROCESS, argv[0] };
89 int rc = RTThreadCreate(&Thread, SpawnerThread, &Args, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "SPAWNER");
90 if (RT_SUCCESS(rc))
91 {
92 /* Wait for it to complete. */
93 int rc2;
94 rc = RTThreadWait(Thread, RT_INDEFINITE_WAIT, &rc2);
95 if (RT_SUCCESS(rc))
96 rc = rc2;
97 if (RT_SUCCESS(rc))
98 {
99 /* wait for the process to complete */
100 RTPROCSTATUS Status;
101 rc = RTProcWait(Args.Process, 0, &Status);
102 if (RT_SUCCESS(rc))
103 {
104 if ( Status.enmReason == RTPROCEXITREASON_NORMAL
105 && Status.iStatus == 42)
106 RTPrintf("tstRTWait: Success!\n");
107 else
108 {
109 rc = VERR_GENERAL_FAILURE;
110 if (Status.enmReason != RTPROCEXITREASON_NORMAL)
111 RTPrintf("tstRTWait: Expected exit reason RTPROCEXITREASON_NORMAL, got %d.\n", Status.enmReason);
112 else
113 RTPrintf("tstRTWait: Expected exit status 42, got %d.\n", Status.iStatus);
114 }
115 }
116 else
117 RTPrintf("tstRTWait: RTProcWait failed with rc=%Rrc!\n", rc);
118 }
119 else
120 RTPrintf("tstRTWait: RTThreadWait or SpawnerThread failed with rc=%Rrc!\n", rc);
121 }
122 else
123 RTPrintf("tstRTWait: RTThreadCreate failed with rc=%Rrc!\n", rc);
124
125 /*
126 * Check signal names while we're here (excuse: relevant to reporting wait results).
127 */
128 for (int iSig = 0; iSig < 256; iSig++)
129 {
130 const char *pszSig = RTProcSignalName(iSig);
131 if (!RTStrStartsWith(pszSig, "SIG") || pszSig[3] == '\0')
132 {
133 RTPrintf("tstWait: error: RTProcSignalName(%d) -> '%s'\n", iSig, pszSig);
134 rc = -1;
135 }
136 }
137
138 return RT_SUCCESS(rc) ? 0 : 1;
139}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette