+
+ return viable;
+}
+
+void release_agent_blk(lutf_agent_blk_t *agent, int dead)
+{
+ assert(agent);
+
+ MUTEX_LOCK(&agent_array_mutex);
+ MUTEX_LOCK(&agent->mutex);
+
+ if (agent->state & LUTF_AGENT_STATE_ALIVE) {
+ /* sanity check */
+ assert(agent_live_list[agent->id] != NULL &&
+ agent_live_list[agent->id] == agent);
+ } else {
+ MUTEX_UNLOCK(&agent->mutex);
+ del_dead_agent_locked(agent);
+ MUTEX_UNLOCK(&agent_array_mutex);
+ return;
+ }
+
+ assert(agent->ref_count > 0);
+ agent->ref_count--;
+
+ if (agent->ref_count == 0) {
+ agent_live_list[agent->id] = NULL;
+ assert(!(agent->state & LUTF_AGENT_WORK_IN_PROGRESS));
+ MUTEX_UNLOCK(&agent->mutex);
+ MUTEX_UNLOCK(&agent_array_mutex);
+ close_agent_connection(agent);
+ memset(agent, 0xdeadbeef, sizeof(*agent));
+ /* free the block */
+ free(agent);
+ } else if (dead) {
+ agent_live_list[agent->id] = NULL;
+ insert_dead_agent_locked(agent);
+ MUTEX_UNLOCK(&agent->mutex);
+ MUTEX_UNLOCK(&agent_array_mutex);
+ unset_agent_state(agent, LUTF_AGENT_STATE_ALIVE);
+ unset_agent_state(agent, LUTF_AGENT_RPC_CHANNEL_CONNECTED);
+ unset_agent_state(agent, LUTF_AGENT_HB_CHANNEL_CONNECTED);
+ close_agent_connection(agent);
+ } else {
+ MUTEX_UNLOCK(&agent->mutex);
+ MUTEX_UNLOCK(&agent_array_mutex);
+ }