Re: [PATCH] libgfortran: Fix caf tests on HP-UX

Jerry D <[email protected]> Wed, 15 Jul 2026 14:33:03 -0700
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
On 7/15/26 7:30 AM, John David Anglin wrote:
> Ping.
> 
> On 2026-06-13 10:09 a.m., John David Anglin wrote:
>> Tested on hppa64-hp-hpux11.11.
>>
>> Okay?
>>
>> Dave
>> ---

This looks OK and also answered the other question I had.

Thanks,

Jerry>>
>> libgfortran: Fix caf tests on HP-UX
>>
>> On HP-UX, shm_open parses the name argument directly through file
>> system checks.  As a result, we need a name that specifies a directory
>> with read, write and execute permisions.  This differs from linux
>> where the name specifies the shared memory object to be created or
>> opened, and the shared object is identified by a name of the form
>> /somename.
>>
>> We also limit the size of the shared objects to 1 GB on HP-UX.
>> The maximum JFS file size is 2 GB - 1 with the default nolargefiles
>> option in HP-UX 11.
>>
>> Finally, we need to compile and link tests with the -pthread option
>> to ensure they are linked against libpthread.
>>
>> 2026-06-13  John David Anglin  <[email protected]>
>>
>> libgfortran/ChangeLog:
>>
>> 	* caf/shmem/shared_memory.c (SHM_NAME_FMTD, SHM_NAME_FMTS): Define.
>> 	(shared_memory_init) Use SHM_NAME_FMTD format to generate
>> 	shm_name.
>> 	(shared_memory_cleanup): Use SHM_NAME_FMTS to generate shm_name.
>> 	* caf/shmem/supervisor.c (get_memory_size_from_envvar): Use
>> 	1 GB on 64-bit Windows and HP-UX.
>>
>> gcc/testsuite/ChangeLog:
>>
>> 	* gfortran.dg/coarray/caf.exp: Run test with -pthread option.
>>
>> diff --git a/gcc/testsuite/gfortran.dg/coarray/caf.exp b/gcc/testsuite/gfortran.dg/coarray/caf.exp
>> index bb4fb53050e..59aa9d6150e 100644
>> --- a/gcc/testsuite/gfortran.dg/coarray/caf.exp
>> +++ b/gcc/testsuite/gfortran.dg/coarray/caf.exp
>> @@ -120,7 +120,7 @@ foreach test [lsort [glob -nocomplain $srcdir/$subdir/*.\[fF\]{,90,95,03,08} ]]
>>           foreach flags $option_list {
>>               verbose "Testing $nshort (libcaf_shmem), $flags" 1
>>               set gfortran_aux_module_flags "-fcoarray=lib $flags -lcaf_shmem"
>> -            if { [istarget *-*-freebsd*] } {
>> +            if { [istarget *-*-freebsd*] || [istarget *-*-hpux*] } {
>>                   dg-test $test "-fcoarray=lib -pthread $flags -lcaf_shmem" {}
>>               } else {
>>                   if { [istarget *-linux*] } {
>> diff --git a/libgfortran/caf/shmem/shared_memory.c b/libgfortran/caf/shmem/shared_memory.c
>> index a42b0963697..6cf0c80eeb6 100644
>> --- a/libgfortran/caf/shmem/shared_memory.c
>> +++ b/libgfortran/caf/shmem/shared_memory.c
>> @@ -122,6 +122,17 @@ shared_memory_prepare (shared_memory_act *)
>>     asm volatile ("" ::: "memory");
>>   }
>>   
>> +#if defined(__hpux__)
>> +/* On HP-UX, shm_open parses the name argument directly through file
>> +   system checks.  We need to provide a file path inside a globally
>> +   writeable directory.  */
>> +#define SHM_NAME_FMTD "/tmp/gfor-shm-%d"
>> +#define SHM_NAME_FMTS "/tmp/gfor-shm-%s"
>> +#else
>> +#define SHM_NAME_FMTD "/gfor-shm-%d"
>> +#define SHM_NAME_FMTS "/gfor-shm-%s"
>> +#endif
>> +
>>   #define SHM_NAME_MAX 255
>>   
>>   /* Initialize the memory with one page, the shared metadata of the
>> @@ -140,7 +151,7 @@ shared_memory_init (shared_memory_act *mem, size_t size)
>>         int n = sscanf (env_val, "%d", &ppid);
>>         assert (n == 1);
>>       }
>> -  snprintf (shm_name, SHM_NAME_MAX, "/gfor-shm-%d", ppid);
>> +  snprintf (shm_name, SHM_NAME_MAX, SHM_NAME_FMTD, ppid);
>>     if (base)
>>       {
>>         int n = sscanf (base, "%p", &base_ptr);
>> @@ -286,7 +297,8 @@ shared_memory_cleanup (shared_memory_act *mem)
>>       {
>>         char shm_name[SHM_NAME_MAX];
>>   
>> -      snprintf (shm_name, SHM_NAME_MAX, "/gfor-shm-%s", shared_memory_get_env ());
>> +      snprintf (shm_name, SHM_NAME_MAX, SHM_NAME_FMTS,
>> +		shared_memory_get_env ());
>>         /* Only the supervisor is to delete the shm-file.  */
>>         res = shm_unlink (shm_name);
>>         if (res == -1)
>> diff --git a/libgfortran/caf/shmem/supervisor.c b/libgfortran/caf/shmem/supervisor.c
>> index aa692a6551d..0836b89d99f 100644
>> --- a/libgfortran/caf/shmem/supervisor.c
>> +++ b/libgfortran/caf/shmem/supervisor.c
>> @@ -134,11 +134,11 @@ get_memory_size_from_envvar (void)
>>         if (sizeof (size_t) == 4)
>>   	sz = ((size_t) 1) << 28;
>>         else
>> -#ifndef WIN32
>> -	sz = ((size_t) 1) << 34;
>> -#else
>> -	/* Use 1GB on Windows.  */
>> +#if defined(WIN32) || defined(__hpux__)
>> +	/* Use 1GB on Windows and HP-UX.  */
>>   	sz = ((size_t) 1) << 30;
>> +#else
>> +	sz = ((size_t) 1) << 34;
>>   #endif
>>       }
>>     return sz;
> 
>