[2019-02] [marshal] Free delegates with target that are passed… (#16027)
commit0af2bb10d59b690253664a92b82abbb8d0eea8d6
authormonojenkins <jo.shields+jenkins@xamarin.com>
Mon, 5 Aug 2019 16:52:00 +0000 (5 12:52 -0400)
committerMarek Safar <marek.safar@gmail.com>
Mon, 5 Aug 2019 16:52:00 +0000 (5 18:52 +0200)
treeb8b84e39c093490349e1b36d138379be69181556
parentb34d9e48f2184385f8af46086be7ea3848249fbe
[2019-02] [marshal] Free delegates with target that are passed… (#16027)

* [marshal] Always use gchandles in delegate_hash_table

Makes the code easier to follow and it also fixes race from https://github.com/mono/mono/commit/caa4a753ca8e15d43baaa01adb0f56f374b74a2b with boehm.

* [marshal] Free delegates with target that are passed to native code.

For static method delegates, we have a unique delegate_trampoline that is shared among all delegates. We always keep alive the first static method delegate passed to native, by creating a normal gchandle to it and storing it in delegate_hash_table. For instance methods, each delegate will create a separate wrapper and these wrappers are never shared (which was wrongly assumed in https://github.com/mono/mono/commit/caa4a753ca8e15d43baaa01adb0f56f374b74a2b). We shuldn't keep the delegate alive and this commit reverts the behavior for delegate with instance methods introduced in the mentioned commit.

Fixes https://github.com/mono/mono/issues/15751
mono/metadata/marshal.c