/*---------------------------------------------------------------------------- ChucK Concurrent, On-the-fly Audio Programming Language Compiler and Virtual Machine Copyright (c) 2004 Ge Wang and Perry R. Cook. All rights reserved. http://chuck.stanford.edu/ http://chuck.cs.princeton.edu/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U.S.A. -----------------------------------------------------------------------------*/ //----------------------------------------------------------------------------- // file: chuck_stats.h // desc: statistics - for audicle // // author: Ge Wang (gewang@cs.princeton.edu) // Perry R. Cook (prc@cs.princeton.edu) // Philip Davidson (philipd@cs.princeton.edu) // Ananya Misra (amisra@cs.princeton.edu) // date: Autumn 2004 //----------------------------------------------------------------------------- #ifndef __CHUCK_STATS_H__ #define __CHUCK_STATS_H__ #include "chuck_def.h" // tracking #if defined(__CHUCK_STAT_TRACK__) #include "util_thread.h" #include #include #include // forward reference struct Chuck_VM; struct Chuck_VM_Shred; struct Shred_Data; struct Shred_Time; //----------------------------------------------------------------------------- // name: struct Shred_Activation // desc: ... //----------------------------------------------------------------------------- struct Shred_Activation { t_CKTIME when; t_CKUINT cycles; Shred_Activation( t_CKTIME a, t_CKUINT b ) { when = a; cycles = b; } }; //----------------------------------------------------------------------------- // name: struct Shred_Stat // desc: ... //----------------------------------------------------------------------------- struct Shred_Stat { public: // instructions computed t_CKUINT cycles; // shred id t_CKUINT xid; // parent t_CKUINT parent; // current state, 0 = inactive, 1 = active, 2 = wait, 3 = deleted t_CKUINT state; // reference (could be pointing to garbage - see state) Chuck_VM_Shred * shred_ref; // number of activations t_CKUINT activations; // average control rate t_CKFLOAT average_ctrl; // average cycles t_CKFLOAT average_cycles; // spork time t_CKTIME spork_time; // active time t_CKTIME active_time; // wake time t_CKTIME wake_time; // free time t_CKTIME free_time; // name std::string name; // owner std::string owner; // source std::string source; // ctrl rate calculation std::queue diffs; // number of diffs t_CKUINT num_diffs; // total diffs t_CKDUR diff_total; // exe per activation std::queue act_cycles; // total t_CKUINT act_cycles_total; // last t_CKUINT last_cycles; // children std::vector children; void get_sporked( std::vector & out ); std::vector activationss; void get_activations( std::vector & out ); // mutex XMutex mutex; // audicle info Shred_Data * data; Shred_Time * time; public: Shred_Stat() { this->clear(); num_diffs = 8; data = NULL; time = NULL; } void clear() { xid = 0; parent = 0; state = 0; cycles = 0; activations = 0; average_ctrl = 0.0; spork_time = 0.0; active_time = 0.0; wake_time = 0.0; free_time = 0.0; name = "no name"; owner = "none"; source = "nowhere"; while( diffs.size() ) diffs.pop(); diff_total = 0.0; while( act_cycles.size() ) act_cycles.pop(); act_cycles_total = 0; last_cycles = 0; children.clear(); } }; //----------------------------------------------------------------------------- // name: struct Chuck_Stats // desc: ... //----------------------------------------------------------------------------- struct Chuck_Stats { public: static Chuck_Stats * instance(); public: void set_vm_ref( Chuck_VM * _vm ) { vm = _vm; } public: void add_shred( Chuck_VM_Shred * shred ); void activate_shred( Chuck_VM_Shred * shred ); void advance_time( Chuck_VM_Shred * shred, t_CKTIME to ); void deactivate_shred( Chuck_VM_Shred * shred ); void remove_shred( Chuck_VM_Shred * shred ); public: Shred_Stat * get_shred( t_CKUINT xid ) { mutex.acquire(); Shred_Stat * s = shreds[xid]; mutex.release(); return s; } void get_shreds( std::vector & out, std::map & d ); static t_CKBOOL activations_yes; protected: Chuck_Stats(); ~Chuck_Stats(); static Chuck_Stats * our_instance; protected: Chuck_VM * vm; std::map shreds; std::vector done; XMutex mutex; }; #endif #endif