static int mb_shutdown (void) /* {{{ */ { data_free_all (data_definitions); data_definitions = NULL; return (0); } /* }}} int mb_shutdown */
static int mb_config_add_slave (mb_host_t *host, oconfig_item_t *ci) /* {{{ */ { mb_slave_t *slave; int status; int i; if ((host == NULL) || (ci == NULL)) return (EINVAL); slave = realloc (host->slaves, sizeof (*slave) * (host->slaves_num + 1)); if (slave == NULL) return (ENOMEM); host->slaves = slave; slave = host->slaves + host->slaves_num; memset (slave, 0, sizeof (*slave)); slave->collect = NULL; status = cf_util_get_int (ci, &slave->id); if (status != 0) return (status); for (i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; status = 0; if (strcasecmp ("Instance", child->key) == 0) status = cf_util_get_string_buffer (child, slave->instance, sizeof (slave->instance)); else if (strcasecmp ("Collect", child->key) == 0) { char buffer[1024]; status = cf_util_get_string_buffer (child, buffer, sizeof (buffer)); if (status == 0) data_copy_by_name (&slave->collect, data_definitions, buffer); status = 0; /* continue after failure. */ } else { ERROR ("Modbus plugin: Unknown configuration option: %s", child->key); status = -1; } if (status != 0) break; } if ((status == 0) && (slave->collect == NULL)) status = EINVAL; if (slave->id < 0) status = EINVAL; if (status == 0) host->slaves_num++; else /* if (status != 0) */ data_free_all (slave->collect); return (status); } /* }}} int mb_config_add_slave */
static void slaves_free_all (mb_slave_t *slaves, size_t slaves_num) /* {{{ */ { size_t i; if (slaves == NULL) return; for (i = 0; i < slaves_num; i++) data_free_all (slaves[i].collect); sfree (slaves); } /* }}} void slaves_free_all */
static void data_free_all (mb_data_t *data) /* {{{ */ { mb_data_t *next; if (data == NULL) return; next = data->next; data_free_one (data); data_free_all (next); } /* }}} void data_free_all */
NanostackSocket::~NanostackSocket() { nanostack_assert_locked(); if (mode != SOCKET_MODE_CLOSED) { close(); } if (socket_id >= 0) { int ret = socket_free(socket_id); MBED_ASSERT(0 == ret); MBED_ASSERT(socket_tbl[socket_id] == this); socket_id = -1; data_free_all(); } }
void NanostackSocket::close() { nanostack_assert_locked(); MBED_ASSERT(mode != SOCKET_MODE_CLOSED); if (socket_id >= 0) { int ret = socket_close(socket_id, (addr_valid ? &ns_address : NULL)); MBED_ASSERT(0 == ret); } else { MBED_ASSERT(SOCKET_MODE_UNOPENED == mode); } data_free_all(); mode = SOCKET_MODE_CLOSED; signal_event(); }