INITCALL1(STG_REGISTER, trace_register_source, TRACE_SOURCE);
/* Emit a CONNECTION_CLOSE with error <err>. This will interrupt all future
- * send operations.
+ * send/receive operations.
*/
static void qcc_emit_cc(struct qcc *qcc, int err)
{
TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn);
+ if (qcc->flags & QC_CF_CC_EMIT) {
+ TRACE_DEVEL("leaving on error", QMUX_EV_QCC_RECV, qcc->conn);
+ return 0;
+ }
+
qcs = qcc_get_qcs(qcc, id);
if (!qcs) {
if ((id >> QCS_ID_TYPE_SHIFT) <= qcc->strms[qcs_id_type(id)].largest_id) {
TRACE_ENTER(QMUX_EV_QCC_RECV);
+ if (qcc->flags & QC_CF_CC_EMIT) {
+ TRACE_DEVEL("leaving on error", QMUX_EV_QCC_RECV, qcc->conn);
+ return 0;
+ }
+
node = eb64_first(&qcc->streams_by_id);
while (node) {
qcs = eb64_entry(node, struct qcs, by_id);