static void
as_uv_connect_error(as_event_command* cmd, as_error* err)
{
	// Timer will be stopped in as_event_command_release().
	// Watcher has not been registered yet.
	
	// libuv requires uv_close if socket released after uv_tcp_init succeeds.
	// The socket is the first field in as_event_connection, so just use connection.
	// The close callback will also free as_event_connection memory.
	uv_close((uv_handle_t*)cmd->conn, as_uv_connection_closed);
	as_event_decr_conn(cmd);
	as_event_error_callback(cmd, err);
}
void
as_event_connect_error(as_event_command* cmd, as_error* err, int fd)
{
    // Only timer needs to be released on socket connection failure.
    // Watcher has not been registered yet.
    as_event_stop_timer(cmd);

    // Close fd when valid.
    if (fd >= 0) {
        close(fd);
    }
    cf_free(cmd->conn);
    as_event_decr_conn(cmd);
    as_event_error_callback(cmd, err);
}