| Each image is its own process, that is forked from the master process at the | |
| start of the program. The number of images is determined by the environment | |
| variable GFORTRAN_NUM_IMAGES or, alternatively, the number of processors. | |
| Each coarray is identified by its address. Since coarrays always behave as if | |
| they had the SAVE attribute, this works even for allocatable coarrays. ASLR is | |
| not an issue, since the addresses are assigned at startup and remain valid over | |
| forks. If, on two different images, the allocation function is called with the | |
| same descriptor address, the same piece of memory is allocated. | |
| Internally, the allocator (alloc.c) uses a shared hashmap (hashmap.c) to | |
| remember with which ids pieces of memory allocated. If a new piece of memory is | |
| needed, a simple relatively allocator (allocator.c) is used. If the allocator | |
| doesn't hold any previously free()d memory, it requests it from the shared | |
| memory object (shared_memory.c), which also handles the translation of | |
| shared_mem_ptr's to pointers in the address space of the image. At the moment | |
| shared_memory relies on double-mapping pages for this (which might restrict the | |
| architectures on which this will work, I have tested this on x86 and POWER), | |
| but since any piece of memory should only be written to through one address | |
| within one alloc/free pair, it shouldn't matter that much performance-wise. | |
| The entry points in the library with the exception of master are defined in | |
| wrapper.c, master(), the function handling launching the images, is defined in | |
| coarraynative.c, and the other files shouldn't require much explanation. | |
| To compile a program to run with native coarrays, compile with -fcoarray=shared | |
| -lcaf_shared -lrt (I've not yet figured out how to automagically link against | |
| the library if -fcoarray=shared is specified). | |
| TODO (the list is probably incomplete): | |
| - make STAT and ERRMSG work for ALLOCATE, DEALLOCATE, SYNC and locks | |
| - Teams | |
| - Types containing allocatable components in coarrays | |
| - Events | |
| - MOVE_ALLOC | |
| - automatic linking of relevant libraries with -fcoarray=shared |