pub fn release(pool: *ConnectionPool, connection: *Connection, io: Io) void pool: *ConnectionPoolconnection: *Connectionio: Io125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 pub fn release(pool: *ConnectionPool, connection: *Connection, io: Io) void {
pool.mutex.lockUncancelable(io);
defer pool.mutex.unlock(io);
pool.used.remove(&connection.pool_node);
if (connection.closing or pool.free_size == 0) return connection.destroy(io);
if (pool.free_len >= pool.free_size) {
const popped: *Connection = @alignCast(@fieldParentPtr("pool_node", pool.free.popFirst().?));
pool.free_len -= 1;
popped.destroy(io);
}
if (connection.proxied) {
// proxied connections go to the end of the queue, always try direct connections first
pool.free.prepend(&connection.pool_node);
} else {
pool.free.append(&connection.pool_node);
}
pool.free_len += 1;
}
Tries to release a connection back to the connection pool. If the connection is marked as closing, it will be closed instead.
Threadsafe.