ovni/test/emu/nanos6/delayed-connect-ss.c
Rodrigo Arias 354f2f50eb Register emulation models only if required
Until now, emulation models were always being registered via probe(),
which causes the emulator to initialize all the channels. To reduce the
overhead, the channels were not connected or registered in the bay
until the first event of that model was received. This delayed connect
was causing issues in muxes where the newly connected model required
refreshing the touched channels. Which in turn was causing unexpected
PRV events.

By determining which models we need to enable, we can remove the delayed
connect mechanism and just enable those models at initialization time,
and connect the channels.
2023-11-16 12:39:05 +01:00

54 lines
1.4 KiB
C

/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
* SPDX-License-Identifier: GPL-3.0-or-later */
#include <stdint.h>
#include <stdio.h>
#include "common.h"
#include "emu_prv.h"
#include "instr.h"
#include "instr_nanos6.h"
#include "nanos6/nanos6_priv.h"
int
main(void)
{
instr_start(0, 1);
instr_nanos6_init();
/* Until here, the nanos6 model has not been connected to the
* patchbay yet. The next event will cause the subsystem mux to
* be connected to the patchbay. We need to ensure that at that
* moment the select channel is evaluated, otherwise the mux
* will remain selecting a null input until the thread state
* changes. */
instr_nanos6_worker_loop_enter();
/* Match the PRV line in the trace */
FILE *f = fopen("match.sh", "w");
if (f == NULL)
die("fopen failed:");
/* Ensure that after the Nanos6 connect phase, the CPU subsystem mux has
* selected the correct input, based on the running thread */
int type = PRV_NANOS6_SUBSYSTEM;
int64_t t = get_delta();
int value = ST_WORKER_LOOP;
fprintf(f, "grep ':%ld:%d:%d$' ovni/thread.prv\n", t, type, value);
fprintf(f, "grep ':%ld:%d:%d$' ovni/cpu.prv\n", t, type, value);
instr_nanos6_worker_loop_exit();
/* Also test when exitting the stacked subsystem */
t = get_delta();
value = 0;
fprintf(f, "grep ':%ld:%d:%d$' ovni/thread.prv\n", t, type, value);
fprintf(f, "grep ':%ld:%d:%d$' ovni/cpu.prv\n", t, type, value);
fclose(f);
instr_end();
return 0;
}