From 5679a888670e435cce1891622d920b716a122157 Mon Sep 17 00:00:00 2001 From: Gilles Gouaillardet Date: Mon, 24 Jun 2019 10:17:23 +0900 Subject: [PATCH] pmix/pmix4x: refresh to the latest PMIx master refresh to pmix/pmix@f67efc835c0d2e204ef5b7f085c2813a875ad77a Signed-off-by: Gilles Gouaillardet --- opal/mca/pmix/pmix4x/pmix/VERSION | 4 +- .../pmix4x/pmix/bindings/python/sched.py.in | 137 ++++++++++++++++ opal/mca/pmix/pmix4x/pmix/config/pmix.m4 | 1 + .../pmix/pmix4x/pmix/include/pmix_common.h.in | 153 ++++++++++-------- opal/mca/pmix/pmix4x/pmix/src/include/types.h | 5 +- .../src/mca/bfrops/base/bfrop_base_pack.c | 9 +- .../src/mca/bfrops/base/bfrop_base_unpack.c | 9 +- .../pmix4x/pmix/src/mca/pnet/tcp/pnet_tcp.c | 8 +- .../pmix4x/pmix/src/mca/pnet/test/pnet_test.c | 63 ++++++-- .../pmix/src/runtime/pmix_progress_threads.c | 2 +- 10 files changed, 295 insertions(+), 96 deletions(-) create mode 100755 opal/mca/pmix/pmix4x/pmix/bindings/python/sched.py.in diff --git a/opal/mca/pmix/pmix4x/pmix/VERSION b/opal/mca/pmix/pmix4x/pmix/VERSION index 99dd004a35..4a3bf4939e 100644 --- a/opal/mca/pmix/pmix4x/pmix/VERSION +++ b/opal/mca/pmix/pmix4x/pmix/VERSION @@ -30,7 +30,7 @@ greek=a1 # command, or with the date (if "git describe" fails) in the form of # "date". -repo_rev=git186dca19 +repo_rev=gitf67efc83 # If tarball_version is not empty, it is used as the version string in # the tarball filename, regardless of all other versions listed in @@ -44,7 +44,7 @@ tarball_version= # The date when this release was created -date="Jun 10, 2019" +date="Jun 24, 2019" # The shared library version of each of PMIx's public libraries. # These versions are maintained in accordance with the "Library diff --git a/opal/mca/pmix/pmix4x/pmix/bindings/python/sched.py.in b/opal/mca/pmix/pmix4x/pmix/bindings/python/sched.py.in new file mode 100755 index 0000000000..6e6dd2a67e --- /dev/null +++ b/opal/mca/pmix/pmix4x/pmix/bindings/python/sched.py.in @@ -0,0 +1,137 @@ +@PMIX_PYTHON_PATH@ + +from pmix import * +import signal, time +import os +import select +import subprocess + +global killer + +class GracefulKiller: + kill_now = False + def __init__(self): + signal.signal(signal.SIGINT, self.exit_gracefully) + signal.signal(signal.SIGTERM, self.exit_gracefully) + + def exit_gracefully(self,signum, frame): + self.kill_now = True + +def clientconnected(proc:tuple is not None): + print("CLIENT CONNECTED", proc) + return PMIX_SUCCESS + +def clientfinalized(proc:tuple is not None): + print("CLIENT FINALIZED", proc) + return PMIX_SUCCESS + +def clientfence(args:dict is not None): + print("SERVER FENCE", args) + return PMIX_SUCCESS + +def main(): + try: + foo = PMIxServer() + except: + print("FAILED TO CREATE SERVER") + exit(1) + print("Testing server version ", foo.get_version()) + args = {PMIX_SERVER_SCHEDULER: ('T', PMIX_BOOL)} + map = {'clientconnected': clientconnected, + 'clientfinalized': clientfinalized, + 'fencenb': clientfence} + my_result = foo.init(args, map) + print("Testing PMIx_Initialized") + rc = foo.initialized() + print("Initialized: ", rc) + vers = foo.get_version() + print("Version: ", vers) + + # Register a fabric + rc = foo.register_fabric(None) + print("Fabric registered: ", rc) + + # Get the number of vertices in this fabric + nverts = foo.get_num_vertices() + print("Nverts in fabric: ", nverts) + + # setup the application + (rc, regex) = foo.generate_regex("test000,test001,test002") + print("Node regex: ", regex) + (rc, ppn) = foo.generate_ppn("0,1,2;3,4,5;6,7") + print("PPN: ", ppn) + darray = (PMIX_INFO, [{PMIX_ALLOC_NETWORK_ID: ("SIMPSCHED.net", PMIX_STRING)}, + {PMIX_ALLOC_NETWORK_SEC_KEY: ('T', PMIX_BOOL)}, + {PMIX_SETUP_APP_ENVARS: ('T', PMIX_BOOL)}]) + kyvals = {PMIX_NODE_MAP: (regex, PMIX_STRING), PMIX_PROC_MAP: (ppn, PMIX_STRING), PMIX_ALLOC_NETWORK: (darray, PMIX_DATA_ARRAY)} + + appinfo = [] + rc, appinfo = foo.setup_application("SIMPSCHED", kyvals) + print("SETUPAPP: ", appinfo) + + rc = foo.setup_local_support("SIMPSCHED", appinfo) + print("SETUPLOCAL: ", rc) + + # get our environment as a base + env = os.environ.copy() + + # register an nspace for the client app + kvals = {PMIX_NODE_MAP: (regex, PMIX_STRING), PMIX_PROC_MAP: (ppn, PMIX_STRING), PMIX_UNIV_SIZE: (1, PMIX_UINT32), PMIX_JOB_SIZE: (1, PMIX_UINT32)} + print("REGISTERING NSPACE") + rc = foo.register_nspace("testnspace", 1, kvals) + print("RegNspace ", rc) + + # register a client + uid = os.getuid() + gid = os.getgid() + print("REGISTERING CLIENT") + rc = foo.register_client(("testnspace", 0), uid, gid) + print("RegClient ", rc) + + # setup the fork + rc = foo.setup_fork(("testnspace", 0), env) + print("SetupFrk", rc) + + # setup the client argv + args = ["./client.py"] + # open a subprocess with stdout and stderr + # as distinct pipes so we can capture their + # output as the process runs + p = subprocess.Popen(args, env=env, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # define storage to catch the output + stdout = [] + stderr = [] + # loop until the pipes close + while True: + reads = [p.stdout.fileno(), p.stderr.fileno()] + ret = select.select(reads, [], []) + + stdout_done = True + stderr_done = True + + for fd in ret[0]: + # if the data + if fd == p.stdout.fileno(): + read = p.stdout.readline() + if read: + read = read.decode('utf-8').rstrip() + print('stdout: ' + read) + stdout_done = False + elif fd == p.stderr.fileno(): + read = p.stderr.readline() + if read: + read = read.decode('utf-8').rstrip() + print('stderr: ' + read) + stderr_done = False + + if stdout_done and stderr_done: + break + + print("FINALIZING") + foo.finalize() + +if __name__ == '__main__': + global killer + killer = GracefulKiller() + main() diff --git a/opal/mca/pmix/pmix4x/pmix/config/pmix.m4 b/opal/mca/pmix/pmix4x/pmix/config/pmix.m4 index ad9aed6660..608b5baf5c 100644 --- a/opal/mca/pmix/pmix4x/pmix/config/pmix.m4 +++ b/opal/mca/pmix/pmix4x/pmix/config/pmix.m4 @@ -913,6 +913,7 @@ AC_DEFUN([PMIX_SETUP_CORE],[ if test "$WANT_PYTHON_BINDINGS" = "1"; then AC_CONFIG_FILES(pmix_config_prefix[bindings/python/server.py], [chmod +x bindings/python/server.py]) AC_CONFIG_FILES(pmix_config_prefix[bindings/python/client.py], [chmod +x bindings/python/client.py]) + AC_CONFIG_FILES(pmix_config_prefix[bindings/python/sched.py], [chmod +x bindings/python/sched.py]) fi # publish any embedded flags so external wrappers can use them diff --git a/opal/mca/pmix/pmix4x/pmix/include/pmix_common.h.in b/opal/mca/pmix/pmix4x/pmix/include/pmix_common.h.in index e53d83d5cd..fdd97df4c3 100644 --- a/opal/mca/pmix/pmix4x/pmix/include/pmix_common.h.in +++ b/opal/mca/pmix/pmix4x/pmix/include/pmix_common.h.in @@ -1093,6 +1093,23 @@ typedef uint8_t pmix_coord_system_t; #define PMIX_COORD_CYLINDRICAL 0x02 +/* define some "hooks" external libraries can use to + * intercept memory allocation/release operations */ +static inline void* pmix_malloc(size_t n) +{ + return malloc(n); +} + +static inline void pmix_free(void *m) +{ + free(m); +} + +static inline void* pmix_calloc(size_t n, size_t m) +{ + return calloc(n, m); +} + /* declare a convenience macro for checking keys */ #define PMIX_CHECK_KEY(a, b) \ (0 == strncmp((a)->key, (b), PMIX_MAX_KEYLEN)) @@ -1134,7 +1151,7 @@ typedef struct pmix_byte_object { #define PMIX_BYTE_OBJECT_CREATE(m, n) \ do { \ - (m) = (pmix_byte_object_t*)malloc((n) * sizeof(pmix_byte_object_t)); \ + (m) = (pmix_byte_object_t*)pmix_malloc((n) * sizeof(pmix_byte_object_t)); \ if (NULL != (m)) { \ memset((m), 0, (n)*sizeof(pmix_byte_object_t)); \ } \ @@ -1149,7 +1166,7 @@ typedef struct pmix_byte_object { #define PMIX_BYTE_OBJECT_DESTRUCT(m) \ do { \ if (NULL != (m)->bytes) { \ - free((m)->bytes); \ + pmix_free((m)->bytes); \ } \ } while(0) @@ -1159,10 +1176,10 @@ typedef struct pmix_byte_object { if (NULL != (m)) { \ for (_bon=0; _bon < n; _bon++) { \ if (NULL != (m)[_bon].bytes) { \ - free((m)[_bon].bytes); \ + pmix_free((m)[_bon].bytes); \ } \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while(0) @@ -1193,7 +1210,7 @@ typedef struct { #define PMIX_ENVAR_CREATE(m, n) \ do { \ - (m) = (pmix_envar_t*)calloc((n) , sizeof(pmix_envar_t)); \ + (m) = (pmix_envar_t*)pmix_calloc((n) , sizeof(pmix_envar_t)); \ } while (0) #define PMIX_ENVAR_FREE(m, n) \ do { \ @@ -1202,7 +1219,7 @@ typedef struct { for (_ek=0; _ek < (n); _ek++) { \ PMIX_ENVAR_DESTRUCT(&(m)[_ek]); \ } \ - free((m)); \ + pmix_free((m)); \ } \ } while (0) #define PMIX_ENVAR_CONSTRUCT(m) \ @@ -1214,11 +1231,11 @@ typedef struct { #define PMIX_ENVAR_DESTRUCT(m) \ do { \ if (NULL != (m)->envar) { \ - free((m)->envar); \ + pmix_free((m)->envar); \ (m)->envar = NULL; \ } \ if (NULL != (m)->value) { \ - free((m)->value); \ + pmix_free((m)->value); \ (m)->value = NULL; \ } \ } while(0) @@ -1252,14 +1269,14 @@ typedef struct pmix_data_buffer { } pmix_data_buffer_t; #define PMIX_DATA_BUFFER_CREATE(m) \ do { \ - (m) = (pmix_data_buffer_t*)calloc(1, sizeof(pmix_data_buffer_t)); \ + (m) = (pmix_data_buffer_t*)pmix_calloc(1, sizeof(pmix_data_buffer_t)); \ } while (0) #define PMIX_DATA_BUFFER_RELEASE(m) \ do { \ if (NULL != (m)->base_ptr) { \ - free((m)->base_ptr); \ + pmix_free((m)->base_ptr); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) #define PMIX_DATA_BUFFER_CONSTRUCT(m) \ @@ -1267,7 +1284,7 @@ typedef struct pmix_data_buffer { #define PMIX_DATA_BUFFER_DESTRUCT(m) \ do { \ if (NULL != (m)->base_ptr) { \ - free((m)->base_ptr); \ + pmix_free((m)->base_ptr); \ (m)->base_ptr = NULL; \ } \ (m)->pack_ptr = NULL; \ @@ -1298,12 +1315,12 @@ typedef struct pmix_proc { } pmix_proc_t; #define PMIX_PROC_CREATE(m, n) \ do { \ - (m) = (pmix_proc_t*)calloc((n) , sizeof(pmix_proc_t)); \ + (m) = (pmix_proc_t*)pmix_calloc((n) , sizeof(pmix_proc_t)); \ } while (0) #define PMIX_PROC_RELEASE(m) \ do { \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) @@ -1317,7 +1334,7 @@ typedef struct pmix_proc { #define PMIX_PROC_FREE(m, n) \ do { \ if (NULL != (m)) { \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1367,7 +1384,7 @@ typedef struct pmix_proc_info { } pmix_proc_info_t; #define PMIX_PROC_INFO_CREATE(m, n) \ do { \ - (m) = (pmix_proc_info_t*)calloc((n) , sizeof(pmix_proc_info_t)); \ + (m) = (pmix_proc_info_t*)pmix_calloc((n) , sizeof(pmix_proc_info_t)); \ } while (0) #define PMIX_PROC_INFO_RELEASE(m) \ @@ -1383,11 +1400,11 @@ typedef struct pmix_proc_info { #define PMIX_PROC_INFO_DESTRUCT(m) \ do { \ if (NULL != (m)->hostname) { \ - free((m)->hostname); \ + pmix_free((m)->hostname); \ (m)->hostname = NULL; \ } \ if (NULL != (m)->executable_name) { \ - free((m)->executable_name); \ + pmix_free((m)->executable_name); \ (m)->executable_name = NULL; \ } \ } while(0) @@ -1399,7 +1416,7 @@ typedef struct pmix_proc_info { for (_k=0; _k < (n); _k++) { \ PMIX_PROC_INFO_DESTRUCT(&(m)[_k]); \ } \ - free((m)); \ + pmix_free((m)); \ } \ } while (0) @@ -1472,7 +1489,7 @@ typedef struct pmix_value { do { \ int _ii; \ pmix_value_t *_v; \ - (m) = (pmix_value_t*)calloc((n), sizeof(pmix_value_t)); \ + (m) = (pmix_value_t*)pmix_calloc((n), sizeof(pmix_value_t)); \ _v = (pmix_value_t*)(m); \ if (NULL != (m)) { \ for (_ii=0; _ii < (int)(n); _ii++) { \ @@ -1485,7 +1502,7 @@ typedef struct pmix_value { #define PMIX_VALUE_RELEASE(m) \ do { \ PMIX_VALUE_DESTRUCT((m)); \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) @@ -1506,7 +1523,7 @@ typedef struct pmix_value { for (_vv=0; _vv < (n); _vv++) { \ PMIX_VALUE_DESTRUCT(&((m)[_vv])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1520,7 +1537,7 @@ typedef struct pmix_value { #define PMIX_VALUE_XFER(r, v, s) \ do { \ if (NULL == (v)) { \ - (v) = (pmix_value_t*)malloc(sizeof(pmix_value_t)); \ + (v) = (pmix_value_t*)pmix_malloc(sizeof(pmix_value_t)); \ if (NULL == (v)) { \ (r) = PMIX_ERR_NOMEM; \ } else { \ @@ -1578,7 +1595,7 @@ typedef struct pmix_info { #define PMIX_INFO_CREATE(m, n) \ do { \ pmix_info_t *_i; \ - (m) = (pmix_info_t*)calloc((n), sizeof(pmix_info_t)); \ + (m) = (pmix_info_t*)pmix_calloc((n), sizeof(pmix_info_t)); \ if (NULL != (m)) { \ _i = (pmix_info_t*)(m); \ _i[(n)-1].flags = PMIX_INFO_ARRAY_END; \ @@ -1603,7 +1620,7 @@ typedef struct pmix_info { for (_is=0; _is < (n); _is++) { \ PMIX_INFO_DESTRUCT(&((m)[_is])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1662,13 +1679,13 @@ typedef struct pmix_pdata { /* utility macros for working with pmix_pdata_t structs */ #define PMIX_PDATA_CREATE(m, n) \ do { \ - (m) = (pmix_pdata_t*)calloc((n), sizeof(pmix_pdata_t)); \ + (m) = (pmix_pdata_t*)pmix_calloc((n), sizeof(pmix_pdata_t)); \ } while (0) #define PMIX_PDATA_RELEASE(m) \ do { \ PMIX_VALUE_DESTRUCT(&(m)->value); \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) @@ -1691,7 +1708,7 @@ typedef struct pmix_pdata { for (_ps=0; _ps < (n); _ps++) { \ PMIX_PDATA_DESTRUCT(&(_pdf[_ps])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1732,7 +1749,7 @@ typedef struct pmix_app { /* utility macros for working with pmix_app_t structs */ #define PMIX_APP_CREATE(m, n) \ do { \ - (m) = (pmix_app_t*)calloc((n), sizeof(pmix_app_t)); \ + (m) = (pmix_app_t*)pmix_calloc((n), sizeof(pmix_app_t)); \ } while (0) #define PMIX_APP_INFO_CREATE(m, n) \ @@ -1744,7 +1761,7 @@ typedef struct pmix_app { #define PMIX_APP_RELEASE(m) \ do { \ PMIX_APP_DESTRUCT((m)); \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) @@ -1757,25 +1774,25 @@ typedef struct pmix_app { do { \ size_t _aii; \ if (NULL != (m)->cmd) { \ - free((m)->cmd); \ + pmix_free((m)->cmd); \ (m)->cmd = NULL; \ } \ if (NULL != (m)->argv) { \ for (_aii=0; NULL != (m)->argv[_aii]; _aii++) { \ - free((m)->argv[_aii]); \ + pmix_free((m)->argv[_aii]); \ } \ - free((m)->argv); \ + pmix_free((m)->argv); \ (m)->argv = NULL; \ } \ if (NULL != (m)->env) { \ for (_aii=0; NULL != (m)->env[_aii]; _aii++) { \ - free((m)->env[_aii]); \ + pmix_free((m)->env[_aii]); \ } \ - free((m)->env); \ + pmix_free((m)->env); \ (m)->env = NULL; \ } \ if (NULL != (m)->cwd) { \ - free((m)->cwd); \ + pmix_free((m)->cwd); \ (m)->cwd = NULL; \ } \ if (NULL != (m)->info) { \ @@ -1792,7 +1809,7 @@ typedef struct pmix_app { for (_as=0; _as < (n); _as++) { \ PMIX_APP_DESTRUCT(&((m)[_as])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1807,7 +1824,7 @@ typedef struct pmix_query { /* utility macros for working with pmix_query_t structs */ #define PMIX_QUERY_CREATE(m, n) \ do { \ - (m) = (pmix_query_t*)calloc((n) , sizeof(pmix_query_t)); \ + (m) = (pmix_query_t*)pmix_calloc((n) , sizeof(pmix_query_t)); \ } while (0) #define PMIX_QUERY_QUALIFIERS_CREATE(m, n) \ @@ -1819,7 +1836,7 @@ typedef struct pmix_query { #define PMIX_QUERY_RELEASE(m) \ do { \ PMIX_QUERY_DESTRUCT((m)); \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } while (0) @@ -1833,9 +1850,9 @@ typedef struct pmix_query { size_t _qi; \ if (NULL != (m)->keys) { \ for (_qi=0; NULL != (m)->keys[_qi]; _qi++) { \ - free((m)->keys[_qi]); \ + pmix_free((m)->keys[_qi]); \ } \ - free((m)->keys); \ + pmix_free((m)->keys); \ (m)->keys = NULL; \ } \ if (NULL != (m)->qualifiers) { \ @@ -1852,7 +1869,7 @@ typedef struct pmix_query { for (_qs=0; _qs < (n); _qs++) { \ PMIX_QUERY_DESTRUCT(&((m)[_qs])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -1902,7 +1919,7 @@ typedef struct pmix_regattr_t { do { \ if (NULL != (a)) { \ if (NULL != (a)->name) { \ - free((a)->name); \ + pmix_free((a)->name); \ } \ if (NULL != (a)->description) { \ PMIX_ARGV_FREE((a)->description); \ @@ -1912,7 +1929,7 @@ typedef struct pmix_regattr_t { #define PMIX_REGATTR_CREATE(m, n) \ do { \ - (m) = (pmix_regattr_t*)calloc((n) , sizeof(pmix_regattr_t)); \ + (m) = (pmix_regattr_t*)pmix_calloc((n) , sizeof(pmix_regattr_t)); \ } while (0) #define PMIX_REGATTR_FREE(m, n) \ @@ -1922,7 +1939,7 @@ typedef struct pmix_regattr_t { for (_ra=0; _ra < (n); _ra++) { \ PMIX_REGATTR_DESTRUCT(&((m)[_ra])); \ } \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while (0) @@ -2616,7 +2633,7 @@ PMIX_EXPORT pmix_status_t PMIx_Data_pack(const pmix_proc_t *target, * status_code = PMIx_Data_unpack(buffer, (void*)&dest, &num_values, PMIX_INT32); * * num_values = 5; - * string_array = malloc(num_values*sizeof(char *)); + * string_array = pmix_malloc(num_values*sizeof(char *)); * status_code = PMIx_Data_unpack(buffer, (void*)(string_array), &num_values, PMIX_STRING); * * @endcode @@ -2686,20 +2703,20 @@ static inline void pmix_value_destruct(pmix_value_t * m) { if (PMIX_STRING == (m)->type) { if (NULL != (m)->data.string) { - free((m)->data.string); + pmix_free((m)->data.string); (m)->data.string = NULL; } } else if ((PMIX_BYTE_OBJECT == (m)->type) || (PMIX_COMPRESSED_STRING == (m)->type)) { if (NULL != (m)->data.bo.bytes) { - free((m)->data.bo.bytes); + pmix_free((m)->data.bo.bytes); (m)->data.bo.bytes = NULL; (m)->data.bo.size = 0; } } else if (PMIX_DATA_ARRAY == (m)->type) { if (NULL != (m)->data.darray) { pmix_darray_destruct((m)->data.darray); - free((m)->data.darray); + pmix_free((m)->data.darray); (m)->data.darray = NULL; } } else if (PMIX_ENVAR == (m)->type) { @@ -2744,12 +2761,12 @@ static inline void pmix_darray_destruct(pmix_data_array_t *m) char **_s = (char**)m->array; size_t _si; for (_si=0; _si < m->size; _si++) { - free(_s[_si]); + pmix_free(_s[_si]); } - free(m->array); + pmix_free(m->array); m->array = NULL; } else { - free(m->array); + pmix_free(m->array); } } } @@ -2787,44 +2804,44 @@ static inline void pmix_darray_destruct(pmix_data_array_t *m) PMIX_INT8 == (t) || \ PMIX_UINT8 == (t) || \ PMIX_POINTER == (t)) { \ - (m)->array = calloc((n), sizeof(int8_t)); \ + (m)->array = pmix_calloc((n), sizeof(int8_t)); \ } else if (PMIX_STRING == (t)) { \ - (m)->array = calloc((n), sizeof(char*)); \ + (m)->array = pmix_calloc((n), sizeof(char*)); \ } else if (PMIX_SIZE == (t)) { \ - (m)->array = calloc((n), sizeof(size_t)); \ + (m)->array = pmix_calloc((n), sizeof(size_t)); \ } else if (PMIX_PID == (t)) { \ - (m)->array = calloc((n), sizeof(pid_t)); \ + (m)->array = pmix_calloc((n), sizeof(pid_t)); \ } else if (PMIX_INT == (t) || \ PMIX_UINT == (t) || \ PMIX_STATUS == (t)) { \ - (m)->array = calloc((n), sizeof(int)); \ + (m)->array = pmix_calloc((n), sizeof(int)); \ } else if (PMIX_IOF_CHANNEL == (t) || \ PMIX_DATA_TYPE == (t) || \ PMIX_INT16 == (t) || \ PMIX_UINT16 == (t)) { \ - (m)->array = calloc((n), sizeof(int16_t)); \ + (m)->array = pmix_calloc((n), sizeof(int16_t)); \ } else if (PMIX_PROC_RANK == (t) || \ PMIX_INFO_DIRECTIVES == (t) || \ PMIX_INT32 == (t) || \ PMIX_UINT32 == (t)) { \ - (m)->array = calloc((n), sizeof(int32_t)); \ + (m)->array = pmix_calloc((n), sizeof(int32_t)); \ } else if (PMIX_INT64 == (t) || \ PMIX_UINT64 == (t)) { \ - (m)->array = calloc((n), sizeof(int64_t)); \ + (m)->array = pmix_calloc((n), sizeof(int64_t)); \ } else if (PMIX_FLOAT == (t)) { \ - (m)->array = calloc((n), sizeof(float)); \ + (m)->array = pmix_calloc((n), sizeof(float)); \ } else if (PMIX_DOUBLE == (t)) { \ - (m)->array = calloc((n), sizeof(double)); \ + (m)->array = pmix_calloc((n), sizeof(double)); \ } else if (PMIX_TIMEVAL == (t)) { \ - (m)->array = calloc((n), sizeof(struct timeval)); \ + (m)->array = pmix_calloc((n), sizeof(struct timeval)); \ } else if (PMIX_TIME == (t)) { \ - (m)->array = calloc((n), sizeof(time_t)); \ + (m)->array = pmix_calloc((n), sizeof(time_t)); \ } else if (PMIX_REGATTR == (t)) { \ PMIX_REGATTR_CREATE((m)->array, (n)); \ } else if (PMIX_BOOL == (t)) { \ - (m)->array = calloc((n), sizeof(bool)); \ + (m)->array = pmix_calloc((n), sizeof(bool)); \ } else if (PMIX_COORD == (t)) { \ - (m)->array = calloc((n), sizeof(pmix_coord_t)); \ + (m)->array = pmix_calloc((n), sizeof(pmix_coord_t)); \ } \ } else { \ (m)->array = NULL; \ @@ -2832,7 +2849,7 @@ static inline void pmix_darray_destruct(pmix_data_array_t *m) } while(0) #define PMIX_DATA_ARRAY_CREATE(m, n, t) \ do { \ - (m) = (pmix_data_array_t*)calloc(1, sizeof(pmix_data_array_t)); \ + (m) = (pmix_data_array_t*)pmix_calloc(1, sizeof(pmix_data_array_t)); \ PMIX_DATA_ARRAY_CONSTRUCT((m), (n), (t)); \ } while(0) @@ -2842,7 +2859,7 @@ static inline void pmix_darray_destruct(pmix_data_array_t *m) do { \ if (NULL != (m)) { \ PMIX_DATA_ARRAY_DESTRUCT(m); \ - free((m)); \ + pmix_free((m)); \ (m) = NULL; \ } \ } while(0) diff --git a/opal/mca/pmix/pmix4x/pmix/src/include/types.h b/opal/mca/pmix/pmix4x/pmix/src/include/types.h index d8297807d3..34b8f27171 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/include/types.h +++ b/opal/mca/pmix/pmix4x/pmix/src/include/types.h @@ -253,7 +253,6 @@ typedef struct event pmix_event_t; #define pmix_event_base_free(b) event_base_free(b) -#define pmix_event_base_loopexit(b) event_base_loopexit(b, NULL) #if PMIX_HAVE_LIBEV #define pmix_event_use_threads() @@ -279,12 +278,12 @@ PMIX_EXPORT int pmix_event_assign(struct event *ev, pmix_event_base_t *evbase, PMIX_EXPORT int pmix_event_add(struct event *ev, struct timeval *tv); PMIX_EXPORT int pmix_event_del(struct event *ev); PMIX_EXPORT void pmix_event_active (struct event *ev, int res, short ncalls); -PMIX_EXPORT void pmix_event_base_loopbreak (pmix_event_base_t *b); +PMIX_EXPORT void pmix_event_base_loopexit (pmix_event_base_t *b); #else #define pmix_event_add(ev, tv) event_add((ev), (tv)) #define pmix_event_del(ev) event_del((ev)) #define pmix_event_active(x, y, z) event_active((x), (y), (z)) -#define pmix_event_base_loopbreak(b) event_base_loopbreak(b) +#define pmix_event_base_loopexit(b) event_base_loopexit(b, NULL) #endif PMIX_EXPORT pmix_event_t* pmix_event_new(pmix_event_base_t *b, int fd, diff --git a/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_pack.c b/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_pack.c index 38301eaf3c..b0283e8f4d 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_pack.c +++ b/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_pack.c @@ -768,7 +768,14 @@ pmix_status_t pmix_bfrops_base_pack_app(pmix_pointer_array_t *regtypes, } /* argv */ nvals = pmix_argv_count(app[i].argv); - PMIX_BFROPS_PACK_TYPE(ret, buffer, &nvals, 1, PMIX_INT32, regtypes); + /* although nvals is technically an int32, we have to pack it + * as a generic int due to a typo in earlier release series. This + * preserves the ordering of bytes in the packed buffer as it + * includes a tag indicating the actual size of the value. No + * harm is done as generic int is equivalent to int32 on all + * current systems - just something to watch out for in the + * future should someone someday change the size of "int" */ + PMIX_BFROPS_PACK_TYPE(ret, buffer, &nvals, 1, PMIX_INT, regtypes); if (PMIX_SUCCESS != ret) { return ret; } diff --git a/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_unpack.c b/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_unpack.c index 43afa63e62..21ee9c5be9 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_unpack.c +++ b/opal/mca/pmix/pmix4x/pmix/src/mca/bfrops/base/bfrop_base_unpack.c @@ -944,7 +944,14 @@ pmix_status_t pmix_bfrops_base_unpack_app(pmix_pointer_array_t *regtypes, } /* unpack argc */ m=1; - PMIX_BFROPS_UNPACK_TYPE(ret, buffer, &nval, &m, PMIX_INT32, regtypes); + /* although nval is technically an int32, we have to unpack it + * as a generic int due to a typo in earlier release series. This + * preserves the ordering of bytes in the packed buffer as it + * includes a tag indicating the actual size of the value. No + * harm is done as generic int is equivalent to int32 on all + * current systems - just something to watch out for in the + * future should someone someday change the size of "int" */ + PMIX_BFROPS_UNPACK_TYPE(ret, buffer, &nval, &m, PMIX_INT, regtypes); if (PMIX_SUCCESS != ret) { return ret; } diff --git a/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/tcp/pnet_tcp.c b/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/tcp/pnet_tcp.c index 1672b81ac1..aff58b95e3 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/tcp/pnet_tcp.c +++ b/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/tcp/pnet_tcp.c @@ -1143,6 +1143,7 @@ static pmix_status_t deliver_inventory(pmix_info_t info[], size_t ninfo, &bkt, &pbo, &cnt, PMIX_BYTE_OBJECT); while (PMIX_SUCCESS == rc) { /* load the byte object for unpacking */ + PMIX_CONSTRUCT(&pbkt, pmix_buffer_t); PMIX_LOAD_BUFFER(pmix_globals.mypeer, &pbkt, pbo.bytes, pbo.size); /* unpack the name of the device */ cnt = 1; @@ -1150,7 +1151,7 @@ static pmix_status_t deliver_inventory(pmix_info_t info[], size_t ninfo, &pbkt, &device, &cnt, PMIX_STRING); if (PMIX_SUCCESS != rc) { PMIX_ERROR_LOG(rc); - PMIX_DATA_BUFFER_DESTRUCT(&pbkt); + PMIX_DESTRUCT(&pbkt); /* must _not_ destruct bkt as we don't * own the bytes! */ return rc; @@ -1161,7 +1162,7 @@ static pmix_status_t deliver_inventory(pmix_info_t info[], size_t ninfo, &pbkt, &address, &cnt, PMIX_STRING); if (PMIX_SUCCESS != rc) { PMIX_ERROR_LOG(rc); - PMIX_DATA_BUFFER_DESTRUCT(&pbkt); + PMIX_DESTRUCT(&pbkt); /* must _not_ destruct bkt as we don't * own the bytes! */ return rc; @@ -1171,12 +1172,11 @@ static pmix_status_t deliver_inventory(pmix_info_t info[], size_t ninfo, res->device = device; res->address = address; pmix_list_append(&prts->devices, &res->super); - PMIX_DATA_BUFFER_DESTRUCT(&pbkt); + PMIX_DESTRUCT(&pbkt); cnt = 1; PMIX_BFROPS_UNPACK(rc, pmix_globals.mypeer, &bkt, &pbo, &cnt, PMIX_BYTE_OBJECT); } - PMIX_DATA_BUFFER_DESTRUCT(&bkt); if (5 < pmix_output_get_verbosity(pmix_pnet_base_framework.framework_output)) { /* dump the resulting node resources */ pmix_output(0, "TCP resources for node: %s", nd->name); diff --git a/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/test/pnet_test.c b/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/test/pnet_test.c index 1d4f1bac38..2c903933ef 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/test/pnet_test.c +++ b/opal/mca/pmix/pmix4x/pmix/src/mca/pnet/test/pnet_test.c @@ -240,11 +240,12 @@ static pmix_status_t test_init(void) { int n, m, r, ns, nplane, nnodes, nports; uint64_t n64, m64; - char **system, **ptr; + char **system=NULL, **ptr; pnet_plane_t *p; pnet_switch_t *s, *s2; pnet_nic_t *nic, *nic2; pnet_node_t *node; + pmix_status_t rc; pmix_output_verbose(2, pmix_pnet_base_framework.framework_output, "pnet: test init"); @@ -288,7 +289,9 @@ static pmix_status_t test_init(void) for (n=0; n < nnodes; n++) { node = PMIX_NEW(pnet_node_t); if (0 > asprintf(&node->name, "test%03d", n)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + PMIX_RELEASE(node); + goto cleanup; } pmix_list_append(&mynodes, &node->super); } @@ -313,8 +316,8 @@ static pmix_status_t test_init(void) pmix_list_append(&myplanes, &p->super); } else { PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); - pmix_argv_free(system); - return PMIX_ERR_BAD_PARAM; + rc = PMIX_ERR_BAD_PARAM; + goto cleanup; } } /* setup the ports in each switch for each plane */ @@ -322,7 +325,8 @@ static pmix_status_t test_init(void) PMIX_LIST_FOREACH(p, &myplanes, pnet_plane_t) { /* assign a name to the plane */ if (0 > asprintf(&p->name, "plane%03d", nplane)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } /* setup the ports on the switches */ nports = nnodes / p->nswitches; @@ -334,20 +338,24 @@ static pmix_status_t test_init(void) for (n=0; n < p->nswitches; n++) { s = PMIX_NEW(pnet_switch_t); if (0 > asprintf(&s->name, "%s:switch%03d", p->name, n)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } s->index = n; pmix_list_append(&p->switches, &s->super); if (0 > asprintf(&s->leftport.name, "%s:port000", s->name)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } if (0 > asprintf(&s->rightport.name, "%s:port%03d", s->name, nports+1)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } for (m=0; m < nports; m++) { nic = PMIX_NEW(pnet_nic_t); if (0 > asprintf(&nic->name, "%s:port%03d", s->name, m+1)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } nic->s = s; nic->plane = p; @@ -409,7 +417,8 @@ static pmix_status_t test_init(void) PMIX_LIST_FOREACH(node, &mynodes, pnet_node_t) { nic2 = PMIX_NEW(pnet_nic_t); if (0 > asprintf(&nic2->name, "%s:nic%03d", node->name, n)) { - return PMIX_ERR_NOMEM; + rc = PMIX_ERR_NOMEM; + goto cleanup; } ++n; --ns; @@ -471,9 +480,16 @@ static pmix_status_t test_init(void) ++nplane; } pmix_argv_free(system); + system = NULL; + } + rc = PMIX_SUCCESS; + + cleanup: + if (NULL != system) { + pmix_argv_free(system); } - return PMIX_SUCCESS; + return rc; } static void test_finalize(void) @@ -513,7 +529,7 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, pmix_list_t mylist; size_t n, m, p, q, nreqs=0; pmix_info_t *requests = NULL, *iptr, *ip2; - char *idkey = NULL, **locals; + char *idkey = NULL, **locals = NULL; uint64_t unique_key = 12345; pmix_buffer_t buf; pmix_status_t rc; @@ -617,7 +633,8 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, if (PMIX_STRING != requests[n].value.type || NULL == requests[n].value.data.string) { PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); - return PMIX_ERR_BAD_PARAM; + rc = PMIX_ERR_BAD_PARAM; + goto cleanup; } idkey = requests[n].value.data.string; } else if (PMIX_CHECK_KEY(&requests[n], PMIX_ALLOC_NETWORK_SEC_KEY)) { @@ -693,12 +710,10 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, * for each proc on the node - we assume the same * list of static endpoints on each node */ for (n=0; NULL != nodes[n]; n++) { - pmix_output(0, "WORKING NODE %s", nodes[n]); /* split the procs for this node */ locals = pmix_argv_split(procs[n], ','); if (NULL == locals) { /* aren't any on this node */ - pmix_output(0, "NO PROCS ON THIS NODE"); continue; } /* find this node in our list */ @@ -711,7 +726,6 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, } if (NULL == nd) { /* we don't have this node in our list */ - pmix_output(0, "DO NOT KNOW THIS NODE"); rc = PMIX_ERR_NOT_FOUND; goto cleanup; } @@ -762,6 +776,7 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, } } pmix_argv_free(locals); + locals = NULL; pmix_list_append(&mylist, &kv->super); } @@ -802,6 +817,9 @@ static pmix_status_t allocate(pmix_namespace_t *nptr, if (NULL != procs) { pmix_argv_free(procs); } + if (NULL != locals) { + pmix_argv_free(locals); + } return rc; } @@ -825,6 +843,8 @@ static pmix_status_t setup_local_network(pmix_namespace_t *nptr, for (n=0; n < ninfo; n++) { /* look for my key */ if (PMIX_CHECK_KEY(&info[n], "pmix-pnet-test-blob")) { + pmix_output_verbose(2, pmix_pnet_base_framework.framework_output, + "pnet:test:setup_local_network found my blob"); /* this macro NULLs and zero's the incoming bo */ PMIX_LOAD_BUFFER(pmix_globals.mypeer, &bkt, info[n].value.data.bo.bytes, @@ -839,6 +859,11 @@ static pmix_status_t setup_local_network(pmix_namespace_t *nptr, "recvd KEY %s %s", kv->key, PMIx_Data_type_string(kv->value->type)); /* check for the network ID */ if (PMIX_CHECK_KEY(kv, PMIX_ALLOC_NETWORK_ID)) { + if (NULL != idkey) { + PMIX_ERROR_LOG(PMIX_ERR_BAD_PARAM); + free(idkey); + return PMIX_ERR_BAD_PARAM; + } idkey = strdup(kv->value->data.string); pmix_output_verbose(2, pmix_pnet_base_framework.framework_output, "pnet:test:setup_local_network idkey %s", idkey); @@ -861,6 +886,9 @@ static pmix_status_t setup_local_network(pmix_namespace_t *nptr, PMIX_GDS_CACHE_JOB_INFO(rc, pmix_globals.mypeer, nptr, iptr, nvals); if (PMIX_SUCCESS != rc) { PMIX_RELEASE(kv); + if (NULL != idkey) { + free(idkey); + } return rc; } } @@ -880,6 +908,9 @@ static pmix_status_t setup_local_network(pmix_namespace_t *nptr, } } + if (NULL != idkey) { + free(idkey); + } return PMIX_SUCCESS; } diff --git a/opal/mca/pmix/pmix4x/pmix/src/runtime/pmix_progress_threads.c b/opal/mca/pmix/pmix4x/pmix/src/runtime/pmix_progress_threads.c index b8b0d530a9..6d217a34d9 100644 --- a/opal/mca/pmix/pmix4x/pmix/src/runtime/pmix_progress_threads.c +++ b/opal/mca/pmix/pmix4x/pmix/src/runtime/pmix_progress_threads.c @@ -194,7 +194,7 @@ void pmix_event_active (struct event *ev, int res, short ncalls) { } } -void pmix_event_base_loopbreak (pmix_event_base_t *ev_base) { +void pmix_event_base_loopexit (pmix_event_base_t *ev_base) { pmix_progress_tracker_t *trk = pmix_progress_tracker_get_by_base(ev_base); assert(NULL != trk); ev_async_send ((struct ev_loop *)trk->ev_base, &trk->async);