diff --git a/src/api/pmi.c b/src/api/pmi.c index ca36308b6add95fc1fb1e615651a16af3e6c2bcd..edbcb04ab284569825c48cce5e7c3891e41f8cf0 100644 --- a/src/api/pmi.c +++ b/src/api/pmi.c @@ -95,7 +95,7 @@ /* default key names form is jobid.stepid[.sequence] */ struct kvs_rec { - char kvs_name[PMI_MAX_KVSNAME_LEN]; + char * kvs_name; int kvs_cnt; int kvs_inx; /* iteration index */ char ** kvs_keys; @@ -103,6 +103,7 @@ struct kvs_rec { }; static void _init_kvs( char kvsname[] ); +static void _del_kvs_rec( struct kvs_rec *kvs_ptr ); /* Global variables */ long pmi_jobid = -1; @@ -117,7 +118,7 @@ int pmi_rank; pthread_mutex_t kvs_mutex = PTHREAD_MUTEX_INITIALIZER; #else int kvs_mutex; - static inline int pthread_mutex_unlock(int *kvs_mutex) { return 0; } + static inline int pthread_mutex_lock(int *kvs_mutex) { return 0; } static inline int pthread_mutex_unlock(int *kvs_mutex) { return 0; } #endif @@ -158,7 +159,7 @@ int PMI_Init( int *spawned ) if (env) pmi_jobid = atoi(env); - env = getenv("SLURM_JOBID"); + env = getenv("SLURM_STEPID"); if (env) pmi_stepid = atoi(env); @@ -237,11 +238,39 @@ Notes: @*/ int PMI_Finalize( void ) { + int i; pmi_init = 0; + pthread_mutex_lock(&kvs_mutex); + for (i=0; i<kvs_rec_cnt; i++) + _del_kvs_rec(&kvs_recs[i]); + if (kvs_recs) + free(kvs_recs); + kvs_recs = NULL; + kvs_rec_cnt = 0; + pthread_mutex_unlock(&kvs_mutex); return PMI_SUCCESS; } +static void _del_kvs_rec(struct kvs_rec *kvs_ptr) +{ + int i; + + if (kvs_ptr == NULL) + return; + + for (i=0; i<kvs_ptr->kvs_cnt; i++) { + if (kvs_ptr->kvs_keys[i]) + free(kvs_ptr->kvs_keys[i]); + if (kvs_ptr->kvs_values[i]) + free(kvs_ptr->kvs_values[i]); + } + if (kvs_ptr->kvs_name) + free(kvs_ptr->kvs_name); + free(kvs_ptr); + return; +} + /*@ PMI_Get_size - obtain the size of the process group @@ -328,8 +357,6 @@ int PMI_Get_universe_size( int *size ) return PMI_ERR_INVALID_ARG; env = getenv("SLURM_NPROCS"); - if (!env) - env = getenv("PMI_SIZE"); if (env) { *size = atoi(env); return PMI_SUCCESS; @@ -646,16 +673,18 @@ kvsname, must be at least as long as the value returned by @*/ int PMI_KVS_Get_my_name( char kvsname[], int length ) { + int size; + if (kvsname == NULL) return PMI_ERR_INVALID_ARG; - if (length < PMI_MAX_KVSNAME_LEN) - return PMI_ERR_INVALID_LENGTH; if ((pmi_jobid < 0) || (pmi_stepid < 0)) return PMI_FAIL; + size = snprintf(kvsname, length, "%ld.%ld", pmi_jobid, pmi_stepid); + if (size >= length) /* truncated */ + return PMI_ERR_INVALID_LENGTH; + pthread_mutex_lock(&kvs_mutex); - snprintf(kvsname, PMI_MAX_KVSNAME_LEN, "%ld.%ld", pmi_jobid, - pmi_stepid); _init_kvs(kvsname); pthread_mutex_unlock(&kvs_mutex); return PMI_SUCCESS; @@ -667,8 +696,8 @@ static void _init_kvs( char kvsname[] ) i = kvs_rec_cnt; kvs_rec_cnt++; - kvs_recs = realloc(kvs_recs, (sizeof(struct kvs_rec *) * kvs_rec_cnt)); - strncpy(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN); + kvs_recs = realloc(kvs_recs, (sizeof(struct kvs_rec) * kvs_rec_cnt)); + kvs_recs[i].kvs_name = strndup(kvsname, PMI_MAX_KVSNAME_LEN); kvs_recs[i].kvs_cnt = 0; kvs_recs[i].kvs_inx = 0; kvs_recs[i].kvs_keys = NULL; @@ -748,7 +777,7 @@ int PMI_KVS_Get_value_length_max( int *length ) { if (length == NULL) return PMI_ERR_INVALID_ARG; - +printf("PMI_KVS_Get_value_length_max, name[0]=%s\n",kvs_recs[0].kvs_name); *length = PMI_MAX_VAL_LEN; return PMI_SUCCESS; } diff --git a/testsuite/expect/test7.2.prog.c b/testsuite/expect/test7.2.prog.c index 5d2cef1be3448f84e2441a27a416e6a055e717a5..3ef94e081a4c808bcff2ba0c2ba5f57ca60a9a98 100644 --- a/testsuite/expect/test7.2.prog.c +++ b/testsuite/expect/test7.2.prog.c @@ -78,10 +78,12 @@ main (int argc, char **argv) printf("FAILURE: PMI_Get_rank: %d\n", rc); exit(1); } + printf("PMI_Get_rank = %d\n", pmi_rank); if ((rc = PMI_Get_size(&pmi_size)) != PMI_SUCCESS) { printf("FAILURE: PMI_Get_size: %d\n", rc); exit(1); } + printf("PMI_Get_size = %d\n", pmi_size); if (pmi_rank != procid) { printf("FAILURE: Rank(%d) != PROCID(%d)\n", pmi_rank, procid); @@ -97,11 +99,13 @@ main (int argc, char **argv) printf("FAILURE: PMI_KVS_Get_name_length_max: %d\n", rc); exit(1); } + printf("PMI_KVS_Get_name_length_max = %d\n", kvs_name_len); kvs_name = malloc(kvs_name_len); if ((rc = PMI_KVS_Get_my_name(kvs_name, kvs_name_len)) != PMI_SUCCESS) { printf("FAILURE: PMI_KVS_Get_my_name: %d\n", rc); exit(1); } + printf("PMI_KVS_Get_my_name = %s\n", kvs_name); if ((rc = PMI_KVS_Get_key_length_max(&key_len)) != PMI_SUCCESS) { printf("FAILURE: PMI_KVS_Get_key_length_max: %d\n", rc); exit(1); @@ -111,6 +115,7 @@ main (int argc, char **argv) printf("FAILURE: PMI_KVS_Get_value_length_max: %d\n", rc); exit(1); } + printf("PMI_KVS_Get_value_length_max = %d\n", val_len); val = malloc(val_len); /* Build and set some key=val pairs */ @@ -147,7 +152,7 @@ main (int argc, char **argv) printf("FAILURE: Bad keypair %s=%s\n", key, val); exit(1); } - printf("Read keypair %s=%s\n", key, val); + printf("PMI_KVS_Get(%s,%s) %s\n", kvs_name, key, val); snprintf(key, key_len, "attr_2_%d", i); if ((rc = PMI_KVS_Get(kvs_name, key, val, val_len)) != @@ -159,7 +164,7 @@ main (int argc, char **argv) printf("FAILURE: Bad keypair %s=%s\n", key, val); exit(1); } - printf("Read keypair %s=%s\n", key, val); + printf("PMI_KVS_Get(%s,%s) %s\n", kvs_name, key, val); } /* use iterator */ @@ -175,7 +180,7 @@ main (int argc, char **argv) } break; } - printf("iter(%d): %s=%s\n", i, key, val); + printf("PMI_KVS_Iter_next(%s,%d): %s=%s\n", kvs_name, i, key, val); if ((rc = PMI_KVS_Iter_next(kvs_name, key, key_len, val, val_len)) != PMI_SUCCESS) { printf("FAILURE: PMI_KVS_iter_next: %d\n", rc);