AFAIK it's all much simpler that you think. Technically common blocks are just 
FORTRAN's slightly complicated way to declare and access global variables. They 
have nothing to do with IPC - each process is loading SOs in its own virtual 
memory, so other processes are irrelevant (the actual implementation is usually 
COW which has the same effect but is more memory-efficient -- but this doesn't 
change the semantics). The confusion may come from the fact that in Fortran 
literature "shared" has a different meaning (shared between modules of the same 
program = process) than in IPC (shared across processes).

Cheers,
Simon


On May 9, 2011, at 10:26 AM, Paul Gilbert wrote:

> Thanks to everyone that replied to this (some offline). I should have been a 
> bit clearer about my question. I did realize that it does work sometimes. My 
> worry is whether it can be expected to work reliably. In this respect, I am 
> aware of three specific reasons for concern: i/ if common data is swapped out 
> does it get swapped back in ok (e.g. the data segment does not get compressed 
> because it should be all zero or NA);  ii/ would R release memory (garbage 
> collect) between different calls to the fortran; and iii/ does another R 
> process using the same package get its own copy of the dll/.so data segment.
> 
> I have been relatively well convinced about the first two i/ swap treats this 
> as user data and preserves it (though some OSes might prevent writing to the 
> code segment); and ii/ R does not garbage collect the dll/.so so the data 
> segment is safely (or otherwise) under fortran's control.
> 
> I am less certain about the third. This seems to depend on sharing the data 
> segment of the shared object within a process but not sharing it between 
> processes. That is, each process has its own data block even though different 
> processes might or might not share the code block. Googling turned up 
> discussions about using common blocks for inter-process communications, but I 
> did not find the conclusion. It seems pretty clear that for the common block 
> to be reliable in the sense I have in mind, inter-process communication would 
> be prevented.
> 
> I am a bit concerned that the answer may be compiler and/or OS dependent.  
> This is well outside of my expertise, so assurances would be greatly 
> appreciated.
> 
> Paul
> 
>> -----Original Message-----
>> From: b.rowling...@googlemail.com [mailto:b.rowling...@googlemail.com]
>> On Behalf Of Barry Rowlingson
>> Sent: May 8, 2011 3:44 AM
>> To: Paul Gilbert
>> Cc: r-devel@r-project. org
>> Subject: Re: [Rd] fortan common block
>> 
>> On Fri, May 6, 2011 at 4:04 PM, Paul Gilbert
>> <pgilb...@bank-banque-canada.ca> wrote:
>>> Is it possible in R to call a fortran routine that sets variables in
>> a common block and expect the values to persist when a call is made
>> from R to a second routine that uses the common block?
>>> 
>>> If not (as I suspect),  is it possible to use a common block in a
>> group of routines that are used together, for as long the routines do
>> not return to R?
>> 
>> Simple test seems to confirm it. Here's some 'tran with a setter and a
>> getter:
>> 
>> comchk.f:
>> 
>>      subroutine bar(n)
>>      common /c/ i
>>      i=n
>>      end
>> 
>>      subroutine geti(j)
>>      common /c/ i
>>      j = i
>>      end
>> 
>> R CMD SHLIB comchk.f
>>> dyn.load("comchk.so")
>> 
>>> .Fortran("bar",as.integer(9))
>> [[1]]
>> [1] 9
>> 
>>> .Fortran("geti",as.integer(-1))
>> [[1]]
>> [1] 9
>> 
>> Barry
> ====================================================================================
> 
> La version française suit le texte anglais.
> 
> ------------------------------------------------------------------------------------
> 
> This email may contain privileged and/or confidential in...{{dropped:26}}
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to