2294 static PyObject *
2295 ArmSubbufferMetricValues_set_value (ArmSubbufferMetricValues *self, PyObject *args)
2296 {
2297 int slot;
2298 int format;
2299 int usage;
2300 int parsed;
2301 arm_int64_t value64;
2302 arm_int32_t value32;
2303 arm_int32_t div32;
2304 const char *string_ptr = NULL;
2305
2306 int i;
2307 int index;
2308
2309 /* Poor man's polymorphism */
2310 parsed = PyArg_ParseTuple(args, "iii" PARSE_INT64_FMT ":set_value", &slot, &format, &usage, &value64);
when PyArg_ParseTuple() succeeds
2311 if (!parsed)
taking False path
2312 {
2313 PyErr_Clear ();
2314 parsed = PyArg_ParseTuple(args, "iii" PARSE_INT32_FMT PARSE_INT32_FMT ":set_value", &slot, &format, &usage, &value32, &div32);
2315 }
2316 if (!parsed)
taking False path
2317 {
2318 PyErr_Clear ();
2319 if (!PyArg_ParseTuple(args, "iis:set_value", &slot, &usage, &string_ptr))
2320 return NULL;
2321 }
2322
2323 if ((slot < ARM_METRIC_MIN_ARRAY_INDEX) || (slot > ARM_METRIC_MAX_ARRAY_INDEX))
when considering range: -0x80000000 <= value <= 6
taking False path
2324 return NULL;
2325
2326 if (string_ptr && (strlen (string_ptr) > 0))
taking False path
2327 format = ARM_METRIC_FORMAT_STRING32;
2328
2329 /* Allocate the metric binding array as required */
2330 if (self->arm_buffer.metric_value_array == NULL)
when treating unknown const struct arm_metric_t * from arm4module.c:2330 as non-NULL
taking False path
2331 {
2332 self->arm_buffer.metric_value_array = calloc (sizeof (arm_metric_t), ARM_METRIC_MAX_COUNT);
2333 memset ((void *) self->arm_buffer.metric_value_array, 0, sizeof (arm_metric_t) * ARM_METRIC_MAX_COUNT);
2334 }
2335
2336 /* See if an entry already exists */
2337 index = self->arm_buffer.count; /* Default index for a new value */
2338 for (i = 0; i < self->arm_buffer.count; i++)
when considering range: -0x80000000 <= value <= 0
taking False path
2339 {
2340 if (self->arm_buffer.metric_value_array [i].slot == slot)
2341 {
2342 index = i;
2343 break;
2344 }
2345 }
2346 if (index == self->arm_buffer.count)
when taking True path
2347 self->arm_buffer.count++;
2348
2349 /* Copy the values */
2350 if (index >= ARM_METRIC_MAX_ARRAY_INDEX)
when considering range: 6 <= value <= 0x7fffffff
taking True path
2351 return NULL;
2352 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].slot = slot;
2353 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].format = format;
2354 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].usage = usage;
2355 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].valid = ARM_TRUE;
2356
2357 switch (format)
2358 {
2359 case ARM_METRIC_FORMAT_COUNTER32:
2360 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.counter32 = value64;
2361 break;
2362
2363 case ARM_METRIC_FORMAT_COUNTER64:
2364 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.counter64 = value64;
2365 break;
2366
2367 case ARM_METRIC_FORMAT_GAUGE32:
2368 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.gauge32 = value64;
2369 break;
2370
2371 case ARM_METRIC_FORMAT_GAUGE64:
2372 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.gauge64 = value64;
2373 break;
2374
2375 case ARM_METRIC_FORMAT_NUMERICID32:
2376 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.numericid32 = value64;
2377 break;
2378
2379 case ARM_METRIC_FORMAT_NUMERICID64:
2380 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.numericid64 = value64;
2381 break;
2382
2383 case ARM_METRIC_FORMAT_CNTRDIVR32:
2384 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.counterdivisor32.counter = value32;
2385 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.counterdivisor32.divisor = div32;
2386 break;
2387
2388 case ARM_METRIC_FORMAT_GAUGEDIVR32:
2389 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.gaugedivisor32.gauge = value32;
2390 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.gaugedivisor32.divisor = div32;
2391 break;
2392
2393 case ARM_METRIC_FORMAT_STRING32:
2394 ((arm_metric_t *) self->arm_buffer.metric_value_array) [index].metric_u.string32 = strndup (string_ptr, ARM_METRIC_STRING32_MAX_CHARS);
2395 break;
2396 }
2397
2398 Py_INCREF(Py_None);
2399 return Py_None;
2400 }
returning (PyObject*)NULL without setting an exception