diff --git a/src/api/pmi.c b/src/api/pmi.c index edbcb04ab284569825c48cce5e7c3891e41f8cf0..bfda4c6a21c9064065b3c38b26920b01cfdbe536 100644 --- a/src/api/pmi.c +++ b/src/api/pmi.c @@ -93,9 +93,13 @@ #define PMI_MAX_KVSNAME_LEN 256 /* Maximum size of KVS name */ #define PMI_MAX_VAL_LEN 256 /* Maximum size of a PMI value */ +#define KVS_STATE_LOCAL 0 +#define KVS_STATE_DEFUNCT 1 + /* default key names form is jobid.stepid[.sequence] */ struct kvs_rec { char * kvs_name; + int kvs_state; /* see KVS_STATE_* */ int kvs_cnt; int kvs_inx; /* iteration index */ char ** kvs_keys; @@ -267,7 +271,6 @@ static void _del_kvs_rec(struct kvs_rec *kvs_ptr) } if (kvs_ptr->kvs_name) free(kvs_ptr->kvs_name); - free(kvs_ptr); return; } @@ -807,13 +810,25 @@ parameter, kvsname, must be at least as long as the value returned by @*/ int PMI_KVS_Create( char kvsname[], int length ) { + int size, rc; + 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; - /* FIXME */ - return PMI_FAIL; + pthread_mutex_lock(&kvs_mutex); + size = snprintf(kvsname, length, "%ld.%ld.%d.%d", pmi_jobid, + pmi_stepid, pmi_rank, kvs_name_sequence); + if (size >= length) /* truncated */ + rc = PMI_ERR_INVALID_LENGTH; + else { + kvs_name_sequence++; + _init_kvs(kvsname); + rc = PMI_SUCCESS; + } + pthread_mutex_unlock(&kvs_mutex); + return rc; } /*@ @@ -833,11 +848,23 @@ This function destroys a keyval space created by 'PMI_KVS_Create()'. @*/ int PMI_KVS_Destroy( const char kvsname[] ) { + int i, found = 0; + if (kvsname == NULL) return PMI_ERR_INVALID_ARG; - /* FIXME */ - return PMI_FAIL; + pthread_mutex_lock(&kvs_mutex); + for (i=0; i<kvs_rec_cnt; i++) { + if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN)) + continue; + kvs_recs[i].kvs_state = KVS_STATE_DEFUNCT; + found = 1; + break; + } + pthread_mutex_unlock(&kvs_mutex); + if (found == 0) + return PMI_ERR_INVALID_ARG; + return PMI_SUCCESS; } /*@ @@ -983,6 +1010,8 @@ int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int lengt /* find the proper kvs record */ pthread_mutex_lock(&kvs_mutex); for (i=0; i<kvs_rec_cnt; i++) { + if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT) + continue; if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN)) continue; for (j=0; j<kvs_recs[i].kvs_cnt; j++) { @@ -1049,6 +1078,8 @@ int PMI_KVS_Iter_first(const char kvsname[], char key[], int key_len, char val[] /* find the proper kvs record */ pthread_mutex_lock(&kvs_mutex); for (i=0; i<kvs_rec_cnt; i++) { + if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT) + continue; if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN)) continue; kvs_recs[i].kvs_inx = 0; @@ -1121,6 +1152,8 @@ int PMI_KVS_Iter_next(const char kvsname[], char key[], int key_len, /* find the proper kvs record */ pthread_mutex_lock(&kvs_mutex); for (i=0; i<kvs_rec_cnt; i++) { + if (kvs_recs[i].kvs_state == KVS_STATE_DEFUNCT) + continue; if (strncmp(kvs_recs[i].kvs_name, kvsname, PMI_MAX_KVSNAME_LEN)) continue; kvs_recs[i].kvs_inx++; diff --git a/testsuite/expect/test7.2.prog.c b/testsuite/expect/test7.2.prog.c index 3ef94e081a4c808bcff2ba0c2ba5f57ca60a9a98..5952fd40f5ab3dffa55f1f31ca3a12082adf8941 100644 --- a/testsuite/expect/test7.2.prog.c +++ b/testsuite/expect/test7.2.prog.c @@ -175,21 +175,49 @@ main (int argc, char **argv) for (i=0; ; i++) { if (key[0] == '\0') { if (i != (pmi_size * 2)) { - printf("FAILURE: PMI_KVS_iter_next cycle count(%d, %d)\n", - i, pmi_size); + printf("FAILURE: PMI_KVS_iter_next cycle count" + "(%d, %d)\n", i, pmi_size); } break; } - 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("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); exit(1); } } + /* create new keyspace and test it */ + if ((rc = PMI_KVS_Create(kvs_name, kvs_name_len)) != PMI_SUCCESS) { + printf("FAILURE: PMI_KVS_Create: %d\n", rc); + exit(1); + } + printf("PMI_KVS_Create %s\n", kvs_name); + if ((rc = PMI_KVS_Put(kvs_name, "KVS_KEY", "KVS_VAL")) != PMI_SUCCESS) { + printf("FAILURE: PMI_KVS_Put: %d\n", rc); + exit(1); + } + printf("PMI_KVS_Put(%s,KVS_KEY,KVS_VAL)\n", kvs_name); + if ((rc = PMI_KVS_Get(kvs_name, "KVS_KEY", val, val_len)) != + PMI_SUCCESS) { + printf("FAILURE: PMI_KVS_Get: %d\n", rc); + exit(1); + } + printf("PMI_KVS_Get(%s,%s) %s\n", kvs_name, "KVS_KEY", val); + if ((rc = PMI_KVS_Destroy(kvs_name)) != PMI_SUCCESS) { + printf("FAILURE: PMI_KVS_Destroy(%s): %d\n", kvs_name, rc); + exit(1); + } + if ((rc = PMI_KVS_Get(kvs_name, "KVS_KEY", val, val_len)) != + PMI_ERR_INVALID_KVS) { + printf("FAILURE: PMI_KVS_Get: %d\n", rc); + exit(1); + } + if ((rc = PMI_Finalize()) != PMI_SUCCESS) { - printf("FAILURE: PMI_Finalize: %\n", rc); + printf("FAILURE: PMI_Finalize: %d\n", rc); exit(1); }