Thanks, that does indeed look dynamically linked.

Could you also paste on the ticket the contents of hR.buildinfo?

Cheers,
Tamar

Sent from my Mobile

On Mon, Mar 27, 2023, 15:18 Dominick Samperi <djsamp...@gmail.com> wrote:

> Yes, everything else stays the  same, including x <- r_NilValue.
>
> I opened a ticket here where more details are provided
> https://gitlab.haskell.org/ghc/ghc/-/issues/23183
>
> After initializing an R instance, if you fetch R_NilValue and
> peek at its value (using FFI peek) you get a bad address. But if
> you add a trace statement before the peek the address is valid.
>
> A "race condition" should not be possible in a single-threaded
> application, so I am not sure what is going on. I tried to come
> up with a simple reproducible example where a library module does
> nothing but fetch R_NilValue, and the client also uses FFI to fetch
> R_NilValue, but in this example both addresses are valid and equal.
>
>
>
>
> <http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
> Virus-free.www.avg.com
> <http://www.avg.com/email-signature?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
> <#m_7940054291392109769_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
>
> On Mon, Mar 27, 2023 at 9:48 AM Phyx <loneti...@gmail.com> wrote:
>
>> Hi,
>>
>> I'm missing some details here here as I'm having trouble following the
>> flow.
>>
>> What provides the symbol for that import? As in where does R_NilValue
>> come from? As in, how is it defined. Are you linking against a library or C
>> sources?
>>
>> When you say you replace the trace statement, do you keep the x <-
>> r_NilValue?
>>
>> The address to R_NilValue should never change during initialization so
>> I'm more suspicious of how it's declared. Unless you're linking to a symbol
>> in a shared library, in which case that could be possible due to ASLR.
>>
>> Kind regards,
>> Tamar
>>
>> Sent from my Mobile
>>
>> On Sun, Mar 26, 2023, 14:15 Dominick Samperi <djsamp...@gmail.com> wrote:
>>
>>> Thanks Ben, I'll see what I can do to reliably reproduce and open a
>>> ticket.
>>>
>>> One theory I'm investigating is that this might have something to do
>>> with my anti-virus software (AVG), since it sometimes interacts with
>>> Windows in strange ways (for example, an extra instance of a terminal
>>> app pops up, then disappears after a few seconds). But disabling this
>>> software does not seem to solve the problem.
>>>
>>> On Sat, Mar 25, 2023 at 11:18 PM Ben Gamari <b...@smart-cactus.org>
>>> wrote:
>>>
>>>> This sounds like a bug. Could you open a ticket, ideally with a fairly
>>>> standalone reproducer?
>>>>
>>>> Cheer,
>>>>
>>>> - Ben
>>>>
>>>> On March 25, 2023 6:49:09 PM EDT, Dominick Samperi <djsamp...@gmail.com>
>>>> wrote:
>>>>>
>>>>> Hello,
>>>>> FFI code that used to work now fails under Windows (still seems to work
>>>>> under Ubuntu), and I wonder if anybody has seen anything like this and
>>>>> can provide some pointers...
>>>>>
>>>>> The code uses FFI to fetch information from the R side like R_NilValue,
>>>>> using something like this;
>>>>>
>>>>> -- Fetch R's R_NilValue...
>>>>> foreign import ccall unsafe "&R_NilValue" r_NilValue_ptr :: Ptr R_EXP
>>>>> r_NilValue :: IO R_EXP
>>>>> r_NilValue = peek r_NilValue_ptr
>>>>> rNilValue1 :: IO REXP
>>>>> rNilValue1 = do
>>>>>     x <- r_NilValue
>>>>>     traceShow("addr=",x) extREXP x
>>>>>
>>>>> Under Windows the address displayed is obviously bad, and this causes
>>>>> the app to crash. This does not happen under Linux (Ubuntu).
>>>>>
>>>>> Now, replace the line containing peek with
>>>>>
>>>>> r_NilValue = trace "PEEK" peek r_NilValue_ptr
>>>>>
>>>>> The address is now valid! It seems that adding the trace "PEEK" adds
>>>>> some delay and somehow resolves the problem.
>>>>>
>>>>> This problem is intermittent, so it is hard to come up with a
>>>>> simple example that fails every time.
>>>>>
>>>>> A little background: R_NilValue is a pointer to a SEXP that is not
>>>>> initialized until an embedded instance of R is initialized, and the
>>>>> code above is not triggered until this happens. Perhaps there is
>>>>> a race condition between the time R initializes itself and Haskell
>>>>> performs the peek? I don't think R_NilValue is garbage collected
>>>>> once initialized.
>>>>>
>>>>> Any tips would be appreciated.
>>>>> Dominick
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>> ghc-devs mailing list
>>> ghc-devs@haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>>
>>
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to