Home

Resume

Blog

Teikitu


/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
/*  »Project«   Teikitu Gaming System (TgS) (∂)
    »File«      TgS Common - Event MGR - Internal.h
    »Author«    Andrew Aye (EMail: mailto:andrew.aye@gmail.com, Web: http://www.andrewaye.com)
    »Version«   4.51 / »GUID« A9981407-3EC9-42AF-8B6F-8BE6DD919615                                                                                                        */
/*   -------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
/*  Copyright: © 2002-2017, Andrew Aye.  All Rights Reserved.
    This software is free for non-commercial use.  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
      following conditions are met:
        Redistribution of source code must retain this copyright notice, this list of conditions and the following disclaimers.
        Redistribution in binary form must reproduce this copyright notice, this list of conditions and the following disclaimers in the documentation and other materials
          provided with the distribution.
    The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.
    The intellectual property rights of the algorithms used reside with Andrew Aye.
    You may not use this software, in whole or in part, in support of any commercial product without the express written consent of the author.
    There is no warranty or other guarantee of fitness of this software for any purpose. It is provided solely "as is".                                                   */
/* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
#if !defined(TGS_COMMON_EVENT_MGR_INTERNAL_H)
#define TGS_COMMON_EVENT_MGR_INTERNAL_H
#pragma once


/* == Common ============================================================================================================================================================ */

/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */
/*  File Local Constants                                                                                                                                                  */
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */

enum { KTgEM_MAX_TE_FRM_POOL                =    16 };
enum { KTgEM_MAX_TE_SEC_POOL                =    16 };
enum { KTgEM_NUM_TE_IN_POOL                 =    69 };


/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */
/*  File Local Types                                                                                                                                                      */
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */

TgTYPE_STRUCT_ALIGN(STg2_EM_TB,16,)
{
    union
    {
        STg2_EM_TB                                  *psNext;
        STg2_UTM_Node                               tgMP;
    }                                           m_sHead;

    TgFLOAT32                                   m_fStart;
    TgFLOAT32                                   m_fEnd;
    TgSINT32                                    m_iStart;
    TgSINT32                                    m_iEnd;

    TgUINT32                                    m_uiLocal_Index;

    TgUINT32                                    m_bfFlags;
};
TgCOMPILER_ASSERT( sizeof( STg2_EM_TB ) <= 32, 0 );

TgTYPE_STRUCT(STg2_EM_TE,)
{
    TgFCN_EM_CALLBACK                           m_pfnCallback;
    TgUINTPTR                                   m_uiParam;
};
TgCOMPILER_ASSERT( sizeof( STg2_EM_TE ) == 16, 0 );


/* ---- Time Pools ------------------------------------------------------------------------------------------------------------------------------------------------------ */

TgTYPE_STRUCT_ALIGN(STg2_EM_TE_Pool,TgCOMPILE_CACHE_LINE_SIZE,)
{
    STg2_Job                                    m_sJob;

    STg2_EM_TE_Pool                             *m_psFree_Next;  /*« Synchronization: g_asXXX_NewDel_Lock */
    P_STg2_EM_TB                                m_psFree;  /*« Synchronization: g_asXXX_NewDel_Lock */
    TgSINT32                                    m_niUsed;  /*« Synchronization: g_asXXX_NewDel_Lock */

    /* Aliases for the data held in the derived structure and only assigned during initialization */
    /* Used for per-entity synchronization or configuration data */
    TgUINT32                                    m_bfFlags;  /*« Synchronization: None */
    TgSINT32                                    m_iPool;  /*« Synchronization: Logical (write once - init) */
    TgUINT32                                    m_uiPad0;

    /* Synchronization is achieved for these members through execution logic (isolated, non-concurrent access) */
    P_STg2_EM_TB                                m_psWaiting;  /*« Synchronization: Logical (isolation) */
    P_STg2_EM_TB                                m_psActive;  /*« Synchronization: Logical (isolation) */
    TgUINT08                                    m_iPad1[TgCOMPILE_POINTER_SIZE];

    TgSINT64                                    m_aiKI[KTgEM_NUM_TE_IN_POOL];  /*« Synchronization: g_asXXX_Data_Lock */
    STg2_EM_TB                                  m_asTB[KTgEM_NUM_TE_IN_POOL];  /*« Synchronization: g_asXXX_Data_Lock */
    STg2_EM_TE                                  m_asTE[KTgEM_NUM_TE_IN_POOL];  /*« Synchronization: g_asXXX_Data_Lock */

    /* Lockless data structures (multi-thread safe) */
    STg2_UTM_AM_ST                              m_sNew;  /*« Synchronization: Self */
    TgUINT32                                    m_uiPad2[8];
};
TgCOMPILER_ASSERT( sizeof( STg2_EM_TE_Pool ) == 4096, 0 );


/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */
/*  File Local Functions and Private Data                                                                                                                                 */
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. */

/* Time Line | Event Base Flags  */

TgINLINE TgVOID                             tgEM_TB_Set_Paused( PCU_STg2_EM_TB, C_TgBOOL );
TgINLINE TgVOID                             tgEM_TB_Set_Active( PCU_STg2_EM_TB, C_TgBOOL );
TgINLINE TgBOOL                             tgEM_TB_Is_Paused( CPCU_STg2_EM_TB );
TgINLINE TgBOOL                             tgEM_TB_Is_Active( CPCU_STg2_EM_TB );

/* Pool Utility Functions */

TgINLINE TgRESULT                           tgEM_TE_FRM_Lock( C_TgEM_TE_FRM_ID, C_TgUINT32, C_TgUINT32 );
TgINLINE TgRESULT                           tgEM_TE_SEC_Lock( C_TgEM_TE_SEC_ID, C_TgUINT32, C_TgUINT32 );

TgEXTN TgVOID                               tgEM_TP_Init( PC_STg2_EM_TE_Pool );

TgEXTN P_STg2_EM_TE_Pool                    g_apsEM_TE_FRM[KTgEM_MAX_TE_FRM_POOL];         /*« Synchronization: g_sEM_TE_FRM_Lock */
TgEXTN P_STg2_EM_TE_Pool                    g_psEM_TE_FRM_Free_List;                       /*« Synchronization: g_sEM_TE_FRM_Lock */
TgEXTN STg2_UTM_SN_ISO                      g_sEM_TE_FRM_Lock;
TgEXTN STg2_UTM_SN_ISO                      g_asEM_TE_FRM_Data_Lock[KTgEM_MAX_TE_FRM_POOL];
TgEXTN STg2_UTM_SN_ISO                      g_asEM_TE_FRM_NewDel_Lock[KTgEM_MAX_TE_FRM_POOL];

TgEXTN P_STg2_EM_TE_Pool                    g_apsEM_TE_SEC[KTgEM_MAX_TE_SEC_POOL];         /*« Synchronization: g_sEM_TE_SEC_Lock */
TgEXTN P_STg2_EM_TE_Pool                    g_psEM_TE_SEC_Free_List;                       /*« Synchronization: g_sEM_TE_SEC_Lock */
TgEXTN STg2_UTM_SN_ISO                      g_sEM_TE_SEC_Lock;
TgEXTN STg2_UTM_SN_ISO                      g_asEM_TE_SEC_Data_Lock[KTgEM_MAX_TE_SEC_POOL];
TgEXTN STg2_UTM_SN_ISO                      g_asEM_TE_SEC_NewDel_Lock[KTgEM_MAX_TE_SEC_POOL];


/* ====================================================================================================================================================================== */
#endif