@@ -31,7 +31,7 @@ struct DotNetRuntimeContractDescriptor
3131
3232struct DotNetRuntimeContractDescriptorList
3333{
34- struct DotNetRuntimeContractDescriptor descriptor;
34+ const struct DotNetRuntimeContractDescriptor * descriptor;
3535 const char *runtime_name;
3636 struct DotNetRuntimeContractDescriptorList *next_runtime;
3737}
@@ -129,23 +129,30 @@ typedef _Atomic(DescPtr) AtomicDescPtr;
129129// global weak symbol
130130AtomicDescPtr __ attribute__ ((weak)) DotNetRuntimeContractDescriptor;
131131
132- static const struct DotNetRuntimeContractDescriptor g_private_descriptor = { ... }; // predefined descriptor for current runtime
132+ // predefined descriptor for current runtime
133+ static const struct DotNetRuntimeContractDescriptor g_private_descriptor = { ... };
134+
135+ // install_descriptor will try to assign the address of s_runtime_descriptor to the global symbol
136+ static struct DotNetRuntimeContractDescriptorList s_runtime_descriptor = {
137+ .descriptor = &g_private_descriptor,
138+ .runtime_name = NULL,
139+ .next_runtime = NULL
140+ };
133141
134142// to be called at startup
135143void
136144install_descriptor(const char * runtime_name)
137145{
138- DescPtr descriptor = malloc(sizeof(struct DotNetRuntimeContractDescriptorList));
139- assert (descriptor != NULL);
140- descriptor->descriptor = g_private_descriptor; // copy the constant values
146+ DescPtr descriptor = &s_runtime_descriptor;
141147 descriptor->runtime_name = runtime_name;
142148 descriptor->next_runtime = NULL;
143149
144150 DescPtr prev = atomic_load(&DotNetRuntimeContractDescriptor);
145151 do
146152 {
147153 descriptor->next_runtime = prev;
148- } while (!atomic_compare_exchange_weak(&DotNetRuntimeConctractDescriptor, &prev, descriptor));
154+ }
155+ while (!atomic_compare_exchange_weak(&DotNetRuntimeContractDescriptor, &prev, descriptor));
149156}
150157```
151158
0 commit comments