This source file includes following definitions.
- buffer_cleanup
- get_print_name_buffer
- pmix_util_print_name_args
- pmix_util_print_rank
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "pmix_config.h"
23
24 #include <stdio.h>
25 #include <string.h>
26
27 #include "pmix_common.h"
28
29 #include "src/threads/tsd.h"
30 #include "src/util/error.h"
31 #include "src/util/name_fns.h"
32 #include "src/util/printf.h"
33
34 #define PMIX_PRINT_NAME_ARGS_MAX_SIZE 300
35 #define PMIX_PRINT_NAME_ARG_NUM_BUFS 16
36
37 #define PMIX_SCHEMA_DELIMITER_CHAR '.'
38 #define PMIX_SCHEMA_WILDCARD_CHAR '*'
39 #define PMIX_SCHEMA_WILDCARD_STRING "*"
40 #define PMIX_SCHEMA_INVALID_CHAR '$'
41 #define PMIX_SCHEMA_INVALID_STRING "$"
42
43 static bool fns_init=false;
44
45 static pmix_tsd_key_t print_args_tsd_key;
46 char* pmix_print_args_null = "NULL";
47 typedef struct {
48 char *buffers[PMIX_PRINT_NAME_ARG_NUM_BUFS];
49 int cntr;
50 } pmix_print_args_buffers_t;
51
52 static void
53 buffer_cleanup(void *value)
54 {
55 int i;
56 pmix_print_args_buffers_t *ptr;
57
58 if (NULL != value) {
59 ptr = (pmix_print_args_buffers_t*)value;
60 for (i=0; i < PMIX_PRINT_NAME_ARG_NUM_BUFS; i++) {
61 free(ptr->buffers[i]);
62 }
63 free (ptr);
64 }
65 }
66
67 static pmix_print_args_buffers_t*
68 get_print_name_buffer(void)
69 {
70 pmix_print_args_buffers_t *ptr;
71 int ret, i;
72
73 if (!fns_init) {
74
75 if (PMIX_SUCCESS != (ret = pmix_tsd_key_create(&print_args_tsd_key, buffer_cleanup))) {
76 PMIX_ERROR_LOG(ret);
77 return NULL;
78 }
79 fns_init = true;
80 }
81
82 ret = pmix_tsd_getspecific(print_args_tsd_key, (void**)&ptr);
83 if (PMIX_SUCCESS != ret) return NULL;
84
85 if (NULL == ptr) {
86 ptr = (pmix_print_args_buffers_t*)malloc(sizeof(pmix_print_args_buffers_t));
87 for (i=0; i < PMIX_PRINT_NAME_ARG_NUM_BUFS; i++) {
88 ptr->buffers[i] = (char *) malloc((PMIX_PRINT_NAME_ARGS_MAX_SIZE+1) * sizeof(char));
89 }
90 ptr->cntr = 0;
91 ret = pmix_tsd_setspecific(print_args_tsd_key, (void*)ptr);
92 }
93
94 return (pmix_print_args_buffers_t*) ptr;
95 }
96
97 char* pmix_util_print_name_args(const pmix_proc_t *name)
98 {
99 pmix_print_args_buffers_t *ptr;
100 char *rank;
101
102
103 ptr = get_print_name_buffer();
104 if (NULL == ptr) {
105 PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE);
106 return pmix_print_args_null;
107 }
108
109 if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
110 ptr->cntr = 0;
111 }
112
113
114 if (NULL == name) {
115 snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "[NO-NAME]");
116 return ptr->buffers[ptr->cntr-1];
117 }
118
119 rank = pmix_util_print_rank(name->rank);
120
121 snprintf(ptr->buffers[ptr->cntr++],
122 PMIX_PRINT_NAME_ARGS_MAX_SIZE,
123 "[%s,%s]", name->nspace, rank);
124
125 return ptr->buffers[ptr->cntr-1];
126 }
127
128 char* pmix_util_print_rank(const pmix_rank_t vpid)
129 {
130 pmix_print_args_buffers_t *ptr;
131
132 ptr = get_print_name_buffer();
133
134 if (NULL == ptr) {
135 PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE);
136 return pmix_print_args_null;
137 }
138
139
140 if (PMIX_PRINT_NAME_ARG_NUM_BUFS == ptr->cntr) {
141 ptr->cntr = 0;
142 }
143
144 if (PMIX_RANK_UNDEF == vpid) {
145 snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "UNDEF");
146 } else if (PMIX_RANK_WILDCARD == vpid) {
147 snprintf(ptr->buffers[ptr->cntr++], PMIX_PRINT_NAME_ARGS_MAX_SIZE, "WILDCARD");
148 } else {
149 snprintf(ptr->buffers[ptr->cntr++],
150 PMIX_PRINT_NAME_ARGS_MAX_SIZE,
151 "%ld", (long)vpid);
152 }
153 return ptr->buffers[ptr->cntr-1];
154 }