#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# description: Generic dynamic event - add/remove fprobe events
# requires: dynamic_events "f[:[<group>/][<event>]] <func-name>[%return] [<args>]":README

echo 0 > events/enable
echo > dynamic_events

PLACE=$FUNCTION_FORK
PLACE2="kmem_cache_free"
PLACE3="schedule_timeout"

# Some functions may have BPF programs attached, therefore
# count already enabled_functions before tests start
ocnt=`cat enabled_functions | wc -l`

echo "f:myevent1 $PLACE" >> dynamic_events

echo "f:myevent2 $PLACE%return" >> dynamic_events

# add another event
echo "f:myevent3 $PLACE2" >> dynamic_events

grep -q myevent1 dynamic_events
grep -q myevent2 dynamic_events
grep -q myevent3 dynamic_events
test -d events/fprobes/myevent1
test -d events/fprobes/myevent2

echo 1 > events/fprobes/myevent1/enable
# Make sure the event is attached.
grep -q $PLACE enabled_functions
cnt=`cat enabled_functions | wc -l`
if [ $cnt -eq $ocnt ]; then
	exit_fail
fi

echo 1 > events/fprobes/myevent2/enable
cnt2=`cat enabled_functions | wc -l`

echo 1 > events/fprobes/myevent3/enable
# If the function is different, the attached function should be increased
grep -q $PLACE2 enabled_functions
cnt=`cat enabled_functions | wc -l`
if [ $cnt -eq $cnt2 ]; then
	exit_fail
fi

echo 0 > events/fprobes/myevent2/enable
echo "-:myevent2" >> dynamic_events

grep -q myevent1 dynamic_events
! grep -q myevent2 dynamic_events

echo 0 > events/fprobes/enable
echo > dynamic_events

# Should have none left
cnt=`cat enabled_functions | wc -l`
if [ $cnt -ne $ocnt ]; then
	exit_fail
fi

echo "f:myevent4 $PLACE" >> dynamic_events

echo 1 > events/fprobes/myevent4/enable
# Should only have one enabled
cnt=`cat enabled_functions | wc -l`
if [ $cnt -ne $((ocnt + 1)) ]; then
	exit_fail
fi

echo 0 > events/fprobes/enable
echo > dynamic_events

# Should have none left
cnt=`cat enabled_functions | wc -l`
if [ $cnt -ne $ocnt ]; then
	exit_fail
fi

clear_trace
