// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PRINTING_BACKEND_CUPS_CONNECTION_POOL_H_
#define PRINTING_BACKEND_CUPS_CONNECTION_POOL_H_
#include "base/component_export.h"
#include "base/containers/queue.h"
#include "base/sequence_checker.h"
#include "printing/backend/cups_deleters.h"
namespace printing {
// The CupsConnectionPool provides the ability to open some connections to the
// CUPS server at an early stage and then make them available for use across
// the duration of a process's lifetime. This enables CUPS connections to be
// available from within sandboxed processes, where calls that need to open a
// new socket to the CUPS server would fail with access denied.
class COMPONENT_EXPORT(PRINT_BACKEND) CupsConnectionPool {
public:
// Create the connection pool, loading it with a predetermined number of
// initial connections.
static void Create();
CupsConnectionPool(const CupsConnectionPool&) = delete;
CupsConnectionPool& operator=(const CupsConnectionPool&) = delete;
static CupsConnectionPool* GetInstance();
// Take a connection from the pool to be used for communicating with the CUPS
// server. Returns nullptr if all of the connections have already been taken.
ScopedHttpPtr TakeConnection();
// Add a connection to the pool of available connections.
void AddConnection(ScopedHttpPtr connection);
// Check if there are any connections available for use.
bool IsConnectionAvailable() const { return !connections_.empty(); }
private:
CupsConnectionPool();
~CupsConnectionPool();
base::queue<ScopedHttpPtr> connections_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace printing
#endif // PRINTING_BACKEND_CUPS_CONNECTION_POOL_H_