Skip to content

Commit baf1192

Browse files
committed
Add detailed Configuration reference tracking
1 parent 818ed44 commit baf1192

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

src/core/api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ MsQuicConnectionStart(
444444
goto Error;
445445
}
446446

447-
QuicConfigurationAddRef(Configuration);
447+
QuicConfigurationAddRef(Configuration, QUIC_CONF_REF_OPERATION);
448448
Oper->API_CALL.Context->Type = QUIC_API_TYPE_CONN_START;
449449
Oper->API_CALL.Context->CONN_START.Configuration = Configuration;
450450
Oper->API_CALL.Context->CONN_START.ServerName = ServerNameCopy;
@@ -543,7 +543,7 @@ MsQuicConnectionSetConfiguration(
543543
goto Error;
544544
}
545545

546-
QuicConfigurationAddRef(Configuration);
546+
QuicConfigurationAddRef(Configuration, QUIC_CONF_REF_OPERATION);
547547
Oper->API_CALL.Context->Type = QUIC_API_TYPE_CONN_SET_CONFIGURATION;
548548
Oper->API_CALL.Context->CONN_SET_CONFIGURATION.Configuration = Configuration;
549549

src/core/configuration.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ MsQuicConfigurationOpen(
8484
Configuration->ClientContext = Context;
8585
Configuration->Registration = Registration;
8686
CxPlatRefInitialize(&Configuration->RefCount);
87+
#if DEBUG
88+
Configuration->RefTypeCount[QUIC_CONF_REF_HANDLE] = 1;
89+
#endif
8790

8891
Configuration->AlpnListLength = (uint16_t)AlpnListLength;
8992
AlpnList = Configuration->AlpnList;
@@ -282,7 +285,7 @@ MsQuicConfigurationClose(
282285

283286
if (Handle != NULL && Handle->Type == QUIC_HANDLE_TYPE_CONFIGURATION) {
284287
#pragma prefast(suppress: __WARNING_25024, "Pointer cast already validated.")
285-
QuicConfigurationRelease((QUIC_CONFIGURATION*)Handle);
288+
QuicConfigurationRelease((QUIC_CONFIGURATION*)Handle, QUIC_CONF_REF_HANDLE);
286289
}
287290

288291
QuicTraceEvent(
@@ -319,7 +322,7 @@ MsQuicConfigurationLoadCredentialComplete(
319322
(HQUIC)Configuration,
320323
Configuration->ClientContext,
321324
Status);
322-
QuicConfigurationRelease(Configuration);
325+
QuicConfigurationRelease(Configuration, QUIC_CONF_REF_LOAD_CRED);
323326
}
324327
}
325328

@@ -351,7 +354,7 @@ MsQuicConfigurationLoadCredential(
351354
TlsCredFlags |= CXPLAT_TLS_CREDENTIAL_FLAG_DISABLE_RESUMPTION;
352355
}
353356

354-
QuicConfigurationAddRef(Configuration);
357+
QuicConfigurationAddRef(Configuration, QUIC_CONF_REF_LOAD_CRED);
355358

356359
Status =
357360
CxPlatTlsSecConfigCreate(
@@ -365,7 +368,7 @@ MsQuicConfigurationLoadCredential(
365368
//
366369
// Release ref for synchronous calls or asynchronous failures.
367370
//
368-
QuicConfigurationRelease(Configuration);
371+
QuicConfigurationRelease(Configuration, QUIC_CONF_REF_LOAD_CRED);
369372
}
370373
}
371374

src/core/configuration.h

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
66
--*/
77

8+
typedef enum QUIC_CONFIGURATION_REF {
9+
10+
QUIC_CONF_REF_HANDLE, // The handle provided to the app.
11+
QUIC_CONF_REF_CONNECTION, // Per connection using this Configuration.
12+
QUIC_CONF_REF_LOAD_CRED, // During async credential loading.
13+
QUIC_CONF_REF_OPERATION, // Per queued operation.
14+
15+
QUIC_CONF_REF_COUNT
16+
} QUIC_CONFIGURATION_REF;
17+
818
//
919
// Represents a set of TLS and QUIC configurations and settings.
1020
//
@@ -31,6 +41,13 @@ typedef struct QUIC_CONFIGURATION {
3141
//
3242
CXPLAT_REF_COUNT RefCount;
3343

44+
#if DEBUG
45+
//
46+
// Detailed Reference count.
47+
//
48+
uint16_t RefTypeCount[QUIC_CONF_REF_COUNT];
49+
#endif
50+
3451
//
3552
// The TLS security configurations.
3653
//
@@ -106,9 +123,15 @@ QuicConfigurationUninitialize(
106123
QUIC_INLINE
107124
void
108125
QuicConfigurationAddRef(
109-
_In_ QUIC_CONFIGURATION* Configuration
126+
_In_ QUIC_CONFIGURATION* Configuration,
127+
_In_ QUIC_CONFIGURATION_REF Ref
110128
)
111129
{
130+
#if DEBUG
131+
InterlockedIncrement16((volatile short*)&Configuration->RefTypeCount[Ref]);
132+
#else
133+
UNREFERENCED_PARAMETER(Ref);
134+
#endif
112135
CxPlatRefIncrement(&Configuration->RefCount);
113136
}
114137

@@ -118,9 +141,17 @@ QuicConfigurationAddRef(
118141
QUIC_INLINE
119142
void
120143
QuicConfigurationRelease(
121-
_In_ QUIC_CONFIGURATION* Configuration
144+
_In_ QUIC_CONFIGURATION* Configuration,
145+
_In_ QUIC_CONFIGURATION_REF Ref
122146
)
123147
{
148+
#if DEBUG
149+
CXPLAT_TEL_ASSERT(Configuration->RefTypeCount[Ref] > 0);
150+
uint16_t Result = (uint16_t)InterlockedDecrement16((volatile short*)&Configuration->RefTypeCount[Ref]);
151+
CXPLAT_TEL_ASSERT(Result != 0xFFFF);
152+
#else
153+
UNREFERENCED_PARAMETER(Ref);
154+
#endif
124155
if (CxPlatRefDecrement(&Configuration->RefCount)) {
125156
QuicConfigurationUninitialize(Configuration);
126157
}

src/core/connection.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ QuicConnFree(
383383
Silo = Connection->Configuration->Silo;
384384
QuicSiloAddRef(Silo);
385385
#endif
386-
QuicConfigurationRelease(Connection->Configuration);
386+
QuicConfigurationRelease(Connection->Configuration, QUIC_CONF_REF_CONNECTION);
387387
Connection->Configuration = NULL;
388388
}
389389
if (Connection->RemoteServerName != NULL) {
@@ -2480,7 +2480,7 @@ QuicConnSetConfiguration(
24802480
"Configuration set, %p",
24812481
Configuration);
24822482

2483-
QuicConfigurationAddRef(Configuration);
2483+
QuicConfigurationAddRef(Configuration, QUIC_CONF_REF_CONNECTION);
24842484
QuicConfigurationAttachSilo(Configuration);
24852485
Connection->Configuration = Configuration;
24862486

src/core/operation.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ QuicOperationFree(
9595
if (Oper->Type == QUIC_OPER_TYPE_API_CALL) {
9696
QUIC_API_CONTEXT* ApiCtx = Oper->API_CALL.Context;
9797
if (ApiCtx->Type == QUIC_API_TYPE_CONN_START) {
98-
QuicConfigurationRelease(ApiCtx->CONN_START.Configuration);
98+
QuicConfigurationRelease(ApiCtx->CONN_START.Configuration, QUIC_CONF_REF_OPERATION);
9999
if (ApiCtx->CONN_START.ServerName != NULL) {
100100
CXPLAT_FREE(ApiCtx->CONN_START.ServerName, QUIC_POOL_SERVERNAME);
101101
}
102102
} else if (ApiCtx->Type == QUIC_API_TYPE_CONN_SET_CONFIGURATION) {
103-
QuicConfigurationRelease(ApiCtx->CONN_SET_CONFIGURATION.Configuration);
103+
QuicConfigurationRelease(ApiCtx->CONN_SET_CONFIGURATION.Configuration, QUIC_CONF_REF_OPERATION);
104104
} else if (ApiCtx->Type == QUIC_API_TYPE_CONN_SEND_RESUMPTION_TICKET) {
105105
if (ApiCtx->CONN_SEND_RESUMPTION_TICKET.ResumptionAppData != NULL) {
106106
CXPLAT_DBG_ASSERT(ApiCtx->CONN_SEND_RESUMPTION_TICKET.AppDataLength != 0);

0 commit comments

Comments
 (0)