/*
 * Copyright 2014, Paweł Dziepak, pdziepak@quarnos.org.
 * Distributed under the terms of the MIT License.
 */
#ifndef ELF_TLS_H
#define ELF_TLS_H
 
 
#include "runtime_loader_private.h"
#include "utility.h"
 
 
class TLSBlock;
 
class TLSBlockTemplate {
public:
						TLSBlockTemplate() { }
	inline				TLSBlockTemplate(void* address, size_t fileSize,
							size_t memorySize);
 
			void		SetGeneration(unsigned generation)
							{ fGeneration = generation; }
			unsigned	Generation() const	{ return fGeneration; }
 
			void		SetBaseAddress(addr_t baseAddress);
 
			TLSBlock	CreateBlock();
 
private:
			unsigned	fGeneration;
 
			void*		fAddress;
			size_t		fFileSize;
			size_t		fMemorySize;
};
 
class TLSBlockTemplates {
public:
	static	TLSBlockTemplates&	Get();
 
			unsigned	Register(const TLSBlockTemplate& block);
			void		Unregister(unsigned dso);
 
			void		SetBaseAddress(unsigned dso, addr_t baseAddress);
 
			unsigned	GetGeneration(unsigned dso) const;
 
			TLSBlock	CreateBlock(unsigned dso);
 
private:
	inline				TLSBlockTemplates();
 
	static	TLSBlockTemplates*	fInstance;
 
			unsigned	fGeneration;
 
			utility::vector<TLSBlockTemplate>	fTemplates;
			utility::vector<unsigned>	fFreeDSOs;
};
 
 
TLSBlockTemplate::TLSBlockTemplate(void* address, size_t fileSize,
	size_t memorySize)
	:
	fAddress(address),
	fFileSize(fileSize),
	fMemorySize(memorySize)
{
}
 
 
void*	get_tls_address(unsigned dso, addr_t offset);
void	destroy_thread_tls();
 
 
#endif	// ELF_TLS_H

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fGeneration.