This source file includes following definitions.
- opal_dss_compare
- opal_dss_compare_int
- opal_dss_compare_uint
- opal_dss_compare_size
- opal_dss_compare_pid
- opal_dss_compare_byte
- opal_dss_compare_char
- opal_dss_compare_int8
- opal_dss_compare_uint8
- opal_dss_compare_int16
- opal_dss_compare_uint16
- opal_dss_compare_int32
- opal_dss_compare_uint32
- opal_dss_compare_int64
- opal_dss_compare_uint64
- opal_dss_compare_float
- opal_dss_compare_double
- opal_dss_compare_null
- opal_dss_compare_bool
- opal_dss_compare_string
- opal_dss_compare_timeval
- opal_dss_compare_time
- opal_dss_compare_dt
- opal_dss_compare_byte_object
- opal_dss_compare_pstat
- opal_dss_compare_node_stat
- opal_dss_compare_value
- opal_dss_compare_buffer_contents
- opal_dss_compare_name
- opal_dss_compare_vpid
- opal_dss_compare_jobid
- opal_dss_compare_status
- opal_dss_compare_envar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include "opal_config.h"
24
25 #include <stdlib.h>
26 #ifdef HAVE_SYS_TIME_H
27 #include <sys/time.h>
28 #endif
29
30 #include "opal/dss/dss_internal.h"
31
32 int opal_dss_compare(const void *value1, const void *value2, opal_data_type_t type)
33 {
34 opal_dss_type_info_t *info;
35
36
37 if (NULL == value1 || NULL == value2) {
38 return OPAL_ERR_BAD_PARAM;
39 }
40
41
42
43 if (NULL == (info = (opal_dss_type_info_t*)opal_pointer_array_get_item(&opal_dss_types, type))) {
44 return OPAL_ERR_UNKNOWN_DATA_TYPE;
45 }
46
47 return info->odti_compare_fn(value1, value2, type);
48 }
49
50
51
52
53 int opal_dss_compare_int(int *value1, int *value2, opal_data_type_t type)
54 {
55 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
56
57 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
58
59 return OPAL_EQUAL;
60 }
61
62 int opal_dss_compare_uint(unsigned int *value1, unsigned int *value2, opal_data_type_t type)
63 {
64 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
65
66 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
67
68 return OPAL_EQUAL;
69 }
70
71 int opal_dss_compare_size(size_t *value1, size_t *value2, opal_data_type_t type)
72 {
73 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
74
75 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
76
77 return OPAL_EQUAL;
78 }
79
80 int opal_dss_compare_pid(pid_t *value1, pid_t *value2, opal_data_type_t type)
81 {
82 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
83
84 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
85
86 return OPAL_EQUAL;
87 }
88
89 int opal_dss_compare_byte(char *value1, char *value2, opal_data_type_t type)
90 {
91 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
92
93 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
94
95 return OPAL_EQUAL;
96 }
97
98 int opal_dss_compare_char(char *value1, char *value2, opal_data_type_t type)
99 {
100 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
101
102 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
103
104 return OPAL_EQUAL;
105 }
106
107 int opal_dss_compare_int8(int8_t *value1, int8_t *value2, opal_data_type_t type)
108 {
109 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
110
111 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
112
113 return OPAL_EQUAL;
114 }
115
116 int opal_dss_compare_uint8(uint8_t *value1, uint8_t *value2, opal_data_type_t type)
117 {
118 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
119
120 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
121
122 return OPAL_EQUAL;
123 }
124
125 int opal_dss_compare_int16(int16_t *value1, int16_t *value2, opal_data_type_t type)
126 {
127 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
128
129 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
130
131 return OPAL_EQUAL;
132 }
133
134 int opal_dss_compare_uint16(uint16_t *value1, uint16_t *value2, opal_data_type_t type)
135 {
136 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
137
138 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
139
140 return OPAL_EQUAL;
141 }
142
143 int opal_dss_compare_int32(int32_t *value1, int32_t *value2, opal_data_type_t type)
144 {
145 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
146
147 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
148
149 return OPAL_EQUAL;
150 }
151
152 int opal_dss_compare_uint32(uint32_t *value1, uint32_t *value2, opal_data_type_t type)
153 {
154 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
155
156 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
157
158 return OPAL_EQUAL;
159 }
160
161 int opal_dss_compare_int64(int64_t *value1, int64_t *value2, opal_data_type_t type)
162 {
163 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
164
165 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
166
167 return OPAL_EQUAL;
168 }
169
170 int opal_dss_compare_uint64(uint64_t *value1, uint64_t *value2, opal_data_type_t type)
171 {
172 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
173
174 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
175
176 return OPAL_EQUAL;
177 }
178
179 int opal_dss_compare_float(float *value1, float *value2, opal_data_type_t type)
180 {
181 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
182
183 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
184
185 return OPAL_EQUAL;
186 }
187
188 int opal_dss_compare_double(double *value1, double *value2, opal_data_type_t type)
189 {
190 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
191
192 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
193
194 return OPAL_EQUAL;
195 }
196
197
198
199
200
201
202 int opal_dss_compare_null(char *value1, char *value2, opal_data_type_t type)
203 {
204 return OPAL_EQUAL;
205 }
206
207
208 int opal_dss_compare_bool(bool *value1, bool *value2, opal_data_type_t type)
209 {
210 if (*value1 && !(*value2)) return OPAL_VALUE1_GREATER;
211
212 if (*value2 && !(*value1)) return OPAL_VALUE2_GREATER;
213
214 return OPAL_EQUAL;
215
216 }
217
218
219 int opal_dss_compare_string(char *value1, char *value2, opal_data_type_t type)
220 {
221 if (0 < strcmp(value1, value2)) return OPAL_VALUE2_GREATER;
222
223 if (0 > strcmp(value1, value2)) return OPAL_VALUE1_GREATER;
224
225 return OPAL_EQUAL;
226 }
227
228
229 int opal_dss_compare_timeval(struct timeval *value1, struct timeval *value2, opal_data_type_t type)
230 {
231 if (value1->tv_sec > value2->tv_sec) return OPAL_VALUE1_GREATER;
232 if (value2->tv_sec > value1->tv_sec) return OPAL_VALUE2_GREATER;
233
234
235 if (value1->tv_usec > value2->tv_usec) return OPAL_VALUE1_GREATER;
236 if (value2->tv_usec > value1->tv_usec) return OPAL_VALUE2_GREATER;
237
238 return OPAL_EQUAL;
239 }
240
241
242 int opal_dss_compare_time(time_t *value1, time_t *value2, opal_data_type_t type)
243 {
244 if (value1 > value2) return OPAL_VALUE1_GREATER;
245 if (value2 > value1) return OPAL_VALUE2_GREATER;
246
247 return OPAL_EQUAL;
248 }
249
250
251
252 int opal_dss_compare_dt(opal_data_type_t *value1, opal_data_type_t *value2, opal_data_type_t type)
253 {
254 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
255
256 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
257
258 return OPAL_EQUAL;
259 }
260
261
262 int opal_dss_compare_byte_object(opal_byte_object_t *value1, opal_byte_object_t *value2, opal_data_type_t type)
263 {
264 int checksum, diff;
265 int32_t i;
266
267
268 if (value1->size > value2->size) return OPAL_VALUE1_GREATER;
269
270 if (value2->size > value1->size) return OPAL_VALUE2_GREATER;
271
272
273
274
275 checksum = 0;
276
277 for (i=0; i < value1->size; i++) {
278
279 diff = value1->bytes[i] - value2->bytes[i];
280 if (INT_MAX-abs(checksum)-abs(diff) < 0) {
281 checksum = 0;
282 }
283 checksum += diff;
284 }
285
286 if (0 > checksum) return OPAL_VALUE2_GREATER;
287
288 if (0 < checksum) return OPAL_VALUE1_GREATER;
289
290 return OPAL_EQUAL;
291 }
292
293
294 int opal_dss_compare_pstat(opal_pstats_t *value1, opal_pstats_t *value2, opal_data_type_t type)
295 {
296 return OPAL_EQUAL;
297 }
298
299
300 int opal_dss_compare_node_stat(opal_node_stats_t *value1, opal_node_stats_t *value2, opal_data_type_t type)
301 {
302 return OPAL_EQUAL;
303 }
304
305
306 int opal_dss_compare_value(opal_value_t *value1, opal_value_t *value2, opal_data_type_t type)
307 {
308 if (NULL == value1 && NULL == value2) {
309 return OPAL_EQUAL;
310 }
311 if (NULL == value2) {
312 return OPAL_VALUE1_GREATER;
313 }
314 if (NULL == value1) {
315 return OPAL_VALUE2_GREATER;
316 }
317 if (value1->type != value2->type) {
318 opal_output(0, "COMPARE-OPAL-VALUE: INCONSISTENT TYPE %d vs %d", (int)value1->type, (int)value2->type);
319 return OPAL_EQUAL;
320 }
321 switch (value1->type) {
322 case OPAL_BYTE:
323 return opal_dss_compare_byte((char *)&value1->data.byte, (char *)&value2->data.byte, type);
324 case OPAL_STRING:
325 return opal_dss_compare_string(value1->data.string, value2->data.string, type);
326 case OPAL_PID:
327 return opal_dss_compare_pid(&value1->data.pid, &value2->data.pid, type);
328 case OPAL_INT:
329 return opal_dss_compare_int(&value1->data.integer, &value2->data.integer, type);
330 case OPAL_INT8:
331 return opal_dss_compare_int8(&value1->data.int8, &value2->data.int8, type);
332 case OPAL_INT16:
333 return opal_dss_compare_int16(&value1->data.int16, &value2->data.int16, type);
334 case OPAL_INT32:
335 return opal_dss_compare_int32(&value1->data.int32, &value2->data.int32, type);
336 case OPAL_INT64:
337 return opal_dss_compare_int64(&value1->data.int64, &value2->data.int64, type);
338 case OPAL_UINT:
339 return opal_dss_compare_uint(&value1->data.uint, &value2->data.uint, type);
340 case OPAL_UINT8:
341 return opal_dss_compare_uint8(&value1->data.uint8, &value2->data.uint8, type);
342 case OPAL_UINT16:
343 return opal_dss_compare_uint16(&value1->data.uint16, &value2->data.uint16, type);
344 case OPAL_UINT32:
345 return opal_dss_compare_uint32(&value1->data.uint32, &value2->data.uint32, type);
346 case OPAL_UINT64:
347 return opal_dss_compare_uint64(&value1->data.uint64, &value2->data.uint64, type);
348 case OPAL_BYTE_OBJECT:
349 return opal_dss_compare_byte_object(&value1->data.bo, &value2->data.bo, type);
350 case OPAL_SIZE:
351 return opal_dss_compare_size(&value1->data.size, &value2->data.size, type);
352 case OPAL_FLOAT:
353 return opal_dss_compare_float(&value1->data.fval, &value2->data.fval, type);
354 case OPAL_DOUBLE:
355 return opal_dss_compare_double(&value1->data.dval, &value2->data.dval, type);
356 case OPAL_BOOL:
357 return opal_dss_compare_bool(&value1->data.flag, &value2->data.flag, type);
358 case OPAL_TIMEVAL:
359 return opal_dss_compare_timeval(&value1->data.tv, &value2->data.tv, type);
360 case OPAL_NAME:
361 return opal_dss_compare_name(&value1->data.name, &value2->data.name, type);
362 case OPAL_ENVAR:
363 return opal_dss_compare_envar(&value1->data.envar, &value2->data.envar, type);
364 default:
365 opal_output(0, "COMPARE-OPAL-VALUE: UNSUPPORTED TYPE %d", (int)value1->type);
366 return OPAL_EQUAL;
367 }
368 }
369
370
371 int opal_dss_compare_buffer_contents(opal_buffer_t *value1, opal_buffer_t *value2, opal_data_type_t type)
372 {
373 return OPAL_EQUAL;
374 }
375
376
377 int opal_dss_compare_name(opal_process_name_t *value1,
378 opal_process_name_t *value2,
379 opal_data_type_t type)
380 {
381 if (NULL == value1 && NULL == value2) {
382 return OPAL_EQUAL;
383 } else if (NULL == value1) {
384 return OPAL_VALUE2_GREATER;
385 } else if (NULL == value2) {
386 return OPAL_VALUE1_GREATER;
387 }
388
389
390
391
392
393
394
395
396
397
398
399 if (value1->jobid != OPAL_JOBID_WILDCARD &&
400 value2->jobid != OPAL_JOBID_WILDCARD) {
401 if (value1->jobid < value2->jobid) {
402 return OPAL_VALUE2_GREATER;
403 } else if (value1->jobid > value2->jobid) {
404 return OPAL_VALUE1_GREATER;
405 }
406 }
407
408
409
410
411 if (value1->vpid != OPAL_VPID_WILDCARD &&
412 value2->vpid != OPAL_VPID_WILDCARD) {
413 if (value1->vpid < value2->vpid) {
414 return OPAL_VALUE2_GREATER;
415 } else if (value1->vpid > value2->vpid) {
416 return OPAL_VALUE1_GREATER;
417 }
418 }
419
420
421 return OPAL_EQUAL;
422 }
423
424 int opal_dss_compare_vpid(opal_vpid_t *value1,
425 opal_vpid_t *value2,
426 opal_data_type_t type)
427 {
428
429 if (*value1 == OPAL_VPID_WILDCARD ||
430 *value2 == OPAL_VPID_WILDCARD) return OPAL_EQUAL;
431
432 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
433
434 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
435
436 return OPAL_EQUAL;
437 }
438
439 int opal_dss_compare_jobid(opal_jobid_t *value1,
440 opal_jobid_t *value2,
441 opal_data_type_t type)
442 {
443
444 if (*value1 == OPAL_JOBID_WILDCARD ||
445 *value2 == OPAL_JOBID_WILDCARD) return OPAL_EQUAL;
446
447 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
448
449 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
450
451 return OPAL_EQUAL;
452 }
453
454 int opal_dss_compare_status(int *value1, int *value2, opal_data_type_t type)
455 {
456 if (*value1 > *value2) return OPAL_VALUE1_GREATER;
457
458 if (*value2 > *value1) return OPAL_VALUE2_GREATER;
459
460 return OPAL_EQUAL;
461 }
462
463 int opal_dss_compare_envar(opal_envar_t *value1, opal_envar_t *value2, opal_data_type_t type)
464 {
465 int rc;
466
467 if (NULL != value1->envar) {
468 if (NULL == value2->envar) {
469 return OPAL_VALUE1_GREATER;
470 }
471 rc = strcmp(value1->envar, value2->envar);
472 if (rc < 0) {
473 return OPAL_VALUE2_GREATER;
474 } else if (0 < rc) {
475 return OPAL_VALUE1_GREATER;
476 }
477 } else if (NULL != value2->envar) {
478
479 return OPAL_VALUE2_GREATER;
480 }
481
482
483 if (NULL != value1->value) {
484 if (NULL == value2->value) {
485 return OPAL_VALUE1_GREATER;
486 }
487 rc = strcmp(value1->value, value2->value);
488 if (rc < 0) {
489 return OPAL_VALUE2_GREATER;
490 } else if (0 < rc) {
491 return OPAL_VALUE1_GREATER;
492 }
493 } else if (NULL != value2->value) {
494
495 return OPAL_VALUE2_GREATER;
496 }
497
498
499 if (value1->separator < value2->separator) {
500 return OPAL_VALUE2_GREATER;
501 }
502 if (value2->separator < value1->separator) {
503 return OPAL_VALUE1_GREATER;
504 }
505 return OPAL_EQUAL;
506 }