Make mark thread channels show only when running
Implements support for tracking the running thread using the track API.
This commit is contained in:
parent
9da7234684
commit
d9180d950b
@ -12,6 +12,7 @@
|
|||||||
#include "pv/prv.h"
|
#include "pv/prv.h"
|
||||||
#include "pv/pvt.h"
|
#include "pv/pvt.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
|
#include "track.h"
|
||||||
#include "uthash.h"
|
#include "uthash.h"
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@ -299,14 +300,15 @@ create_thread_chan(struct ovni_mark_emu *m, struct bay *bay, struct thread *th)
|
|||||||
|
|
||||||
t->nchannels = m->ntypes;
|
t->nchannels = m->ntypes;
|
||||||
|
|
||||||
|
const char *fmt = "thread%ld.mark%ld";
|
||||||
|
|
||||||
struct mark_type *type;
|
struct mark_type *type;
|
||||||
for (type = m->types; type; type = type->hh.next) {
|
for (type = m->types; type; type = type->hh.next) {
|
||||||
/* TODO: We may use a vector of thread channels in every type to
|
/* TODO: We may use a vector of thread channels in every type to
|
||||||
* avoid the double hash access in events */
|
* avoid the double hash access in events */
|
||||||
long i = type->index;
|
long i = type->index;
|
||||||
struct chan *ch = &t->channels[i];
|
struct chan *ch = &t->channels[i];
|
||||||
chan_init(ch, type->ctype, "thread%ld.mark%ld",
|
chan_init(ch, type->ctype, fmt, th->gindex, type->type);
|
||||||
th->gindex, type->type);
|
|
||||||
|
|
||||||
if (bay_register(bay, ch) != 0) {
|
if (bay_register(bay, ch) != 0) {
|
||||||
err("bay_register failed");
|
err("bay_register failed");
|
||||||
@ -314,6 +316,24 @@ create_thread_chan(struct ovni_mark_emu *m, struct bay *bay, struct thread *th)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Setup tracking */
|
||||||
|
t->track = calloc(m->ntypes, sizeof(struct track));
|
||||||
|
if (t->track == NULL) {
|
||||||
|
err("calloc failed:");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (type = m->types; type; type = type->hh.next) {
|
||||||
|
long i = type->index;
|
||||||
|
struct track *track = &t->track[i];
|
||||||
|
/* For now only tracking to running thread is supported */
|
||||||
|
if (track_init(track, bay, TRACK_TYPE_TH, TRACK_TH_RUN,
|
||||||
|
fmt, th->gindex, type->type) != 0) {
|
||||||
|
err("track_init failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,15 +371,29 @@ connect_thread_prv(struct emu *emu, struct thread *sth, struct prv *prv)
|
|||||||
struct ovni_thread *oth = EXT(sth, 'O');
|
struct ovni_thread *oth = EXT(sth, 'O');
|
||||||
struct ovni_mark_thread *mth = &oth->mark;
|
struct ovni_mark_thread *mth = &oth->mark;
|
||||||
|
|
||||||
|
|
||||||
for (struct mark_type *type = memu->types; type; type = type->hh.next) {
|
for (struct mark_type *type = memu->types; type; type = type->hh.next) {
|
||||||
/* TODO: We may use a vector of thread channels in every type to
|
/* TODO: We may use a vector of thread channels in every type to
|
||||||
* avoid the double hash access in events */
|
* avoid the double hash access in events */
|
||||||
long i = type->index;
|
long i = type->index;
|
||||||
struct chan *ch = &mth->channels[i];
|
struct chan *ch = &mth->channels[i];
|
||||||
|
struct track *track = &mth->track[i];
|
||||||
|
struct chan *sel = &sth->chan[TH_CHAN_STATE];
|
||||||
|
|
||||||
|
/* Connect the input and sel channel to the mux */
|
||||||
|
if (track_connect_thread(track, ch, sel, 1) != 0) {
|
||||||
|
err("track_connect_thread failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then connect the output of the tracking module to the prv
|
||||||
|
* trace for the current thread */
|
||||||
|
struct chan *out = track_get_output(track);
|
||||||
long row = sth->gindex;
|
long row = sth->gindex;
|
||||||
long flags = PRV_ZERO; /* Allow zero value */
|
/* Allow zero value and skip duplicated nulls */
|
||||||
|
long flags = PRV_ZERO | PRV_SKIPDUPNULL;
|
||||||
long prvtype = type->prvtype;
|
long prvtype = type->prvtype;
|
||||||
if (prv_register(prv, row, prvtype, &emu->bay, ch, flags)) {
|
if (prv_register(prv, row, prvtype, &emu->bay, out, flags)) {
|
||||||
err("prv_register failed");
|
err("prv_register failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ struct ovni_mark_emu {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ovni_mark_thread {
|
struct ovni_mark_thread {
|
||||||
|
struct track *track;
|
||||||
struct chan *channels;
|
struct chan *channels;
|
||||||
long nchannels;
|
long nchannels;
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (c) 2021-2023 Barcelona Supercomputing Center (BSC)
|
/* Copyright (c) 2021-2024 Barcelona Supercomputing Center (BSC)
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later */
|
* SPDX-License-Identifier: GPL-3.0-or-later */
|
||||||
|
|
||||||
#ifndef TRACK_H
|
#ifndef TRACK_H
|
||||||
@ -27,8 +27,8 @@ struct track {
|
|||||||
int mode;
|
int mode;
|
||||||
char name[MAX_CHAN_NAME];
|
char name[MAX_CHAN_NAME];
|
||||||
struct bay *bay;
|
struct bay *bay;
|
||||||
struct chan ch;
|
struct chan ch; /*< Scratch channel as output when mux is used */
|
||||||
struct chan *out;
|
struct chan *out; /*< Output channel (ch or the input channel) */
|
||||||
struct mux mux;
|
struct mux mux;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user