00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "pStatClientData.h"
00016 #include "pStatReader.h"
00017
00018 #include "pStatCollectorDef.h"
00019
00020 PStatCollectorDef PStatClientData::_null_collector(-1, "Unknown");
00021
00022
00023
00024
00025
00026
00027
00028
00029 PStatClientData::
00030 PStatClientData(PStatReader *reader) :
00031 _reader(reader)
00032 {
00033 _is_alive = true;
00034 }
00035
00036
00037
00038
00039
00040
00041 PStatClientData::
00042 ~PStatClientData() {
00043 Collectors::const_iterator ci;
00044 for (ci = _collectors.begin(); ci != _collectors.end(); ++ci) {
00045 delete (*ci)._def;
00046 }
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056 bool PStatClientData::
00057 is_alive() const {
00058 return _is_alive;
00059 }
00060
00061
00062
00063
00064
00065
00066 void PStatClientData::
00067 close() {
00068 if (_is_alive && _reader != (PStatReader *)NULL) {
00069 _reader->close();
00070 _reader = (PStatReader *)NULL;
00071 _is_alive = false;
00072 }
00073 }
00074
00075
00076
00077
00078
00079
00080
00081 int PStatClientData::
00082 get_num_collectors() const {
00083 return _collectors.size();
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 bool PStatClientData::
00095 has_collector(int index) const {
00096 return (index >= 0 && index < (int)_collectors.size() &&
00097 _collectors[index]._def != (PStatCollectorDef *)NULL);
00098 }
00099
00100
00101
00102
00103
00104
00105 const PStatCollectorDef &PStatClientData::
00106 get_collector_def(int index) const {
00107 if (!has_collector(index)) {
00108 return _null_collector;
00109 }
00110 return *_collectors[index]._def;
00111 }
00112
00113
00114
00115
00116
00117
00118 string PStatClientData::
00119 get_collector_name(int index) const {
00120 if (!has_collector(index)) {
00121 return "Unknown";
00122 }
00123 const PStatCollectorDef *def = _collectors[index]._def;
00124 return def->_name;
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 string PStatClientData::
00136 get_collector_fullname(int index) const {
00137 if (!has_collector(index)) {
00138 return "Unknown";
00139 }
00140
00141 const PStatCollectorDef *def = _collectors[index]._def;
00142 if (def->_parent_index == 0) {
00143 return def->_name;
00144 } else {
00145 return get_collector_fullname(def->_parent_index) + ":" + def->_name;
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 bool PStatClientData::
00160 set_collector_has_level(int index, int thread_index, bool flag) {
00161 bool any_changed = false;
00162 slot_collector(index);
00163 nassertr(index >= 0 && index < (int)_collectors.size(), false);
00164
00165 if (_collectors[index]._is_level.get_bit(thread_index) != flag) {
00166 any_changed = true;
00167 _collectors[index]._is_level.set_bit_to(thread_index, flag);
00168 }
00169
00170
00171
00172 if (flag) {
00173 PStatCollectorDef *def = _collectors[index]._def;
00174 if (def != (PStatCollectorDef *)NULL && def->_parent_index != 0) {
00175 if (set_collector_has_level(def->_parent_index, thread_index, flag)) {
00176 any_changed = true;
00177 }
00178 }
00179 }
00180
00181 return any_changed;
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 bool PStatClientData::
00193 get_collector_has_level(int index, int thread_index) const {
00194 return (index >= 0 && index < (int)_collectors.size() &&
00195 _collectors[index]._is_level.get_bit(thread_index));
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205 int PStatClientData::
00206 get_num_toplevel_collectors() const {
00207 return _toplevel_collectors.size();
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 int PStatClientData::
00219 get_toplevel_collector(int n) const {
00220 nassertr(n >= 0 && n < (int)_toplevel_collectors.size(), 0);
00221 return _toplevel_collectors[n];
00222 }
00223
00224
00225
00226
00227
00228
00229
00230 int PStatClientData::
00231 get_num_threads() const {
00232 return _threads.size();
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 bool PStatClientData::
00244 has_thread(int index) const {
00245 return (index >= 0 && index < (int)_threads.size() &&
00246 !_threads[index]._name.empty());
00247 }
00248
00249
00250
00251
00252
00253
00254 string PStatClientData::
00255 get_thread_name(int index) const {
00256 if (!has_thread(index)) {
00257 return "Unknown";
00258 }
00259 return _threads[index]._name;
00260 }
00261
00262
00263
00264
00265
00266
00267
00268
00269 const PStatThreadData *PStatClientData::
00270 get_thread_data(int index) const {
00271 ((PStatClientData *)this)->define_thread(index);
00272 nassertr(index >= 0 && index < (int)_threads.size(), NULL);
00273 return _threads[index]._data;
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 int PStatClientData::
00288 get_child_distance(int parent, int child) const {
00289 if (parent == child) {
00290 return 0;
00291 }
00292 if (!has_collector(child) || child == 0) {
00293 return -1;
00294 }
00295 int dist = get_child_distance(parent, get_collector_def(child)._parent_index);
00296 if (dist == -1) {
00297 return -1;
00298 } else {
00299 return dist + 1;
00300 }
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 void PStatClientData::
00314 add_collector(PStatCollectorDef *def) {
00315 slot_collector(def->_index);
00316 nassertv(def->_index >= 0 && def->_index < (int)_collectors.size());
00317
00318 if (_collectors[def->_index]._def != (PStatCollectorDef *)NULL) {
00319
00320 delete _collectors[def->_index]._def;
00321 }
00322
00323 _collectors[def->_index]._def = def;
00324 update_toplevel_collectors();
00325
00326
00327
00328 const BitArray &is_level = _collectors[def->_index]._is_level;
00329 int max_threads = is_level.get_num_bits();
00330 for (int thread_index = 0; thread_index < max_threads; ++thread_index) {
00331 if (is_level.get_bit(thread_index)) {
00332 set_collector_has_level(def->_parent_index, thread_index, true);
00333 }
00334 }
00335 }
00336
00337
00338
00339
00340
00341
00342
00343
00344 void PStatClientData::
00345 define_thread(int thread_index, const string &name) {
00346
00347 nassertv(thread_index < 1000);
00348
00349
00350 while ((int)_threads.size() <= thread_index) {
00351 _threads.push_back(Thread());
00352 }
00353
00354 if (!name.empty()) {
00355 _threads[thread_index]._name = name;
00356 }
00357
00358 if (_threads[thread_index]._data.is_null()) {
00359 _threads[thread_index]._data = new PStatThreadData(this);
00360 }
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 void PStatClientData::
00375 record_new_frame(int thread_index, int frame_number,
00376 PStatFrameData *frame_data) {
00377 define_thread(thread_index);
00378 nassertv(thread_index >= 0 && thread_index < (int)_threads.size());
00379 _threads[thread_index]._data->record_new_frame(frame_number, frame_data);
00380 }
00381
00382
00383
00384
00385
00386
00387
00388 void PStatClientData::
00389 slot_collector(int collector_index) {
00390
00391 nassertv(collector_index < 100000);
00392
00393 while ((int)_collectors.size() <= collector_index) {
00394 Collector collector;
00395 collector._def = (PStatCollectorDef *)NULL;
00396 _collectors.push_back(collector);
00397 }
00398 }
00399
00400
00401
00402
00403
00404
00405 void PStatClientData::
00406 update_toplevel_collectors() {
00407 _toplevel_collectors.clear();
00408
00409 Collectors::const_iterator ci;
00410 for (ci = _collectors.begin(); ci != _collectors.end(); ++ci) {
00411 PStatCollectorDef *def = (*ci)._def;
00412 if (def != (PStatCollectorDef *)NULL && def->_parent_index == 0) {
00413 _toplevel_collectors.push_back(def->_index);
00414 }
00415 }
00416 }