Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_DataLogRTDistrib.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  * (c)Copyright 2006 Hewlett-Packard Development Company, LP.
00017  *
00018  */
00019 
00020 #include "Utils.hpp"
00021 #include "GeneratorTrace.hpp"
00022 #include "C_DataLogRTDistrib.hpp"
00023 
00024 #include <pthread.h>
00025 #include <math.h>
00026 #include "iostream_t.hpp"
00027 
00028 #define min(a,b) ((a)<(b)) ? (a) : (b)
00029 #define max(a,b) ((a)<(b)) ? (b) : (a)
00030 
00031 C_DataLogRTDistrib::C_DataLogRTDistrib(size_t         P_max_data,
00032                                        size_t         P_max_data_log,
00033                                        char          *P_file_name, 
00034                                        unsigned long  P_period,
00035                                        unsigned long  P_rtdistrib) 
00036   : C_DataLogControl(P_max_data,
00037                      P_max_data_log,
00038                      P_file_name, 
00039                      P_period){
00040 
00041   size_t L_i ;
00042 
00043 
00044   GEN_DEBUG(0, "C_DataLogRTDistrib::C_DataLogRTDistrib()");
00045   m_rtdistrib = P_rtdistrib ;
00046 
00047   NEW_TABLE( m_p_rt_distrib, unsigned long, m_rtdistrib+1);
00048   NEW_TABLE( m_c_rt_distrib, unsigned long, m_rtdistrib+1);
00049   NEW_VAR(m_sem_rt, C_Semaphore()) ;
00050 
00051   m_sem_rt->P();
00052   for (L_i=0 ; L_i <= m_rtdistrib ; L_i++) {
00053     m_p_rt_distrib[L_i] = 0;
00054     m_c_rt_distrib[L_i] = 0;
00055   }
00056 
00057   m_p_min_rt_distrib = m_rtdistrib ;
00058   m_p_max_rt_distrib = 0 ;
00059 
00060   m_c_min_rt_distrib = m_rtdistrib ;
00061   m_c_max_rt_distrib = 0 ;
00062   m_counter_rt = 0 ;
00063   m_sem_rt->V();
00064 }
00065 
00066 C_DataLogRTDistrib::~C_DataLogRTDistrib() {
00067 
00068   GEN_DEBUG(0, "C_DataLogRTDistrib::~C_DataLogRTDistrib()");
00069   m_sem_rt->P();
00070   DELETE_TABLE(m_p_rt_distrib);
00071   DELETE_TABLE(m_c_rt_distrib);
00072   m_sem_rt->V();
00073   DELETE_VAR(m_sem_rt);
00074 }
00075 
00076 
00077 int C_DataLogRTDistrib::data (char *P_data) {
00078   (*m_output_stream) << P_data << iostream_endl << iostream_flush ;
00079   return (1);
00080 }
00081 
00082 
00083 int C_DataLogRTDistrib::data (double P_time, double P_value) {
00084   unsigned long   L_index    ;
00085 
00086   L_index = (unsigned long) floor(P_value) ;
00087 
00088   m_sem_rt->P();
00089   if(L_index >= m_rtdistrib) {
00090     L_index = m_rtdistrib ;
00091   }
00092   
00093   m_p_rt_distrib[L_index] ++;
00094   m_c_rt_distrib[L_index] ++;
00095   
00096   m_p_min_rt_distrib = min(m_p_min_rt_distrib,L_index);
00097   m_c_min_rt_distrib = min(m_c_min_rt_distrib,L_index);
00098   m_p_max_rt_distrib = max(m_p_max_rt_distrib,L_index);
00099   m_c_max_rt_distrib = max(m_c_max_rt_distrib,L_index);
00100 
00101   m_counter_rt ++;
00102 
00103   if (m_counter_rt >= m_size_log) { 
00104     m_sem->V(); 
00105   }
00106   m_sem_rt->V();
00107     
00108   return (1);
00109 }
00110 
00111 void C_DataLogRTDistrib::do_log_cumul () {
00112 
00113   size_t         L_i ;
00114 
00115   m_sem_rt->P();
00116   (*m_output_stream) << "Dump Cumulative;" << iostream_endl << iostream_flush ;
00117       
00118   for(L_i = m_c_min_rt_distrib ; L_i <= m_c_max_rt_distrib ; L_i++) {
00119     if(m_c_rt_distrib[L_i] != 0) {
00120       (*m_output_stream) << L_i << ";"
00121                          << m_c_rt_distrib[L_i] << ";" ;
00122       (*m_output_stream) << iostream_endl << iostream_flush ;
00123     }
00124   }
00125   m_sem_rt->V();
00126 }
00127 
00128 void C_DataLogRTDistrib::do_log () {
00129 
00130   size_t         L_i ;
00131   
00132   m_sem_rt->P();
00133   if (m_counter_rt) {
00134     (*m_output_stream) << "Dump Periodic;" << iostream_endl << iostream_flush ;    
00135     for(L_i = m_p_min_rt_distrib ; L_i <= m_p_max_rt_distrib ; L_i++) {
00136       
00137       if(m_p_rt_distrib[L_i] != 0) {
00138         (*m_output_stream) << L_i << ";"
00139                            << m_p_rt_distrib[L_i] << ";" ;
00140         (*m_output_stream) << iostream_endl << iostream_flush ;
00141       }
00142     }
00143     
00144     
00145     for (L_i=0 ; L_i <= m_rtdistrib ; L_i++) {
00146       m_p_rt_distrib[L_i] = 0;
00147     }
00148     m_p_min_rt_distrib = m_rtdistrib ;
00149     m_p_max_rt_distrib = 0 ;
00150     m_counter_rt = 0 ;
00151   }
00152   m_sem_rt->V();
00153   
00154 }
00155 
00156 
00157 
00158 
00159 
00160 

Generated on Wed Mar 7 14:44:49 2007 for Seagull by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002