1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2025-09-19 12:06:07 +08:00

Update CTSListBase & various schema system naming changes (#253)

This commit is contained in:
vanz696
2024-06-03 19:46:16 +03:00
committed by GitHub
parent f919c628dc
commit cc207907f5
3 changed files with 89 additions and 202 deletions

View File

@ -20,9 +20,9 @@ struct ResourceManifestDesc_t;
enum SchemaTypeScope_t : uint8 enum SchemaTypeScope_t : uint8
{ {
SCHEMA_TYPESCOPE_GLOBAL = 0, SCHEMA_GLOBAL_TYPE_SCOPE = 0,
SCHEMA_TYPESCOPE_LOCAL, SCHEMA_MODULE_LOCAL_TYPE_SCOPE,
SCHEMA_TYPESCOPE_DEFAULT, SCHEMA_DEFAULT_TYPE_SCOPE,
}; };
typedef void (*CompleteModuleRegistrationCallbackFn_t)(void*); typedef void (*CompleteModuleRegistrationCallbackFn_t)(void*);
@ -42,7 +42,7 @@ public:
virtual SchemaMetaInfoHandle_t<CSchemaType_Ptr> Type_Ptr( CSchemaType* pObjectType ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Ptr> Type_Ptr( CSchemaType* pObjectType ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic> Type_Atomic( const char* pszAtomicName, uint16 nSize, uint8 nAlignment ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic> Type_Atomic( const char* pszAtomicName, uint16 nSize, uint8 nAlignment ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_T> Type_Atomic_T( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, CSchemaType* pTemplateType ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_T> Type_Atomic_T( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, CSchemaType* pTemplateType ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_CollectionOfT> Type_Atomic_CollectionOfT( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, uint16 nElementSize, CSchemaType* pTemplateType, SchemaAtomicManipulatorFn_t manipulator ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_CollectionOfT> Type_Atomic_CollectionOfT( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, uint16 nElementSize, CSchemaType* pTemplateType, SchemaCollectionManipulatorFn_t manipulator ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_TT> Type_Atomic_TT( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, CSchemaType* pTemplateType, CSchemaType* pTemplateType2 ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_TT> Type_Atomic_TT( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, CSchemaType* pTemplateType, CSchemaType* pTemplateType2 ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_I> Type_Atomic_I( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, int nInterger ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_I> Type_Atomic_I( const char* pszAtomicName, uint16 nSize, uint8 nAlignment, int nInterger ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_DeclaredClass> Type_DeclaredClass( const char* pszClassName ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_DeclaredClass> Type_DeclaredClass( const char* pszClassName ) = 0;
@ -53,7 +53,7 @@ public:
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic> FindType_Atomic( int nAtomicID ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic> FindType_Atomic( int nAtomicID ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_T> FindType_Atomic_T( int nAtomicID, CSchemaType* pTemplateType ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_T> FindType_Atomic_T( int nAtomicID, CSchemaType* pTemplateType ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_CollectionOfT> FindType_Atomic_CollectionOfT( int nAtomicID, CSchemaType* pTemplateType, SchemaAtomicManipulatorFn_t manipulator ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_CollectionOfT> FindType_Atomic_CollectionOfT( int nAtomicID, CSchemaType* pTemplateType, SchemaCollectionManipulatorFn_t manipulator ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_TT> FindType_Atomic_TT( int nAtomicID, CSchemaType* pTemplateType, CSchemaType* pTemplateType2 ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_TT> FindType_Atomic_TT( int nAtomicID, CSchemaType* pTemplateType, CSchemaType* pTemplateType2 ) = 0;
virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_I> FindType_Atomic_I( int nAtomicID, int nInteger ) = 0; virtual SchemaMetaInfoHandle_t<CSchemaType_Atomic_I> FindType_Atomic_I( int nAtomicID, int nInteger ) = 0;
@ -84,9 +84,9 @@ public:
CSchemaSystemTypeScope* m_pGlobalTypeScope; CSchemaSystemTypeScope* m_pGlobalTypeScope;
bool m_bBuiltinTypesInitialized; bool m_bBuiltinTypesInitialized;
CSchemaType_Builtin m_BuiltinTypes[SCHEMA_BUILTIN_COUNT]; CSchemaType_Builtin m_BuiltinTypes[SCHEMA_BUILTIN_TYPE_COUNT];
CSchemaPtrMap<SchemaMetaInfoHandle_t<CSchemaType>, CSchemaType_Ptr*> m_Ptrs; CSchemaPtrMap<SchemaMetaInfoHandle_t<CSchemaType>, CSchemaType_Ptr*> m_Pointers;
CSchemaPtrMap<int, CSchemaType_Atomic*> m_Atomics; CSchemaPtrMap<int, CSchemaType_Atomic*> m_Atomics;
CSchemaPtrMap<AtomicTypeInfo_T_t, CSchemaType_Atomic_T*> m_AtomicsT; CSchemaPtrMap<AtomicTypeInfo_T_t, CSchemaType_Atomic_T*> m_AtomicsT;
CSchemaPtrMap<AtomicTypeInfo_T_t, CSchemaType_Atomic_CollectionOfT*> m_AtomicsCollectionOfT; CSchemaPtrMap<AtomicTypeInfo_T_t, CSchemaType_Atomic_CollectionOfT*> m_AtomicsCollectionOfT;

View File

@ -54,44 +54,42 @@ enum SchemaEnumFlags_t
enum SchemaTypeCategory_t : uint8 enum SchemaTypeCategory_t : uint8
{ {
SCHEMA_TYPE_BUILTIN = 0, SCHEMA_TYPE_BUILTIN = 0,
SCHEMA_TYPE_PTR, SCHEMA_TYPE_POINTER,
SCHEMA_TYPE_BITFIELD, SCHEMA_TYPE_BITFIELD,
SCHEMA_TYPE_FIXED_ARRAY, SCHEMA_TYPE_FIXED_ARRAY,
SCHEMA_TYPE_ATOMIC, SCHEMA_TYPE_ATOMIC,
SCHEMA_TYPE_DECLARED_CLASS, SCHEMA_TYPE_DECLARED_CLASS,
SCHEMA_TYPE_DECLARED_ENUM, SCHEMA_TYPE_DECLARED_ENUM,
SCHEMA_TYPE_NONE, SCHEMA_TYPE_INVALID,
}; };
enum SchemaAtomicCategory_t : uint8 enum SchemaAtomicCategory_t : uint8
{ {
SCHEMA_ATOMIC_BASIC = 0, SCHEMA_ATOMIC_PLAIN = 0,
SCHEMA_ATOMIC_T, SCHEMA_ATOMIC_T,
SCHEMA_ATOMIC_COLLECTION_OF_T, SCHEMA_ATOMIC_COLLECTION_OF_T,
SCHEMA_ATOMIC_TF,
SCHEMA_ATOMIC_TT, SCHEMA_ATOMIC_TT,
SCHEMA_ATOMIC_TTF,
SCHEMA_ATOMIC_I, SCHEMA_ATOMIC_I,
SCHEMA_ATOMIC_NONE, SCHEMA_ATOMIC_INVALID,
}; };
enum SchemaBuiltinType_t enum SchemaBuiltinType_t
{ {
SCHEMA_BUILTIN_INVALID = 0, SCHEMA_BUILTIN_TYPE_INVALID = 0,
SCHEMA_BUILTIN_VOID, SCHEMA_BUILTIN_TYPE_VOID,
SCHEMA_BUILTIN_CHAR, SCHEMA_BUILTIN_TYPE_CHAR,
SCHEMA_BUILTIN_INT8, SCHEMA_BUILTIN_TYPE_INT8,
SCHEMA_BUILTIN_UINT8, SCHEMA_BUILTIN_TYPE_UINT8,
SCHEMA_BUILTIN_INT16, SCHEMA_BUILTIN_TYPE_INT16,
SCHEMA_BUILTIN_UINT16, SCHEMA_BUILTIN_TYPE_UINT16,
SCHEMA_BUILTIN_INT32, SCHEMA_BUILTIN_TYPE_INT32,
SCHEMA_BUILTIN_UINT32, SCHEMA_BUILTIN_TYPE_UINT32,
SCHEMA_BUILTIN_INT64, SCHEMA_BUILTIN_TYPE_INT64,
SCHEMA_BUILTIN_UINT64, SCHEMA_BUILTIN_TYPE_UINT64,
SCHEMA_BUILTIN_FLOAT32, SCHEMA_BUILTIN_TYPE_FLOAT32,
SCHEMA_BUILTIN_FLOAT64, SCHEMA_BUILTIN_TYPE_FLOAT64,
SCHEMA_BUILTIN_BOOL, SCHEMA_BUILTIN_TYPE_BOOL,
SCHEMA_BUILTIN_COUNT, SCHEMA_BUILTIN_TYPE_COUNT,
}; };
enum SchemaClassManipulatorAction_t enum SchemaClassManipulatorAction_t
@ -105,19 +103,19 @@ enum SchemaClassManipulatorAction_t
SCHEMA_CLASS_MANIPULATOR_ACTION_GET_SCHEMA_BINDING, SCHEMA_CLASS_MANIPULATOR_ACTION_GET_SCHEMA_BINDING,
}; };
enum SchemaAtomicManipulatorAction_t enum SchemaCollectionManipulatorAction_t
{ {
SCHEMA_ATOMIC_MANIPULATOR_ACTION_GET_COUNT = 0, SCHEMA_COLLECTION_MANIPULATOR_ACTION_GET_COUNT = 0,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_GET_ELEMENT_CONST, SCHEMA_COLLECTION_MANIPULATOR_ACTION_GET_ELEMENT_CONST,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_GET_ELEMENT, SCHEMA_COLLECTION_MANIPULATOR_ACTION_GET_ELEMENT,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_SWAP_ELEMENTS, SCHEMA_COLLECTION_MANIPULATOR_ACTION_SWAP_ELEMENTS,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_INSERT_BEFORE, SCHEMA_COLLECTION_MANIPULATOR_ACTION_INSERT_BEFORE,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_REMOVE_MULTIPLE, SCHEMA_COLLECTION_MANIPULATOR_ACTION_REMOVE_MULTIPLE,
SCHEMA_ATOMIC_MANIPULATOR_ACTION_SET_COUNT, SCHEMA_COLLECTION_MANIPULATOR_ACTION_SET_COUNT,
}; };
typedef void* (*SchemaClassManipulatorFn_t)(SchemaClassManipulatorAction_t, void*, void*); typedef void* (*SchemaClassManipulatorFn_t)(SchemaClassManipulatorAction_t, void*, void*);
typedef void* (*SchemaAtomicManipulatorFn_t)(SchemaAtomicManipulatorAction_t, void*, void*, void*); typedef void* (*SchemaCollectionManipulatorFn_t)(SchemaCollectionManipulatorAction_t, void*, void*, void*);
inline uint32 CSchemaType_Hash( const char *pString, int len ) inline uint32 CSchemaType_Hash( const char *pString, int len )
{ {
@ -129,7 +127,8 @@ struct SchemaMetaInfoHandle_t
{ {
SchemaMetaInfoHandle_t() : m_pObj( NULL ) {} SchemaMetaInfoHandle_t() : m_pObj( NULL ) {}
SchemaMetaInfoHandle_t( T *obj ) : m_pObj( obj ) {} SchemaMetaInfoHandle_t( T *obj ) : m_pObj( obj ) {}
T* Get() { return m_pObj; } T* Get() const { return m_pObj; }
bool operator<( const SchemaMetaInfoHandle_t& rhs ) const { return m_pObj < rhs.m_pObj; }
T* m_pObj; T* m_pObj;
}; };
@ -204,7 +203,7 @@ public:
class CSchemaType_Atomic_CollectionOfT : public CSchemaType_Atomic_T class CSchemaType_Atomic_CollectionOfT : public CSchemaType_Atomic_T
{ {
public: public:
SchemaAtomicManipulatorFn_t m_pfnManipulator; SchemaCollectionManipulatorFn_t m_pfnManipulator;
uint16 m_nElementSize; uint16 m_nElementSize;
}; };
@ -246,7 +245,7 @@ public:
class CSchemaType_Bitfield : public CSchemaType class CSchemaType_Bitfield : public CSchemaType
{ {
public: public:
int m_nSize; int m_nBitfieldCount;
}; };
struct SchemaMetadataEntryData_t struct SchemaMetadataEntryData_t
@ -362,8 +361,8 @@ class CSchemaEnumInfo : public SchemaEnumInfoData_t
struct SchemaAtomicTypeInfo_t struct SchemaAtomicTypeInfo_t
{ {
const char* m_pszName1; const char* m_pszName;
const char* m_pszName2; const char* m_pszTokenName;
int m_nAtomicID; int m_nAtomicID;
@ -373,41 +372,64 @@ struct SchemaAtomicTypeInfo_t
struct AtomicTypeInfo_T_t struct AtomicTypeInfo_T_t
{ {
bool operator<( const AtomicTypeInfo_T_t& rhs ) const
{
if ( m_nAtomicID != rhs.m_nAtomicID )
return m_nAtomicID < rhs.m_nAtomicID;
if ( m_pTemplateType != rhs.m_pTemplateType )
return m_pTemplateType < rhs.m_pTemplateType;
return m_pfnManipulator < rhs.m_pfnManipulator;
}
int m_nAtomicID; int m_nAtomicID;
CSchemaType* m_pTemplateType; CSchemaType* m_pTemplateType;
SchemaAtomicManipulatorFn_t m_pfnManipulator; SchemaCollectionManipulatorFn_t m_pfnManipulator;
};
struct AtomicTypeInfo_TF_t
{
int m_nAtomicID;
CSchemaType* m_pTemplateType;
int m_nFuncPtrSize;
}; };
struct AtomicTypeInfo_TT_t struct AtomicTypeInfo_TT_t
{ {
bool operator<( const AtomicTypeInfo_TT_t& rhs ) const
{
if ( m_nAtomicID != rhs.m_nAtomicID )
return m_nAtomicID < rhs.m_nAtomicID;
if ( m_pTemplateType != rhs.m_pTemplateType )
return m_pTemplateType < rhs.m_pTemplateType;
return m_pTemplateType2 < rhs.m_pTemplateType2;
}
int m_nAtomicID; int m_nAtomicID;
CSchemaType* m_pTemplateType; CSchemaType* m_pTemplateType;
CSchemaType* m_pTemplateType2; CSchemaType* m_pTemplateType2;
}; };
struct AtomicTypeInfo_TTF_t
{
int m_nAtomicID;
CSchemaType* m_pTemplateType;
CSchemaType* m_pTemplateType2;
int m_nFuncPtrSize;
};
struct AtomicTypeInfo_I_t struct AtomicTypeInfo_I_t
{ {
bool operator<( const AtomicTypeInfo_I_t& rhs ) const
{
if ( m_nAtomicID != rhs.m_nAtomicID )
return m_nAtomicID < rhs.m_nAtomicID;
return m_nInteger < rhs.m_nInteger;
}
int m_nAtomicID; int m_nAtomicID;
int m_nInteger; int m_nInteger;
}; };
struct TypeAndCountInfo_t struct TypeAndCountInfo_t
{ {
bool operator<( const TypeAndCountInfo_t& rhs ) const
{
if ( m_nElementCount != rhs.m_nElementCount )
return m_nElementCount < rhs.m_nElementCount;
return m_pElementType < rhs.m_pElementType;
}
int m_nElementCount; int m_nElementCount;
CSchemaType* m_pElementType; CSchemaType* m_pElementType;
}; };

View File

@ -127,7 +127,7 @@ union TSLIST_HEAD_ALIGN TSLHead_t
#endif #endif
//------------------------------------- //-------------------------------------
class TSLIST_HEAD_ALIGN CTSListBase class TSLIST_HEAD_ALIGN PLATFORM_CLASS CTSListBase
{ {
public: public:
@ -159,153 +159,18 @@ private:
static void * operator new[] ( size_t size ); static void * operator new[] ( size_t size );
static void operator delete [] ( void *p); static void operator delete [] ( void *p);
void InternalPush( TSLNodeBase_t *pNode );
TSLNodeBase_t *InternalPop();
public: public:
CTSListBase() CTSListBase();
{ ~CTSListBase();
if ( ((size_t)&m_Head) % TSLIST_HEAD_ALIGNMENT != 0 )
{
Plat_FatalErrorFunc( "CTSListBase: Misaligned list\n" );
DebuggerBreak();
}
#ifdef USE_NATIVE_SLIST void Push( TSLNodeBase_t *pNode ) { InternalPush( pNode ); }
InitializeSListHead( &m_Head ); TSLNodeBase_t *Pop() { return InternalPop(); }
#elif defined(PLATFORM_64BITS)
m_Head.value64x128 = int128_zero();
#else
m_Head.value64x128 = (int64)0;
#endif
}
~CTSListBase() TSLNodeBase_t *Detach();
{
Detach();
}
TSLNodeBase_t *Push( TSLNodeBase_t *pNode )
{
#ifdef _DEBUG
if ( (size_t)pNode % TSLIST_NODE_ALIGNMENT != 0 )
{
Plat_FatalErrorFunc( "CTSListBase: Misaligned node\n" );
DebuggerBreak();
}
#endif
#ifdef USE_NATIVE_SLIST
#ifdef _X360
// integrated write-release barrier
return (TSLNodeBase_t *)InterlockedPushEntrySListRelease( &m_Head, pNode );
#else
return (TSLNodeBase_t *)InterlockedPushEntrySList( &m_Head, pNode );
#endif
#else
TSLHead_t oldHead;
TSLHead_t newHead;
#if defined( PLATFORM_PS3 ) || defined( PLATFORM_X360 )
__lwsync(); // write-release barrier
#endif
#ifdef PLATFORM_64BITS
newHead.value.Padding = 0;
#endif
for (;;)
{
oldHead.value64x128 = m_Head.value64x128;
pNode->Next = oldHead.value.Next;
newHead.value.Next = pNode;
newHead.value32.DepthAndSequence = oldHead.value32.DepthAndSequence + 0x10001;
if ( ThreadInterlockedAssignIf64x128( &m_Head.value64x128, newHead.value64x128, oldHead.value64x128 ) )
{
break;
}
ThreadPause();
};
return (TSLNodeBase_t *)oldHead.value.Next;
#endif
}
TSLNodeBase_t *Pop()
{
#ifdef USE_NATIVE_SLIST
#ifdef _X360
// integrated read-acquire barrier
TSLNodeBase_t *pNode = (TSLNodeBase_t *)InterlockedPopEntrySListAcquire( &m_Head );
#else
TSLNodeBase_t *pNode = (TSLNodeBase_t *)InterlockedPopEntrySList( &m_Head );
#endif
return pNode;
#else
TSLHead_t oldHead;
TSLHead_t newHead;
#ifdef PLATFORM_64BITS
newHead.value.Padding = 0;
#endif
for (;;)
{
oldHead.value64x128 = m_Head.value64x128;
if ( !oldHead.value.Next )
return NULL;
newHead.value.Next = oldHead.value.Next->Next;
newHead.value32.DepthAndSequence = oldHead.value32.DepthAndSequence - 1;
if ( ThreadInterlockedAssignIf64x128( &m_Head.value64x128, newHead.value64x128, oldHead.value64x128 ) )
{
#if defined( PLATFORM_PS3 ) || defined( PLATFORM_X360 )
__lwsync(); // read-acquire barrier
#endif
break;
}
ThreadPause();
};
return (TSLNodeBase_t *)oldHead.value.Next;
#endif
}
TSLNodeBase_t *Detach()
{
#ifdef USE_NATIVE_SLIST
TSLNodeBase_t *pBase = (TSLNodeBase_t *)InterlockedFlushSList( &m_Head );
#if defined( _X360 ) || defined( _PS3 )
__lwsync(); // read-acquire barrier
#endif
return pBase;
#else
TSLHead_t oldHead;
TSLHead_t newHead;
#ifdef PLATFORM_64BITS
newHead.value.Padding = 0;
#endif
do
{
ThreadPause();
oldHead.value64x128 = m_Head.value64x128;
if ( !oldHead.value.Next )
return NULL;
newHead.value.Next = NULL;
// <sergiy> the reason for AND'ing it instead of poking a short into memory
// is probably to avoid store forward issues, but I'm not sure because
// I didn't construct this code. In any case, leaving it as is on big-endian
newHead.value32.DepthAndSequence = oldHead.value32.DepthAndSequence & 0xffff0000;
} while( !ThreadInterlockedAssignIf64x128( &m_Head.value64x128, newHead.value64x128, oldHead.value64x128 ) );
return (TSLNodeBase_t *)oldHead.value.Next;
#endif
}
TSLHead_t *AccessUnprotected() TSLHead_t *AccessUnprotected()
{ {