00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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