/* * FIXME: 1) remove _set_address, make this function callable with result of same * 2) differentiate between reasons for "we didn't add" (now -1 in all cases) */ int network_backends_add(network_backends_t *bs, /* const */ gchar *address, backend_type_t type) { network_backend_t *new_backend; guint i; new_backend = network_backend_new(); new_backend->type = type; if (0 != network_address_set_address(new_backend->addr, address)) { network_backend_free(new_backend); return -1; } /* check if this backend is already known */ g_mutex_lock(bs->backends_mutex); for (i = 0; i < bs->backends->len; i++) { network_backend_t *old_backend = bs->backends->pdata[i]; if (strleq(S(old_backend->addr->name), S(new_backend->addr->name))) { network_backend_free(new_backend); g_mutex_unlock(bs->backends_mutex); g_critical("backend %s is already known!", address); return -1; } } g_ptr_array_add(bs->backends, new_backend); g_mutex_unlock(bs->backends_mutex); g_message("added %s backend: %s", (type == BACKEND_TYPE_RW) ? "read/write" : "read-only", address); return 0; }
void network_backends_free(network_backends_t *bs) { gsize i; if (!bs) return; g_mutex_lock(bs->backends_mutex); /*remove lock*/ for (i = 0; i < bs->backends->len; i++) { network_backend_t *backend = bs->backends->pdata[i]; network_backend_free(backend); } g_mutex_unlock(bs->backends_mutex); /*remove lock*/ g_ptr_array_free(bs->backends, TRUE); for (i = 0; i < bs->recycle_backends->len; i++) { network_backend_t * b = g_ptr_array_index(bs->recycle_backends, i); network_backend_free(b); } g_ptr_array_free(bs->recycle_backends, TRUE); g_mutex_free(bs->backends_mutex); /*remove lock*/ g_free(bs->config_path); g_wrr_poll_free(bs->global_wrr); g_free(bs); }
int network_backends_remove_unlock(network_backends_t *bs, guint index) { int i; network_backend_t* item = NULL; if (index >= bs->backends->len) { g_message("%s:network_backends_remove error,the index is out the length of array", G_STRLOC); return -1; } item = g_ptr_array_index(bs->backends, index); if (item != NULL) { if (item->connected_clients == 0) { network_backend_free(item); g_ptr_array_remove_index(bs->backends, index); } else if (item->connected_clients > 0) { for (i = 0; i < bs->recycle_backends->len; i++) { network_backend_t * b = g_ptr_array_index(bs->recycle_backends, i); if (b->connected_clients == 0) { network_backend_free(b); g_ptr_array_remove_index(bs->recycle_backends, i); } } g_ptr_array_add(bs->recycle_backends, item); g_ptr_array_remove_index(bs->backends, index); } else { g_message("%s:network_backends_remove error, connected_clients less than 0", G_STRLOC); } } return 0; }
/* * FIXME: 1) remove _set_address, make this function callable with result of same * 2) differentiate between reasons for "we didn't add" (now -1 in all cases) */ int network_backends_add(network_backends_t *bs, /* const */ gchar *address, backend_type_t type) { network_backend_t *new_backend; guint i; new_backend = network_backend_new(bs->event_thread_count); new_backend->type = type; gchar *p = NULL; if (type == BACKEND_TYPE_RO) { guint weight = 1; p = strrchr(address, '@'); if (p != NULL) { *p = '\0'; weight = atoi(p+1); } new_backend->weight = weight; } if (0 != network_address_set_address(new_backend->addr, address)) { network_backend_free(new_backend); return -1; } /* check if this backend is already known */ g_mutex_lock(bs->backends_mutex); /*remove lock*/ gint first_slave = -1; for (i = 0; i < bs->backends->len; i++) { network_backend_t *old_backend = bs->backends->pdata[i]; if (first_slave == -1 && old_backend->type == BACKEND_TYPE_RO) first_slave = i; if (old_backend->type == type && strleq(S(old_backend->addr->name), S(new_backend->addr->name))) { network_backend_free(new_backend); g_mutex_unlock(bs->backends_mutex); /*remove lock*/ g_critical("backend %s is already known!", address); return -1; } } g_ptr_array_add(bs->backends, new_backend); if (first_slave != -1 && type == BACKEND_TYPE_RW) { network_backend_t *temp_backend = bs->backends->pdata[first_slave]; bs->backends->pdata[first_slave] = bs->backends->pdata[bs->backends->len - 1]; bs->backends->pdata[bs->backends->len - 1] = temp_backend; } g_mutex_unlock(bs->backends_mutex); /*remove lock*/ g_message("added %s backend: %s", (type == BACKEND_TYPE_RW) ? "read/write" : "read-only", address); if (p != NULL) *p = '@'; return 0; }
void network_backends_free(network_backends_t *bs) { gsize i; if (!bs) return; g_mutex_lock(bs->backends_mutex); for (i = 0; i < bs->backends->len; i++) { network_backend_t *backend = bs->backends->pdata[i]; network_backend_free(backend); } g_mutex_unlock(bs->backends_mutex); g_ptr_array_free(bs->backends, TRUE); g_mutex_free(bs->backends_mutex); g_free(bs); }
void network_backends_free(network_backends_t *bs) { gsize i; if (!bs) return; g_mutex_lock(bs->backends_mutex); /*remove lock*/ for (i = 0; i < bs->backends->len; i++) { network_backend_t *backend = bs->backends->pdata[i]; network_backend_free(backend); } g_mutex_unlock(bs->backends_mutex); /*remove lock*/ g_ptr_array_free(bs->backends, TRUE); g_mutex_free(bs->backends_mutex); /*remove lock*/ g_wrr_poll_free(bs->global_wrr); g_free(bs->default_file); g_free(bs); }
/** * @deprecated: will be removed in 1.0 * @see network_backend_free() */ void backend_free(network_backend_t *b) { network_backend_free(b); }