-
Notifications
You must be signed in to change notification settings - Fork 0
/
BotSystem.h
134 lines (113 loc) · 3.72 KB
/
BotSystem.h
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// BotSystem.h : interface of the CBotSystem class
//
// Pandora Bot v2.0
// By Darrin W. Cullop (dcullop@arizona.edu)
//
// Copyright (c) 1998-1999 by Darrin W. Cullop. All Rights Reserved.
//
// Permission to use, copy and distribute unedited copies of this whole
// document is hereby granted, provided that no fee is charged for the
// use or availability of this document (other than the normal connection
// costs for on-line services, if applicable). The above copyright notice
// and this permission notice must be left intact in all copies of this
// document. Short excerpts of this document may be quoted in discussion
// groups or mailing list articles, as long as a reference to the full
// document is given.
//
// Commercial distribution of this document, in whole or in part,
// requires prior agreement with the author. Commercial distribution
// includes any means by which the user has to pay either for the support
// (e.g. book, newsletter or CD-ROM) or for the document itself.
//
// Unauthorized commercial distribution is prohibited.
//
//////////////////////////////////////////////////////////////////////
#ifndef BOT_SYSTEM_H
#define BOT_SYSTEM_H
#include "SystemObject.h"
class CBotThread;
class CQuakePacket;
//////////////////////////////////////////////////////////////////////////////////
// CBotSystem Class Definition
class CBotSystem : public CObject
{
DECLARE_DYNCREATE(CBotSystem);
// Attributes
private:
CCriticalSection m_Lock;
CObList m_lstThreads;
CObList m_lstSysObjects;
BYTE m_nThreadCount;
// Constructor / Destructor
public:
CBotSystem() { m_nThreadCount = 0; };
~CBotSystem() { Reset(); } ;
// Operations
private:
void Reset();
void RecordObjectUse(CSystemObject*);
public:
void PostSystemMessage(const UINT& nMsgID, void* pParam = NULL, const UINT nParam = 0);
void LockObject( CSystemObject* );
void ReleaseObject( CSystemObject* );
void IgnoreObject( CSystemObject* );
// Thread Operations
public:
void RegisterThread(CBotThread*);
void UnregisterThread(CBotThread*);
// Diagnostics
#ifdef _DEBUG
public:
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif //_DEBUG
};
//////////////////////////////////////////////////////////////////////////////////
// CBotSystem Inline Functions
/////////////////////////////////////////////////////////////////////////////
// CBotSystem Private Operations
inline void CBotSystem::RecordObjectUse(CSystemObject* pUsed)
{
ASSERT(pUsed != NULL);
BYTE nUses = pUsed->CheckUsage();
//TRACE("Object at %p has been used %d times!\n", pUsed, nUses);
if (nUses >= m_nThreadCount)
{
POSITION pUsedSpot;
if ((pUsedSpot = m_lstSysObjects.Find(pUsed)) != NULL)
{
m_lstSysObjects.RemoveAt(pUsedSpot);
#ifdef _DEBUG
CSingleLock sLock( pUsed );
if ( sLock.IsLocked() )
{
TRACE("Trying to delete Locked Object!\n");
}
#endif // _DEBUG
//TRACE("Object at %p deleted!\n", pUsed);
delete pUsed;
pUsed = NULL;
}
}
//TRACE("!!!\tThere are %d undestroyed system objects!\n", m_lstSysObjects.GetCount());
}
/////////////////////////////////////////////////////////////////////////////
// CBotSystem Public Operations
inline void CBotSystem::LockObject(CSystemObject* pLockMe)
{
ASSERT(pLockMe != NULL);
pLockMe->Lock();
}
inline void CBotSystem::ReleaseObject(CSystemObject* pUnlockMe)
{
ASSERT(pUnlockMe != NULL);
pUnlockMe->Unlock();
RecordObjectUse(pUnlockMe);
}
inline void CBotSystem::IgnoreObject(CSystemObject* pIgnore)
{
RecordObjectUse(pIgnore);
}
//////////////////////////////////////////////////////////////////////////////////
#endif
//////////////////////////////////////////////////////////////////////////////////