File: util_event_generator.sh

package info (click to toggle)
ltt-control 2.14.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 21,860 kB
  • sloc: cpp: 192,012; sh: 28,777; ansic: 10,960; python: 7,108; makefile: 3,520; java: 109; xml: 46
file content (221 lines) | stat: -rw-r--r-- 5,525 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#!/bin/bash
#
# SPDX-FileCopyrightText: 2020 Jonathan Rajotte-Julien <jonathan.rajotte-julien@efficios.com>
#
# SPDX-License-Identifier: LGPL-2.1-only

GENERATOR_CURDIR=$(dirname "$0")/
GENERATOR_TESTDIR=$GENERATOR_CURDIR/../../../
TESTAPP_PATH=${TESTAPP_PATH:-"$GENERATOR_TESTDIR/utils/testapp"}

SYSCALL_TESTAPP_NAME=${SYSCALL_TESTAPP_NAME:-"gen-syscall-events"}
SYSCALL_TESTAPP_BIN=${SYSCALL_TESTAPP_BIN:-"$TESTAPP_PATH/$SYSCALL_TESTAPP_NAME/$SYSCALL_TESTAPP_NAME"}

USERSPACE_PROBE_ELF_TESTAPP_NAME=${USERSPACE_PROBE_ELF_TESTAPP_NAME:-"userspace-probe-elf-binary"}
USERSPACE_PROBE_ELF_TESTAPP_BIN=${USERSPACE_PROBE_ELF_TESTAPP_BIN:-"$TESTAPP_PATH/$USERSPACE_PROBE_ELF_TESTAPP_NAME/.libs/$USERSPACE_PROBE_ELF_TESTAPP_NAME"}

# shellcheck source=../utils/utils.sh
source "$GENERATOR_TESTDIR/utils/utils.sh"

function generate_filter_events
{
	local nr=$1
	/bin/echo -n "$nr" > /proc/lttng-test-filter-event 2> /dev/null
}

function generate_syscalls
{
	local nr=$1
	shift

	for _ in $(seq 1 "$nr"); do
		# Pass /dev/null so to generate the syscall right away.
		$SYSCALL_TESTAPP_BIN /dev/null "$@"
	done
}

function userspace_probe_testapp
{
	local nr=$1
	shift 

	for _ in $(seq 1 "$nr"); do
		# This userspace probe test has to instrument the actual elf
		# binary and not the generated libtool wrapper. However, we
		# can't invoke the wrapper either since it will re-link the test
		# application binary on its first invocation, resulting in a new
		# binary with an 'lt-*' prefix under the .libs folder. The
		# relinking stage adds the .libs folder to the 'lt-*' binary's
		# rpath.
		#
		# To ensure the binary (inode) that instrumented is the same as
		# what is running, set LD_LIBRARY_PATH to find the .libs folder
		# that contains the libfoo.so library and invoke the binary
		# directly.
		LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$TESTDIR/utils/testapp/userspace-probe-elf-binary/.libs" $USERSPACE_PROBE_ELF_TESTAPP_BIN "$@"
	done
}

function ust_event_generator_toggle_state
{
	ust_event_generator_suspended=$((ust_event_generator_suspended==0))
}

function reset_generator_quit
{
	generator_quit=0
}

# Note: Only one generator can be used at a time per domain type
function ust_event_generator_run_once_per_transition
{
	# Used by the signal trap
	ust_event_generator_suspended=0
	# Used by the signal trap for SIGUSR2 to end the generator
	generator_quit=1

	local test_app=$1
	local state_file=$2
	local nr_iter=$3
	local nr_usec_wait=$4
	local run=false

	# Pass any of the remaining arguments to the generator.
	shift 4

	trap ust_event_generator_toggle_state SIGUSR1
	trap reset_generator_quit SIGUSR2

	while [ $generator_quit -ne 0  ]; do
		if [[ $ust_event_generator_suspended -eq "1" ]]; then
			touch "$state_file"
			# Reset the "run" state
			run=true
			sleep 0.5
		elif [ "$run" = true ]; then
			retry_anycpu_taskset "$test_app" -i "$nr_iter" -w "$nr_usec_wait" "$@"
			run=false;
			if [[ -f $state_file ]]; then
				rm -rf "$state_file" 2> /dev/null
			fi
		else
			# Wait for a "suspend" to reset the run state
			sleep 0.1
		fi
	done

	trap SIGUSR1
	trap SIGUSR2
}

# Note: Only one generator can be used at a time per domain type
function ust_event_generator
{
	# Used by the signal trap
	ust_event_generator_suspended=0
	# Used by the signal trap for SIGUSR2 to end the generator
	generator_quit=1

	local test_app=$1
	local state_file=$2
	local nr_iter=1000
	local nr_usec_wait=5

	# Pass any of the remaining arguments to the generator.
	shift 2

	trap ust_event_generator_toggle_state SIGUSR1
	trap reset_generator_quit SIGUSR2

	while [ $generator_quit -ne 0 ]; do
		if [[ $ust_event_generator_suspended -eq "1" ]]; then
			touch "$state_file"
			# Reset the "run" state
			sleep 0.5
		else
			retry_anycpu_taskset "$test_app" -i $nr_iter -w $nr_usec_wait "$@"
			if [[ -f $state_file ]]; then
				rm -rf "$state_file" 2> /dev/null
			fi
		fi
	done

	trap SIGUSR1
	trap SIGUSR2
}

function kernel_event_generator_toggle_state
{
	kernel_event_generator_suspended=$((kernel_event_generator_suspended==0))
}

function kernel_event_generator_run_once_per_transition
{
	# Used by the signal trap
	kernel_event_generator_suspended=0
	# Used by the signal trap for SIGUSR2 to end the generator
	generator_quit=1

	local generator=$1
	local state_file=$2
	local nr_iter=$3

	# Pass any of the remaining arguments to the generator.
	shift 3

	local run=false
	trap kernel_event_generator_toggle_state SIGUSR1
	trap reset_generator_quit SIGUSR2

	while [ $generator_quit -ne 0 ]; do
		if [[ $kernel_event_generator_suspended -eq "1" ]]; then
			touch "$state_file"
			run=true
			sleep 0.5
		elif [ "$run" = true ]; then
			$generator "$nr_iter" "$@"
			run=false
			if [[ -f $state_file ]]; then
				rm "$state_file" 2> /dev/null
			fi
		else
			# Wait for a "suspend" to reset the run state
			sleep 0.1
		fi
	done

	trap SIGUSR1
	trap SIGUSR2
}

function kernel_event_generator
{
	# Used by the signal trap
	kernel_event_generator_suspended=0
	# Used by the signal trap for SIGUSR2 to end the generator
	generator_quit=1

	local generator=$1
	local state_file=$2

	# Pass any of the remaining arguments to the generator.
	shift 2

	trap kernel_event_generator_toggle_state SIGUSR1
	trap reset_generator_quit SIGUSR2

	while [ $generator_quit -ne 0 ]; do
		if [[ $kernel_event_generator_suspended -eq "1" ]]; then
			touch "$state_file"
			sleep 0.5
		else
			$generator "10" "$@"
			if [[ -f $state_file ]]; then
				rm "$state_file" 2> /dev/null
			fi
		fi
	done

	trap SIGUSR1
	trap SIGUSR2
}