/*
* Copyright (c) 2020 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/threadConfig.h#1 $
*/
#ifndef THREAD_CONFIG_H
#define THREAD_CONFIG_H
#include "permassert.h"
#include "types.h"
struct threadConfig {
ZoneCount logicalZoneCount;
ZoneCount physicalZoneCount;
ZoneCount hashZoneCount;
ThreadCount baseThreadCount;
ThreadID adminThread;
ThreadID journalThread;
ThreadID packerThread;
ThreadID *logicalThreads;
ThreadID *physicalThreads;
ThreadID *hashZoneThreads;
};
/**
* Make a thread configuration. If both the logical zone count and the
* physical zone count are set to 0, a one thread configuration will be
* made.
*
* @param [in] logicalZoneCount The number of logical zones
* @param [in] physicalZoneCount The number of physical zones
* @param [in] hashZoneCount The number of hash zones
* @param [out] configPtr A pointer to hold the new thread
* configuration
*
* @return VDO_SUCCESS or an error
**/
int makeThreadConfig(ZoneCount logicalZoneCount,
ZoneCount physicalZoneCount,
ZoneCount hashZoneCount,
ThreadConfig **configPtr)
__attribute__((warn_unused_result));
/**
* Make a thread configuration that uses no threads. This is the configuration
* for VDOs which are constructed from user mode that have only a synchronous
* layer.
*
* @param [out] configPtr A pointer to hold the new thread configuration
*
* @return VDO_SUCCESS or an error
**/
int makeZeroThreadConfig(ThreadConfig **configPtr);
/**
* Make a thread configuration that uses only one thread.
*
* @param [out] configPtr A pointer to hold the new thread configuration
*
* @return VDO_SUCCESS or an error
**/
int makeOneThreadConfig(ThreadConfig **configPtr)
__attribute__((warn_unused_result));
/**
* Make a new thread config which is a copy of an existing one.
*
* @param [in] oldConfig The thread configuration to copy
* @param [out] configPtr A pointer to hold the new thread configuration
*
* @return VDO_SUCCESS or an error
**/
int copyThreadConfig(const ThreadConfig *oldConfig, ThreadConfig **configPtr)
__attribute__((warn_unused_result));
/**
* Destroy a thread configuration and null out the reference to it.
*
* @param configPtr The reference to the thread configuration to destroy
**/
void freeThreadConfig(ThreadConfig **configPtr);
/**
* Get the thread id for a given logical zone.
*
* @param threadConfig the thread config
* @param logicalZone the number of the logical zone
*
* @return the thread id for the given zone
**/
__attribute__((warn_unused_result))
static inline ThreadID getLogicalZoneThread(const ThreadConfig *threadConfig,
ZoneCount logicalZone)
{
ASSERT_LOG_ONLY((logicalZone <= threadConfig->logicalZoneCount),
"logical zone valid");
return threadConfig->logicalThreads[logicalZone];
}
/**
* Get the thread id for a given physical zone.
*
* @param threadConfig the thread config
* @param physicalZone the number of the physical zone
*
* @return the thread id for the given zone
**/
__attribute__((warn_unused_result))
static inline ThreadID getPhysicalZoneThread(const ThreadConfig *threadConfig,
ZoneCount physicalZone)
{
ASSERT_LOG_ONLY((physicalZone <= threadConfig->physicalZoneCount),
"physical zone valid");
return threadConfig->physicalThreads[physicalZone];
}
/**
* Get the thread id for a given hash zone.
*
* @param threadConfig the thread config
* @param hashZone the number of the hash zone
*
* @return the thread id for the given zone
**/
__attribute__((warn_unused_result))
static inline ThreadID getHashZoneThread(const ThreadConfig *threadConfig,
ZoneCount hashZone)
{
ASSERT_LOG_ONLY((hashZone <= threadConfig->hashZoneCount),
"hash zone valid");
return threadConfig->hashZoneThreads[hashZone];
}
/**
* Get the thread id for the journal zone.
*
* @param threadConfig the thread config
*
* @return the thread id for the journal zone
**/
__attribute__((warn_unused_result))
static inline ThreadID getJournalZoneThread(const ThreadConfig *threadConfig)
{
return threadConfig->journalThread;
}
/**
* Get the thread id for the packer zone.
*
* @param threadConfig the thread config
*
* @return the thread id for the packer zone
**/
__attribute__((warn_unused_result))
static inline ThreadID getPackerZoneThread(const ThreadConfig *threadConfig)
{
return threadConfig->packerThread;
}
/**
* Get the thread ID for admin requests.
*
* @param threadConfig The thread config
*
* @return the thread id to use for admin requests
**/
__attribute__((warn_unused_result))
static inline ThreadID getAdminThread(const ThreadConfig *threadConfig)
{
return threadConfig->adminThread;
}
/**
* Format the name of the worker thread desired to support a given
* work queue. The physical layer may add a prefix identifying the
* product; the output from this function should just identify the
* thread.
*
* @param threadConfig The thread configuration
* @param threadID The thread id
* @param buffer Where to put the formatted name
* @param bufferLength Size of the output buffer
**/
void getVDOThreadName(const ThreadConfig *threadConfig,
ThreadID threadID,
char *buffer,
size_t bufferLength);
#endif /* THREAD_CONFIG_H */