summaryrefslogtreecommitdiff
path: root/public/include/XMPCommon/Interfaces/BaseInterfaces/IThreadSafe.h
blob: 54b56b1aec7010bd399e37c55118b7a3701b245a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! @file IThreadSafe.h
#ifndef IThreadSafe_h__
#define IThreadSafe_h__ 1

//
// =================================================================================================
// Copyright Adobe
// Copyright 2015 Adobe
// All Rights Reserved
//
// NOTICE:  Adobe permits you to use, modify, and distribute this file in accordance with the terms
// of the Adobe license agreement accompanying it. If you have received this file from a source other 
// than Adobe, then your use, modification, or distribution of it requires the prior written permission
// of Adobe.
// =================================================================================================
//

#include "XMPCommon/XMPCommonFwdDeclarations.h"

namespace AdobeXMPCommon {
	
	//!
	//! \brief Interface that serves as the base interface for all the externally exposed interfaces which needs to provide client configurable thread safety.
	//!          
	//! \attention In case client has disabled thread safety at the module level these functions will
	//!  have no use.
	//! \note By default all the objects created are not thread safe.
	//!
	class XMP_PUBLIC IThreadSafe
	{
	public:

		//!
		//! @brief Enables the thread safety on an object.
		//! @details After calling this function the object can be used across multiple threads.
		//!
		virtual void APICALL EnableThreadSafety() const __NOTHROW__ = 0;

		//!
		//! @brief Disables the thread safety on an object.
		//! @details After calling this function the object should not be used across multiple threads.
		//!
		virtual void APICALL DisableThreadSafety() const __NOTHROW__ = 0;

		//!
		//! @brief Informs whether object can be used across multiple threads or not.
		//! \returns bool value; true in case object can be used across multiple threads, false
		//!  otherwise.
		//!
		virtual bool APICALL IsThreadSafe() const = 0;

		//! @{
		//! \cond XMP_INTERNAL_DOCUMENTATION
		//!  @brief Return the pointer to the internal Thread Safe interface
		//! \return either a const or non const pointer to internal IThreadSafe_I interface.
		virtual AdobeXMPCommon_Int::pIThreadSafe_I APICALL GetIThreadSafe_I() __NOTHROW__ = 0;

		XMP_PRIVATE AdobeXMPCommon_Int::pcIThreadSafe_I GetIThreadSafe_I() const __NOTHROW__ {
			return const_cast< IThreadSafe * >( this )->GetIThreadSafe_I();
		}
        virtual ~IThreadSafe(){}
		//! \endcond
		//! @}

	protected:
		//! \cond XMP_INTERNAL_DOCUMENTATION
		//! @brief all safe functions
		virtual uint32 APICALL isThreadSafe() const __NOTHROW__ = 0;
		//! \endcond

	#ifdef FRIEND_CLASS_DECLARATION
		FRIEND_CLASS_DECLARATION();
	#endif
		REQ_FRIEND_CLASS_DECLARATION();
	};

}
#endif  // IThreadSafe_h__