SilcBool silc_client_attribute_del(SilcClient client, SilcClientConnection conn, SilcAttribute attribute, SilcAttributePayload attr) { SilcBool ret; if (!conn->internal->attrs) return FALSE; if (attr) { attribute = silc_attribute_get_attribute(attr); ret = silc_hash_table_del_by_context(conn->internal->attrs, SILC_32_TO_PTR(attribute), attr); } else if (attribute) { silc_hash_table_find_foreach(conn->internal->attrs, SILC_32_TO_PTR(attribute), silc_client_attribute_del_foreach, conn); ret = TRUE; } else{ return FALSE; } if (ret) if (!silc_hash_table_count(conn->internal->attrs)) { silc_hash_table_free(conn->internal->attrs); conn->internal->attrs = NULL; } return ret; }
static void silc_client_attribute_del_foreach(void *key, void *context, void *user_context) { SilcClientConnection conn = user_context; SilcAttributePayload attr = context; SilcAttribute attribute; if (!attr) return; attribute = silc_attribute_get_attribute(attr); silc_hash_table_del_by_context(conn->internal->attrs, SILC_32_TO_PTR(attribute), attr); }
void silc_server_command_pending_signal(SilcServerCommand cmd) { SilcServerThread thread = cmd->thread; SilcServerPending pending = cmd->pending; if (!pending) return; silc_mutex_lock(thread->server->lock); /* Signal */ pending->reply = cmd; SILC_FSM_EVENT_SIGNAL(&pending->wait_reply); /* Remove from pending */ silc_hash_table_del_by_context(thread->server->pending_commands, SILC_32_TO_PTR(pending->cmd_ident), pending); silc_mutex_unlock(thread->server->lock); }
void silc_server_command_pending_free(SilcServerThread thread, SilcServerPending pending) { silc_mutex_lock(thread->server->lock); pending->refcnt--; if (pending->refcnt > 0) { silc_mutex_unlock(thread->server->lock); return; } /* If command reply context set, free it also */ if (pending->reply) { pending->reply->pending = NULL; silc_server_command_free(pending->reply); } /* Remove from pending commands */ silc_hash_table_del_by_context(thread->server->pending_commands, SILC_32_TO_PTR(pending->cmd_ident), pending); silc_free(pending); silc_mutex_unlock(thread->server->lock); }