@@ -6717,6 +6717,8 @@ static inline char *__kmp_reg_status_name() {
6717
6717
} // __kmp_reg_status_get
6718
6718
6719
6719
#if defined(KMP_USE_SHM)
6720
+ bool __kmp_shm_available = false ;
6721
+ bool __kmp_tmp_available = false ;
6720
6722
// If /dev/shm is not accessible, we will create a temporary file under /tmp.
6721
6723
char *temp_reg_status_file_name = nullptr ;
6722
6724
#endif
@@ -6746,60 +6748,108 @@ void __kmp_register_library_startup(void) {
6746
6748
char *value = NULL ; // Actual value of the environment variable.
6747
6749
6748
6750
#if defined(KMP_USE_SHM)
6749
- char *shm_name = __kmp_str_format (" /%s" , name);
6750
- int shm_preexist = 0 ;
6751
- char *data1;
6752
- int fd1 = shm_open (shm_name, O_CREAT | O_EXCL | O_RDWR, 0666 );
6753
- if ((fd1 == -1 ) && (errno == EEXIST)) {
6754
- // file didn't open because it already exists.
6755
- // try opening existing file
6756
- fd1 = shm_open (shm_name, O_RDWR, 0666 );
6757
- if (fd1 == -1 ) { // file didn't open
6758
- // error out here
6759
- __kmp_fatal (KMP_MSG (FunctionError, " Can't open SHM" ), KMP_ERR (0 ),
6760
- __kmp_msg_null);
6761
- } else {
6762
- // able to open existing file
6763
- shm_preexist = 1 ;
6751
+ char *shm_name = nullptr ;
6752
+ char *data1 = nullptr ;
6753
+ __kmp_shm_available = __kmp_detect_shm ();
6754
+ if (__kmp_shm_available) {
6755
+ int fd1 = -1 ;
6756
+ shm_name = __kmp_str_format (" /%s" , name);
6757
+ int shm_preexist = 0 ;
6758
+ fd1 = shm_open (shm_name, O_CREAT | O_EXCL | O_RDWR, 0666 );
6759
+ if ((fd1 == -1 ) && (errno == EEXIST)) {
6760
+ // file didn't open because it already exists.
6761
+ // try opening existing file
6762
+ fd1 = shm_open (shm_name, O_RDWR, 0666 );
6763
+ if (fd1 == -1 ) { // file didn't open
6764
+ KMP_WARNING (FunctionError, " Can't open SHM" );
6765
+ __kmp_shm_available = false ;
6766
+ } else { // able to open existing file
6767
+ shm_preexist = 1 ;
6768
+ }
6769
+ }
6770
+ if (__kmp_shm_available && shm_preexist == 0 ) { // SHM created, set size
6771
+ if (ftruncate (fd1, SHM_SIZE) == -1 ) { // error occured setting size;
6772
+ KMP_WARNING (FunctionError, " Can't set size of SHM" );
6773
+ __kmp_shm_available = false ;
6774
+ }
6775
+ }
6776
+ if (__kmp_shm_available) { // SHM exists, now map it
6777
+ data1 = (char *)mmap (0 , SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
6778
+ fd1, 0 );
6779
+ if (data1 == MAP_FAILED) { // failed to map shared memory
6780
+ KMP_WARNING (FunctionError, " Can't map SHM" );
6781
+ __kmp_shm_available = false ;
6782
+ }
6783
+ }
6784
+ if (__kmp_shm_available) { // SHM mapped
6785
+ if (shm_preexist == 0 ) { // set data to SHM, set value
6786
+ KMP_STRCPY_S (data1, SHM_SIZE, __kmp_registration_str);
6787
+ }
6788
+ // Read value from either what we just wrote or existing file.
6789
+ value = __kmp_str_format (" %s" , data1); // read value from SHM
6790
+ munmap (data1, SHM_SIZE);
6764
6791
}
6765
- } else if (fd1 == -1 ) {
6766
- // SHM didn't open; it was due to error other than already exists. Try to
6767
- // create a temp file under /tmp.
6792
+ if (fd1 != -1 )
6793
+ close (fd1);
6794
+ }
6795
+ if (!__kmp_shm_available)
6796
+ __kmp_tmp_available = __kmp_detect_tmp ();
6797
+ if (!__kmp_shm_available && __kmp_tmp_available) {
6798
+ // SHM failed to work due to an error other than that the file already
6799
+ // exists. Try to create a temp file under /tmp.
6800
+ // If /tmp isn't accessible, fall back to using environment variable.
6768
6801
// TODO: /tmp might not always be the temporary directory. For now we will
6769
- // not consider TMPDIR. If /tmp is not accessible, we simply error out.
6770
- char *temp_file_name = __kmp_str_format (" /tmp/%sXXXXXX" , name);
6771
- fd1 = mkstemp (temp_file_name);
6772
- if (fd1 == -1 ) {
6773
- // error out here.
6774
- __kmp_fatal (KMP_MSG (FunctionError, " Can't open TEMP" ), KMP_ERR (errno),
6775
- __kmp_msg_null);
6802
+ // not consider TMPDIR.
6803
+ int fd1 = -1 ;
6804
+ temp_reg_status_file_name = __kmp_str_format (" /tmp/%s" , name);
6805
+ int tmp_preexist = 0 ;
6806
+ fd1 = open (temp_reg_status_file_name, O_CREAT | O_EXCL | O_RDWR, 0666 );
6807
+ if ((fd1 == -1 ) && (errno == EEXIST)) {
6808
+ // file didn't open because it already exists.
6809
+ // try opening existing file
6810
+ fd1 = open (temp_reg_status_file_name, O_RDWR, 0666 );
6811
+ if (fd1 == -1 ) { // file didn't open if (fd1 == -1) {
6812
+ KMP_WARNING (FunctionError, " Can't open TEMP" );
6813
+ __kmp_tmp_available = false ;
6814
+ } else {
6815
+ tmp_preexist = 1 ;
6816
+ }
6776
6817
}
6777
- temp_reg_status_file_name = temp_file_name;
6778
- }
6779
- if (shm_preexist == 0 ) {
6780
- // we created SHM now set size
6781
- if (ftruncate (fd1, SHM_SIZE) == -1 ) {
6782
- // error occured setting size;
6783
- __kmp_fatal (KMP_MSG (FunctionError, " Can't set size of SHM" ),
6784
- KMP_ERR (errno), __kmp_msg_null);
6818
+ if (__kmp_tmp_available && tmp_preexist == 0 ) {
6819
+ // we created /tmp file now set size
6820
+ if (ftruncate (fd1, SHM_SIZE) == -1 ) { // error occured setting size;
6821
+ KMP_WARNING (FunctionError, " Can't set size of /tmp file" );
6822
+ __kmp_tmp_available = false ;
6823
+ }
6785
6824
}
6825
+ if (__kmp_tmp_available) {
6826
+ data1 = (char *)mmap (0 , SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,
6827
+ fd1, 0 );
6828
+ if (data1 == MAP_FAILED) { // failed to map /tmp
6829
+ KMP_WARNING (FunctionError, " Can't map /tmp" );
6830
+ __kmp_tmp_available = false ;
6831
+ }
6832
+ }
6833
+ if (__kmp_tmp_available) {
6834
+ if (tmp_preexist == 0 ) { // set data to TMP, set value
6835
+ KMP_STRCPY_S (data1, SHM_SIZE, __kmp_registration_str);
6836
+ }
6837
+ // Read value from either what we just wrote or existing file.
6838
+ value = __kmp_str_format (" %s" , data1); // read value from SHM
6839
+ munmap (data1, SHM_SIZE);
6840
+ }
6841
+ if (fd1 != -1 )
6842
+ close (fd1);
6786
6843
}
6787
- data1 =
6788
- (char *)mmap (0 , SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0 );
6789
- if (data1 == MAP_FAILED) {
6790
- // failed to map shared memory
6791
- __kmp_fatal (KMP_MSG (FunctionError, " Can't map SHM" ), KMP_ERR (errno),
6792
- __kmp_msg_null);
6793
- }
6794
- if (shm_preexist == 0 ) { // set data to SHM, set value
6795
- KMP_STRCPY_S (data1, SHM_SIZE, __kmp_registration_str);
6844
+ if (!__kmp_shm_available && !__kmp_tmp_available) {
6845
+ // no /dev/shm and no /tmp -- fall back to environment variable
6846
+ // Set environment variable, but do not overwrite if it exists.
6847
+ __kmp_env_set (name, __kmp_registration_str, 0 );
6848
+ // read value to see if it got set
6849
+ value = __kmp_env_get (name);
6796
6850
}
6797
- // Read value from either what we just wrote or existing file.
6798
- value = __kmp_str_format (" %s" , data1); // read value from SHM
6799
- munmap (data1, SHM_SIZE);
6800
- close (fd1);
6801
6851
#else // Windows and unix with static library
6802
- // Set environment variable, but do not overwrite if it is exist .
6852
+ // Set environment variable, but do not overwrite if it exists .
6803
6853
__kmp_env_set (name, __kmp_registration_str, 0 );
6804
6854
// read value to see if it got set
6805
6855
value = __kmp_env_get (name);
@@ -6859,8 +6909,14 @@ void __kmp_register_library_startup(void) {
6859
6909
case 2 : { // Neighbor is dead.
6860
6910
6861
6911
#if defined(KMP_USE_SHM)
6862
- // close shared memory.
6863
- shm_unlink (shm_name); // this removes file in /dev/shm
6912
+ if (__kmp_shm_available) { // close shared memory.
6913
+ shm_unlink (shm_name); // this removes file in /dev/shm
6914
+ } else if (__kmp_tmp_available) {
6915
+ unlink (temp_reg_status_file_name); // this removes the temp file
6916
+ } else {
6917
+ // Clear the variable and try to register library again.
6918
+ __kmp_env_unset (name);
6919
+ }
6864
6920
#else
6865
6921
// Clear the variable and try to register library again.
6866
6922
__kmp_env_unset (name);
@@ -6873,7 +6929,8 @@ void __kmp_register_library_startup(void) {
6873
6929
}
6874
6930
KMP_INTERNAL_FREE ((void *)value);
6875
6931
#if defined(KMP_USE_SHM)
6876
- KMP_INTERNAL_FREE ((void *)shm_name);
6932
+ if (shm_name)
6933
+ KMP_INTERNAL_FREE ((void *)shm_name);
6877
6934
#endif
6878
6935
} // while
6879
6936
KMP_INTERNAL_FREE ((void *)name);
@@ -6886,25 +6943,32 @@ void __kmp_unregister_library(void) {
6886
6943
char *value = NULL ;
6887
6944
6888
6945
#if defined(KMP_USE_SHM)
6889
- bool use_shm = true ;
6890
- char *shm_name = __kmp_str_format (" /%s" , name);
6891
- int fd1 = shm_open (shm_name, O_RDONLY, 0666 );
6892
- if (fd1 == -1 ) {
6893
- // File did not open. Try the temporary file.
6894
- use_shm = false ;
6895
- KMP_DEBUG_ASSERT (temp_reg_status_file_name);
6946
+ char *shm_name = nullptr ;
6947
+ int fd1;
6948
+ if (__kmp_shm_available) {
6949
+ shm_name = __kmp_str_format (" /%s" , name);
6950
+ fd1 = shm_open (shm_name, O_RDONLY, 0666 );
6951
+ if (fd1 != -1 ) { // File opened successfully
6952
+ char *data1 = (char *)mmap (0 , SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0 );
6953
+ if (data1 != MAP_FAILED) {
6954
+ value = __kmp_str_format (" %s" , data1); // read value from SHM
6955
+ munmap (data1, SHM_SIZE);
6956
+ }
6957
+ close (fd1);
6958
+ }
6959
+ } else if (__kmp_tmp_available) { // try /tmp
6896
6960
fd1 = open (temp_reg_status_file_name, O_RDONLY);
6897
- if (fd1 == -1 ) {
6898
- // give it up now.
6899
- return ;
6961
+ if (fd1 != -1 ) { // File opened successfully
6962
+ char *data1 = (char *)mmap (0 , SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0 );
6963
+ if (data1 != MAP_FAILED) {
6964
+ value = __kmp_str_format (" %s" , data1); // read value from /tmp
6965
+ munmap (data1, SHM_SIZE);
6966
+ }
6967
+ close (fd1);
6900
6968
}
6969
+ } else { // fall back to envirable
6970
+ value = __kmp_env_get (name);
6901
6971
}
6902
- char *data1 = (char *)mmap (0 , SHM_SIZE, PROT_READ, MAP_SHARED, fd1, 0 );
6903
- if (data1 != MAP_FAILED) {
6904
- value = __kmp_str_format (" %s" , data1); // read value from SHM
6905
- munmap (data1, SHM_SIZE);
6906
- }
6907
- close (fd1);
6908
6972
#else
6909
6973
value = __kmp_env_get (name);
6910
6974
#endif
@@ -6914,23 +6978,23 @@ void __kmp_unregister_library(void) {
6914
6978
if (value != NULL && strcmp (value, __kmp_registration_str) == 0 ) {
6915
6979
// Ok, this is our variable. Delete it.
6916
6980
#if defined(KMP_USE_SHM)
6917
- if (use_shm ) {
6981
+ if (__kmp_shm_available ) {
6918
6982
shm_unlink (shm_name); // this removes file in /dev/shm
6919
- } else {
6920
- KMP_DEBUG_ASSERT (temp_reg_status_file_name);
6983
+ } else if (__kmp_tmp_available) {
6921
6984
unlink (temp_reg_status_file_name); // this removes the temp file
6985
+ } else {
6986
+ __kmp_env_unset (name);
6922
6987
}
6923
6988
#else
6924
6989
__kmp_env_unset (name);
6925
6990
#endif
6926
6991
}
6927
6992
6928
6993
#if defined(KMP_USE_SHM)
6929
- KMP_INTERNAL_FREE (shm_name);
6930
- if (!use_shm) {
6931
- KMP_DEBUG_ASSERT (temp_reg_status_file_name);
6994
+ if (shm_name)
6995
+ KMP_INTERNAL_FREE (shm_name);
6996
+ if (temp_reg_status_file_name)
6932
6997
KMP_INTERNAL_FREE (temp_reg_status_file_name);
6933
- }
6934
6998
#endif
6935
6999
6936
7000
KMP_INTERNAL_FREE (__kmp_registration_str);
0 commit comments