/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġruntime . memory . stable _ ref _ cross _ thread _ check Ċ Ċ import Ġkotlin . test .* Ċ Ċ import Ġkotlin . native . concurrent .* Ċ import Ġkotlinx . c interop .* Ċ Ċ class ĠH older ( val Ġvalue : ĠInt ) Ċ Ċ @ Test Ċ fun Ġrun Test 1 () Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . start () ĊĊĠĠĠ Ġval Ġfuture Ġ= Ġworker . execute ( Transfer Mode . SAFE , Ġ{ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ ĠSt able Ref . create ( Holder ( 4 2 )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġref Ġ= Ġfuture . result ĊĠĠĠ Ġif Ġ( kotlin . native . Platform . memory Model Ġ== Ġkotlin . native . Memory Model . EXPERIMENT AL ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġref . get () ĊĠĠĠĠĠĠĠ ĠassertEquals ( value . value , Ġ 4 2 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < Incorrect Dere ference Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġref . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( value . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġworker . request Termination (). result Ċ } Ċ Ċ @ Test Ċ fun Ġrun Test 2 () Ġ{ ĊĠĠĠ Ġval Ġworker Ġ= ĠWorker . start () ĊĊĠĠĠ Ġval Ġmain Thread Ref Ġ= ĠSt able Ref . create ( Holder ( 4 2 )) ĊĠĠĠ Ġ// ĠSim ulate Ġthis Ġgoing Ġthrough Ġinter op Ġas Ġraw ĠC Ġpointer . ĊĠĠĠ Ġval Ġpointer Value : ĠLong Ġ= Ġmain Thread Ref . as CP o inter (). to Long () ĊĠĠĠ Ġval Ġfuture Ġ= Ġworker . execute ( Transfer Mode . SAFE , Ġ{ Ġpointer Value Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpointer : ĠCO pa que Pointer Ġ= Ġit . to CP o inter () !! ĊĠĠĠĠĠĠĠ Ġif Ġ( kotlin . native . Platform . memory Model Ġ== Ġkotlin . native . Memory Model . EXPERIMENT AL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Thread Ref : ĠSt able Ref < Holder > Ġ= Ġpointer . as Stable Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( other Thread Ref . get (). value , Ġ 4 2 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With < Incorrect Dere ference Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEven Ġattempting Ġto Ġconvert Ġa Ġpointer Ġto ĠSt able Ref Ġshould Ġfail . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Thread Ref : ĠSt able Ref < Holder > Ġ= Ġpointer . as Stable Ref () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( other Thread Ref . get (). value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĠĠĠ Ġfuture . result ĊĊĠĠĠ Ġworker . request Termination (). result Ċ } Ċ