Skip to content

Commit 4d61fbe

Browse files
committed
Use cross refs args directly in more places
1 parent bbd813b commit 4d61fbe

14 files changed

+57
-87
lines changed

src/coreclr/gc/env/gcenv.ee.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class GCToEEInterface
3939
// Promote refcounted handle callback
4040
static bool RefCountedHandleCallbacks(Object * pObject);
4141

42-
static void TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs);
42+
static void TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args);
4343

4444
// Sync block cache management
4545
static void SyncBlockCacheWeakPtrScan(HANDLESCANPROC scanProc, uintptr_t lp1, uintptr_t lp2);

src/coreclr/gc/env/gctoeeinterface.standalone.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ namespace standalone
4949
return ::GCToEEInterface::RefCountedHandleCallbacks(pObject);
5050
}
5151

52-
void TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs)
52+
void TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args)
5353
{
54-
return ::GCToEEInterface::TriggerClientBridgeProcessing(sccsLen, sccs, ccrsLen, ccrs);
54+
return ::GCToEEInterface::TriggerClientBridgeProcessing(args);
5555
}
5656

5757
void SyncBlockCacheWeakPtrScan(HANDLESCANPROC scanProc, uintptr_t lp1, uintptr_t lp2)

src/coreclr/gc/gcbridge.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,7 @@ static bool tarjan_scc_algorithm ()
11691169
return true;
11701170
}
11711171

1172-
static void build_scc_callback_data (BridgeProcessorResult *bp_res)
1172+
static MarkCrossReferencesArgs* build_scc_callback_data ()
11731173
{
11741174
ColorBucket *cur;
11751175
int j;
@@ -1279,24 +1279,19 @@ static void build_scc_callback_data (BridgeProcessorResult *bp_res)
12791279
printf("\t%ld -> %ld\n", api_xrefs[i].SourceGroupIndex, api_xrefs[i].DestinationGroupIndex);
12801280
#endif
12811281

1282-
bp_res->sccsLen = num_sccs;
1283-
bp_res->sccs = api_sccs;
1284-
bp_res->ccrsLen = xref_count;
1285-
bp_res->ccrs = api_xrefs;
1282+
return new (nothrow) MarkCrossReferencesArgs(num_sccs, api_sccs, xref_count, api_xrefs);
12861283
}
12871284

1288-
BridgeProcessorResult ProcessBridgeObjects()
1285+
MarkCrossReferencesArgs* ProcessBridgeObjects()
12891286
{
1290-
BridgeProcessorResult bp_res = { 0 };
1291-
12921287
if (!tarjan_scc_algorithm())
1293-
return bp_res;
1288+
return NULL;
12941289

1295-
build_scc_callback_data(&bp_res);
1290+
MarkCrossReferencesArgs* args = build_scc_callback_data();
12961291

12971292
reset_objects_header();
12981293

12991294
bridge_finish();
13001295

1301-
return bp_res;
1296+
return args;
13021297
}

src/coreclr/gc/gcbridge.h

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,8 @@
88
#include "common.h"
99
#include "gcinterface.h"
1010

11-
struct BridgeProcessorResult
12-
{
13-
int sccsLen;
14-
StronglyConnectedComponent *sccs;
15-
16-
int ccrsLen;
17-
ComponentCrossReference *ccrs;
18-
};
19-
2011
void BridgeResetData();
21-
BridgeProcessorResult ProcessBridgeObjects();
12+
MarkCrossReferencesArgs* ProcessBridgeObjects();
2213

2314
void RegisterBridgeObject(Object *object, uintptr_t context);
2415
uint8_t** GetRegisteredBridges(size_t *pNumBridges);

src/coreclr/gc/gcenv.ee.standalone.inl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ inline bool GCToEEInterface::RefCountedHandleCallbacks(Object * pObject)
7272
return g_theGCToCLR->RefCountedHandleCallbacks(pObject);
7373
}
7474

75-
inline void GCToEEInterface::TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs)
75+
inline void GCToEEInterface::TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args)
7676
{
7777
assert(g_theGCToCLR != nullptr);
78-
return g_theGCToCLR->TriggerClientBridgeProcessing(sccsLen, sccs, ccrsLen, ccrs);
78+
return g_theGCToCLR->TriggerClientBridgeProcessing(args);
7979
}
8080

8181
inline void GCToEEInterface::SyncBlockCacheWeakPtrScan(HANDLESCANPROC scanProc, uintptr_t lp1, uintptr_t lp2)

src/coreclr/gc/gcinterface.ee.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class IGCToCLR {
240240
bool RefCountedHandleCallbacks(Object * pObject) PURE_VIRTUAL
241241

242242
virtual
243-
void TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs) PURE_VIRTUAL
243+
void TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args) PURE_VIRTUAL
244244

245245
// Performs a weak pointer scan of the sync block cache.
246246
virtual

src/coreclr/gc/gcinterface.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,24 @@ struct ComponentCrossReference
156156
size_t DestinationGroupIndex;
157157
};
158158

159-
struct MarkCrossReferences
159+
struct MarkCrossReferencesArgs
160160
{
161161
size_t ComponentCount;
162162
StronglyConnectedComponent* Components;
163163
size_t CrossReferenceCount;
164164
ComponentCrossReference* CrossReferences;
165+
166+
MarkCrossReferencesArgs(
167+
size_t ComponentCount,
168+
StronglyConnectedComponent* Components,
169+
size_t CrossReferenceCount,
170+
ComponentCrossReference* CrossReferences)
171+
{
172+
this->ComponentCount = ComponentCount;
173+
this->Components = Components;
174+
this->CrossReferenceCount = CrossReferenceCount;
175+
this->CrossReferences = CrossReferences;
176+
}
165177
};
166178

167179

src/coreclr/gc/objecthandle.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,9 +1624,12 @@ uint8_t** Ref_ScanBridgeObjects(uint32_t condemned, uint32_t maxgen, ScanContext
16241624
}
16251625

16261626
// The callee here will free the allocated memory.
1627-
BridgeProcessorResult bpResult = ProcessBridgeObjects();
1627+
MarkCrossReferencesArgs *args = ProcessBridgeObjects();
16281628

1629-
GCToEEInterface::TriggerClientBridgeProcessing(bpResult.sccsLen, bpResult.sccs, bpResult.ccrsLen, bpResult.ccrs);
1629+
if (args != NULL)
1630+
{
1631+
GCToEEInterface::TriggerClientBridgeProcessing(args);
1632+
}
16301633

16311634
return GetRegisteredBridges(numObjs);
16321635
}

src/coreclr/gc/sample/gcenv.ee.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ bool GCToEEInterface::RefCountedHandleCallbacks(Object * pObject)
164164
return false;
165165
}
166166

167-
void GCToEEInterface::TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs)
167+
void GCToEEInterface::TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args)
168168
{
169169
}
170170

src/coreclr/vm/gcenv.ee.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ bool GCToEEInterface::RefCountedHandleCallbacks(Object * pObject)
402402
return false;
403403
}
404404

405-
void GCToEEInterface::TriggerClientBridgeProcessing(size_t sccsLen, StronglyConnectedComponent* sccs, size_t ccrsLen, ComponentCrossReference* ccrs)
405+
void GCToEEInterface::TriggerClientBridgeProcessing(MarkCrossReferencesArgs* args)
406406
{
407407
CONTRACTL
408408
{
@@ -412,7 +412,7 @@ void GCToEEInterface::TriggerClientBridgeProcessing(size_t sccsLen, StronglyConn
412412
CONTRACTL_END;
413413

414414
#ifdef FEATURE_GCBRIDGE
415-
Interop::TriggerClientBridgeProcessing(sccsLen, sccs, ccrsLen, ccrs);
415+
Interop::TriggerClientBridgeProcessing(args);
416416
#endif // FEATURE_GCBRIDGE
417417
}
418418

src/coreclr/vm/interoplibinterface.h

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,7 @@ class JavaNative
7373
{
7474
public: // GC interaction
7575
static bool TriggerClientBridgeProcessing(
76-
_In_ size_t sccsLen,
77-
_In_ StronglyConnectedComponent* sccs,
78-
_In_ size_t ccrsLen,
79-
_In_ ComponentCrossReference* ccrs);
76+
_In_ MarkCrossReferencesArgs* args);
8077
};
8178

8279
extern "C" BOOL QCALLTYPE JavaMarshal_Initialize(
@@ -87,7 +84,7 @@ extern "C" void* QCALLTYPE JavaMarshal_CreateReferenceTrackingHandle(
8784
_In_ void* context);
8885

8986
extern "C" void QCALLTYPE JavaMarshal_FinishCrossReferenceProcessing(
90-
_In_ MarkCrossReferences *crossReferences,
87+
_In_ MarkCrossReferencesArgs *crossReferences,
9188
_In_ int length,
9289
_In_ void* unreachableObjectHandles);
9390

@@ -133,13 +130,10 @@ class Interop
133130
static void WaitForGCBridgeFinish();
134131

135132
static void TriggerClientBridgeProcessing(
136-
_In_ size_t sccsLen,
137-
_In_ StronglyConnectedComponent* sccs,
138-
_In_ size_t ccrsLen,
139-
_In_ ComponentCrossReference* ccrs);
133+
_In_ MarkCrossReferencesArgs* args);
140134

141135
static void FinishCrossReferenceProcessing(
142-
_In_ MarkCrossReferences *crossReferences,
136+
_In_ MarkCrossReferencesArgs *crossReferences,
143137
_In_ int length,
144138
_In_ void* unreachableObjectHandles);
145139

src/coreclr/vm/interoplibinterface_java.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include "interoplibinterface.h"
1313

14-
using CrossreferenceHandleCallback = void(STDMETHODCALLTYPE *)(MarkCrossReferences*);
14+
using CrossreferenceHandleCallback = void(STDMETHODCALLTYPE *)(MarkCrossReferencesArgs*);
1515

1616
namespace
1717
{
@@ -65,7 +65,7 @@ extern "C" void* QCALLTYPE JavaMarshal_CreateReferenceTrackingHandle(
6565
}
6666

6767
extern "C" void QCALLTYPE JavaMarshal_FinishCrossReferenceProcessing(
68-
_In_ MarkCrossReferences *crossReferences,
68+
_In_ MarkCrossReferencesArgs *crossReferences,
6969
_In_ int length,
7070
_In_ void* unreachableObjectHandles)
7171
{
@@ -97,10 +97,7 @@ extern "C" BOOL QCALLTYPE JavaMarshal_GetContext(
9797
}
9898

9999
bool JavaNative::TriggerClientBridgeProcessing(
100-
_In_ size_t sccsLen,
101-
_In_ StronglyConnectedComponent* sccs,
102-
_In_ size_t ccrsLen,
103-
_In_ ComponentCrossReference* ccrs)
100+
_In_ MarkCrossReferencesArgs *args)
104101
{
105102
CONTRACTL
106103
{
@@ -113,13 +110,7 @@ bool JavaNative::TriggerClientBridgeProcessing(
113110
if (g_MarkCrossReferences == NULL)
114111
return false;
115112

116-
MarkCrossReferences arg;
117-
arg.ComponentCount = sccsLen;
118-
arg.Components = sccs;
119-
arg.CrossReferenceCount = ccrsLen;
120-
arg.CrossReferences = ccrs;
121-
122-
g_MarkCrossReferences(&arg);
113+
g_MarkCrossReferences(args);
123114
return true;
124115
}
125116

src/coreclr/vm/interoplibinterface_shared.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,7 @@ namespace
163163
CLREvent* g_bridgeFinished = nullptr;
164164

165165
void ReleaseGCBridgeArgumentsWorker(
166-
_In_ size_t sccsLen,
167-
_In_ StronglyConnectedComponent* sccs,
168-
_In_ ComponentCrossReference* ccrs)
166+
_In_ MarkCrossReferencesArgs* args)
169167
{
170168
CONTRACTL
171169
{
@@ -178,12 +176,13 @@ namespace
178176
// See callers of GCToEEInterface::TriggerGCBridge().
179177

180178
// Free memory in each of the SCCs
181-
for (size_t i = 0; i < sccsLen; i++)
179+
for (size_t i = 0; i < args->ComponentCount; i++)
182180
{
183-
free(sccs[i].Context);
181+
free(args->Components[i].Context);
184182
}
185-
free(sccs);
186-
free(ccrs);
183+
free(args->Components);
184+
free(args->CrossReferences);
185+
free(args);
187186
}
188187
}
189188

@@ -213,10 +212,7 @@ void Interop::WaitForGCBridgeFinish()
213212
}
214213

215214
void Interop::TriggerClientBridgeProcessing(
216-
_In_ size_t sccsLen,
217-
_In_ StronglyConnectedComponent* sccs,
218-
_In_ size_t ccrsLen,
219-
_In_ ComponentCrossReference* ccrs)
215+
_In_ MarkCrossReferencesArgs* args)
220216
{
221217
CONTRACTL
222218
{
@@ -229,21 +225,21 @@ void Interop::TriggerClientBridgeProcessing(
229225
{
230226
// Release the memory allocated since the GCBridge
231227
// is already running and we're not passing them to it.
232-
ReleaseGCBridgeArgumentsWorker(sccsLen, sccs, ccrs);
228+
ReleaseGCBridgeArgumentsWorker(args);
233229
return;
234230
}
235231

236232
bool gcBridgeTriggered = false;
237233

238234
#ifdef FEATURE_JAVAMARSHAL
239-
gcBridgeTriggered = JavaNative::TriggerClientBridgeProcessing(sccsLen, sccs, ccrsLen, ccrs);
235+
gcBridgeTriggered = JavaNative::TriggerClientBridgeProcessing(args);
240236
#endif // FEATURE_JAVAMARSHAL
241237

242238
if (!gcBridgeTriggered)
243239
{
244240
// Release the memory allocated since the GCBridge
245241
// wasn't trigger for some reason.
246-
ReleaseGCBridgeArgumentsWorker(sccsLen, sccs, ccrs);
242+
ReleaseGCBridgeArgumentsWorker(args);
247243
return;
248244
}
249245

@@ -263,7 +259,7 @@ void Interop::TriggerClientBridgeProcessing(
263259
}
264260

265261
void Interop::FinishCrossReferenceProcessing(
266-
_In_ MarkCrossReferences *crossReferences,
262+
_In_ MarkCrossReferencesArgs *args,
267263
_In_ int length,
268264
_In_ void* unreachableObjectHandles)
269265
{
@@ -285,7 +281,7 @@ void Interop::FinishCrossReferenceProcessing(
285281
g_bridgeFinished->Set();
286282
}
287283

288-
ReleaseGCBridgeArgumentsWorker(crossReferences->ComponentCount, crossReferences->Components, crossReferences->CrossReferences);
284+
ReleaseGCBridgeArgumentsWorker(args);
289285
}
290286

291287
#endif // FEATURE_GCBRIDGE

src/tests/Interop/GCBridge/GCBridgeNative.cpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ struct MarkCrossReferencesArgs
2626

2727
typedef void (*MarkCrossReferencesFtn)(MarkCrossReferencesArgs*);
2828

29-
static size_t g_sccsLen;
30-
static StronglyConnectedComponent* g_sccs;
31-
static size_t g_ccrsLen;
32-
static ComponentCrossReference* g_ccrs;
29+
static MarkCrossReferencesArgs *markCrossRefsArgs;
3330

3431
MarkCrossReferencesFtn g_bpFinishCallback;
3532

@@ -42,21 +39,12 @@ static void BPFinish()
4239

4340
// A real callback would also receive the set of unreachable
4441
// bridge objects so the gchandles for them are freed
45-
MarkCrossReferencesArgs crossRefs;
46-
crossRefs.Components = g_sccs;
47-
crossRefs.ComponentCount = g_sccsLen;
48-
crossRefs.CrossReferences = g_ccrs;
49-
crossRefs.CrossReferenceCount = g_ccrsLen;
50-
51-
g_bpFinishCallback(&crossRefs);
42+
g_bpFinishCallback(markCrossRefsArgs);
5243
}
5344

5445
static void MarkCrossReferences(MarkCrossReferencesArgs* crossRefs)
5546
{
56-
g_sccsLen = crossRefs->ComponentCount;
57-
g_sccs = crossRefs->Components;
58-
g_ccrsLen = crossRefs->CrossReferenceCount;
59-
g_ccrs = crossRefs->CrossReferences;
47+
markCrossRefsArgs = crossRefs;
6048

6149
std::thread thr(BPFinish);
6250
thr.detach();

0 commit comments

Comments
 (0)