Artur,

Thank you for the bug report.Subversion Revision 570 should correct this 
issue permanently.

Charles

Artur silveira da Cunha <artur.silveira_da_cu...@alcatel-lucent.fr> wrote 
on 01/26/2009 07:04:30 PM:

> Hi,
> 
> sipp crashes with "Segmentation fault" error when in the scenary the 
> ResponseTimeRepartition or CallLengthRepartition parameters are filled 
> with  values that bypasses the 1024 bytes in length.
> 
> I search for the error and found that in stat.cpp and stat.hpp the 
> buffers are sized to 1024 bytes and that the buffers uses strcat or 
> sprintf instructions that create "corruption stack" situations when the 
> value to be copied exceeds the receiving buffer length..
> 
> I made the following correction in stat.hpp to increase the buffer 
> values from 1024 to 2048 and now sipp no more crashes.
> 
> I know that this correction is not final and that it pushes the problem 
> more far when  the parameters values will exceeds 2048 bytes in length.
> 
> Corrected lines:
> Before
> #define MAX_REPARTITION_HEADER_LENGTH 1024
> #define MAX_REPARTITION_INFO_LENGTH   1024
> #define MAX_CHAR_BUFFER_SIZE          1024
> After
> #define MAX_REPARTITION_HEADER_LENGTH 2048
> #define MAX_REPARTITION_INFO_LENGTH   2048
> #define MAX_CHAR_BUFFER_SIZE          2048
> 
> Note: We are using an old 2007 sipp version with which we don't have 
> this problem, it's now that we try to use new sipp versions that we find 

> this problem. I compare the source code and found that many changes has 
> been made in stat.hpp and stat.cpp source code.
> 
> Regards
> 
> Artur
> <?xml version="1.0" encoding="ISO-8859-1" ?>
> <!DOCTYPE scenario SYSTEM "sipp.dtd">
> 
> <!-- 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 USA -->
> <!-- -->
> <!--                 Sipp default 'uac' scenario. -->
> <!-- -->
> 
> <scenario name="Basic Sipstone UAC">
>   <!-- In client mode (sipp placing calls), the Call-ID MUST be -->
>   <!-- generated by sipp. To do so, use [call_id] keyword.  -->
>   <send retrans="500">
>     <![CDATA[
> 
>       INVITE sip:[servi...@localhost:5060 SIP/2.0
>       Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
>       From: sipp <sip:s...@[local_ip]:[local_port]>;tag=[pid]
> SIPpTag00[call_number]
>       To: sut <sip:[servi...@[remote_ip]:[remote_port]>
>       Call-ID: [call_id]
>       CSeq: 1 INVITE
>       Contact: sip:s...@[local_ip]:[local_port]
>       Max-Forwards: 70
>       Subject: Performance Test
>       Content-Type: application/sdp
>       Content-Length: [len]
> 
>       v=0
>       o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
>       s=-
>       c=IN IP[media_ip_type] [media_ip]
>       t=0 0
>       m=audio [media_port] RTP/AVP 0
>       a=rtpmap:0 PCMU/8000
> 
>     ]]>
>   </send>
> 
>   <recv response="480"
>         optional="true">
>   </recv>
> 
> 
>   <!-- definition of the response time repartition table (unit is ms) 
-->
> 
> 
>   <!-- definition of the call length repartition table (unit is ms) -->
> 
> 
> 
>   <!-- added by sippStatsMaker - definition of the response time 
> repartition table (unit is ms)   -->
>   <ResponseTimeRepartition value = "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,135,
> 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,
> 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
> 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,
> 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,
> 204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
> 221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,
> 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,
> 255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,
> 272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
> 289,290,291,292,293,294,295,296,297,298,299,300"/>
> 
>   <!-- added by sippStatsMaker - definition of the call length 
> repartition table (unit is ms) 
    -->
>   <CallLengthRepartition value = "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,135,
> 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,
> 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
> 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,
> 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,
> 204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,
> 221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,
> 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,
> 255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,
> 272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
> 289,290,291,292,293,294,295,296,297,298,299,300"/>
> 
> </scenario>
> 
> /*
>  *  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 
 USA
>  *
>  *  Authors : Benjamin GAUTHIER - 24 Mar 2004
>  *            Joseph BANINO
>  *            Olivier JACQUES
>  *            Richard GAYRAUD
>  *            From Hewlett Packard Company.
>  * 
>  */
> 
> #ifndef __STAT_H__
> #define __STAT_H__
> 
> 
> #define TIME_LENGTH 64
> #define DEFAULT_FILE_NAME (char*)"dumpFile"
> #define DEFAULT_EXTENSION (char*)".csv"
> 
> #define MAX_REPARTITION_HEADER_LENGTH 2048
> #define MAX_REPARTITION_INFO_LENGTH   2048
> #define MAX_CHAR_BUFFER_SIZE          2048
> 
> #include <ctime> 
> #include <sys/time.h> 
> #include <time.h> 
> #include <iostream>
> #include <fstream>
> #include <stdio.h>
> 
> #ifdef HAVE_GSL
> #include <gsl/gsl_rng.h>
> #include <gsl/gsl_randist.h>
> #include <gsl/gsl_cdf.h>
> #endif
> 
> #include "variables.hpp"
> 
> using namespace std;
> 
> /*
> 
__________________________________________________________________________
> 
>               C S t a t    C L A S S
> 
__________________________________________________________________________
> */
> 
>   /**
>    * This class provides some means to compute and display statistics.
>    * This is a singleton class.
>    */
> 
> class CStat {
> public:
> 
>   /* 
>    * This struct is used for repartition table
>    * border max is the max value allow for this range
>    * nbInThisBorder is the counter of value in this range
>    */
>   typedef struct _T_dynamicalRepartition
>   {
>     unsigned int  borderMax;
>     unsigned long nbInThisBorder; 
>   } T_dynamicalRepartition; 
> 
>   typedef struct _T_value_rtt 
>   {
>     double  date ;
>     int  rtd_no ;
>     double  rtt  ;
>   } T_value_rtt, *T_pValue_rtt ; 
> 
>   /**
>    * Actions on counters
>    */
>   enum E_Action
>   {
>     E_NO_ACTION,
>     E_CREATE_OUTGOING_CALL,
>     E_CREATE_INCOMING_CALL,
>     E_CALL_FAILED, 
>     E_CALL_SUCCESSFULLY_ENDED,
>     E_RESET_C_COUNTERS,
>     E_RESET_PD_COUNTERS,
>     E_RESET_PL_COUNTERS,
>     E_ADD_CALL_DURATION,
>     E_ADD_RESPONSE_TIME_DURATION,
>     E_FAILED_CANNOT_SEND_MSG,
>     E_FAILED_MAX_UDP_RETRANS,
>     E_FAILED_TCP_CONNECT,
>     E_FAILED_TCP_CLOSED,
>     E_FAILED_UNEXPECTED_MSG,
>     E_FAILED_CALL_REJECTED,
>     E_FAILED_CMD_NOT_SENT,
>     E_FAILED_REGEXP_DOESNT_MATCH,
>     E_FAILED_REGEXP_HDR_NOT_FOUND,
>     E_FAILED_OUTBOUND_CONGESTION,
>     E_FAILED_TIMEOUT_ON_RECV,
>     E_FAILED_TIMEOUT_ON_SEND,
>     E_OUT_OF_CALL_MSGS,
>     E_WATCHDOG_MAJOR,
>     E_WATCHDOG_MINOR,
>     E_DEAD_CALL_MSGS,
>     E_FATAL_ERRORS,
>     E_WARNING,
>     E_RETRANSMISSION,
>     E_AUTO_ANSWERED,
>     E_ADD_GENERIC_COUNTER
>   };
>   /**
>    * Counters management
>    */
>   enum E_CounterName
>   {
>   // Per-Scenario Counters
>   // Cumulative counters
>   CPT_C_IncomingCallCreated,
>   CPT_C_OutgoingCallCreated,
>   CPT_C_SuccessfulCall,
>   CPT_C_FailedCall,
>   CPT_C_CurrentCall,
>   CPT_C_CurrentCallPeak,
>   CPT_C_CurrentCallPeakTime,
>   CPT_C_NbOfCallUsedForAverageCallLength,
>   CPT_C_AverageCallLength_Sum,
>   CPT_C_AverageCallLength_Squares,
>   CPT_C_FailedCallCannotSendMessage,
>   CPT_C_FailedCallMaxUdpRetrans,
>   CPT_C_FailedCallTcpConnect,
>   CPT_C_FailedCallTcpClosed,
>   CPT_C_FailedCallUnexpectedMessage,
>   CPT_C_FailedCallCallRejected,
>   CPT_C_FailedCallCmdNotSent,
>   CPT_C_FailedCallRegexpDoesntMatch,
>   CPT_C_FailedCallRegexpHdrNotFound,
>   CPT_C_FailedOutboundCongestion,
>   CPT_C_FailedTimeoutOnRecv,
>   CPT_C_FailedTimeoutOnSend,
>   CPT_C_Retransmissions,
> 
>   // Periodic Display counter
>   CPT_PD_IncomingCallCreated, // must be first (RESET_PD_COUNTER macro)
>   CPT_PD_OutgoingCallCreated,
>   CPT_PD_SuccessfulCall,
>   CPT_PD_FailedCall,
>   CPT_PD_CurrentCallPeak,
>   CPT_PD_CurrentCallPeakTime,
>   CPT_PD_NbOfCallUsedForAverageCallLength,
>   CPT_PD_AverageCallLength_Sum,
>   CPT_PD_AverageCallLength_Squares,
>   CPT_PD_NbOfCallUsedForAverageResponseTime,
>   CPT_PD_NbOfCallUsedForAverageResponseTime_2, // This must match or
> exceed MAX_RTD_INFO
>   CPT_PD_NbOfCallUsedForAverageResponseTime_3, // This must match or
> exceed MAX_RTD_INFO
>   CPT_PD_NbOfCallUsedForAverageResponseTime_4, // This must match or
> exceed MAX_RTD_INFO
>   CPT_PD_NbOfCallUsedForAverageResponseTime_5, // This must match or
> exceed MAX_RTD_INFO
>   CPT_PD_AverageResponseTime_Sum,
>   CPT_PD_AverageResponseTime_Sum_2,
>   CPT_PD_AverageResponseTime_Sum_3,
>   CPT_PD_AverageResponseTime_Sum_4,
>   CPT_PD_AverageResponseTime_Sum_5,
>   CPT_PD_AverageResponseTime_Squares,
>   CPT_PD_AverageResponseTime_Squares_2,
>   CPT_PD_AverageResponseTime_Squares_3,
>   CPT_PD_AverageResponseTime_Squares_4,
>   CPT_PD_AverageResponseTime_Squares_5,
>   CPT_PD_FailedCallCannotSendMessage,
>   CPT_PD_FailedCallMaxUdpRetrans,
>   CPT_PD_FailedCallTcpConnect,
>   CPT_PD_FailedCallTcpClosed,
>   CPT_PD_FailedCallUnexpectedMessage,
>   CPT_PD_FailedCallCallRejected,
>   CPT_PD_FailedCallCmdNotSent,
>   CPT_PD_FailedCallRegexpDoesntMatch,
>   CPT_PD_FailedCallRegexpHdrNotFound,
>   CPT_PD_FailedOutboundCongestion,
>   CPT_PD_FailedTimeoutOnRecv,
>   CPT_PD_FailedTimeoutOnSend,
>   CPT_PD_Retransmissions,
> 
>   // Periodic logging counter
>   CPT_PL_IncomingCallCreated, // must be first (RESET_PL_COUNTER macro)
>   CPT_PL_OutgoingCallCreated,
>   CPT_PL_SuccessfulCall,
>   CPT_PL_FailedCall,
>   CPT_PL_CurrentCallPeak,
>   CPT_PL_CurrentCallPeakTime,
>   CPT_PL_NbOfCallUsedForAverageCallLength,
>   CPT_PL_AverageCallLength_Sum,
>   /* The squares let us compute the standard deviation. */
>   CPT_PL_AverageCallLength_Squares,
>   CPT_PL_NbOfCallUsedForAverageResponseTime,
>   CPT_PL_NbOfCallUsedForAverageResponseTime_2,
>   CPT_PL_NbOfCallUsedForAverageResponseTime_3,
>   CPT_PL_NbOfCallUsedForAverageResponseTime_4,
>   CPT_PL_NbOfCallUsedForAverageResponseTime_5,
>   CPT_PL_AverageResponseTime_Sum,
>   CPT_PL_AverageResponseTime_Sum_2,
>   CPT_PL_AverageResponseTime_Sum_3,
>   CPT_PL_AverageResponseTime_Sum_4,
>   CPT_PL_AverageResponseTime_Sum_5,
>   CPT_PL_AverageResponseTime_Squares,
>   CPT_PL_AverageResponseTime_Squares_2,
>   CPT_PL_AverageResponseTime_Squares_3,
>   CPT_PL_AverageResponseTime_Squares_4,
>   CPT_PL_AverageResponseTime_Squares_5,
>   CPT_PL_FailedCallCannotSendMessage,
>   CPT_PL_FailedCallMaxUdpRetrans,
>   CPT_PL_FailedCallTcpConnect,
>   CPT_PL_FailedCallTcpClosed,
>   CPT_PL_FailedCallUnexpectedMessage,
>   CPT_PL_FailedCallCallRejected,
>   CPT_PL_FailedCallCmdNotSent,
>   CPT_PL_FailedCallRegexpDoesntMatch,
>   CPT_PL_FailedCallRegexpHdrNotFound,
>   CPT_PL_FailedOutboundCongestion,
>   CPT_PL_FailedTimeoutOnRecv,
>   CPT_PL_FailedTimeoutOnSend,
>   CPT_PL_Retransmissions,
> 
>   E_NB_COUNTER,
> 
>   // Global Counters
>   // Cumulative counters
>   CPT_G_C_OutOfCallMsgs,
>   CPT_G_C_DeadCallMsgs,
>   CPT_G_C_FatalErrors,
>   CPT_G_C_Warnings,
>   CPT_G_C_WatchdogMajor,
>   CPT_G_C_WatchdogMinor,
>   CPT_G_C_AutoAnswered,
>   // Periodic Display counter
>   CPT_G_PD_OutOfCallMsgs,
>   CPT_G_PD_DeadCallMsgs,
>   CPT_G_PD_FatalErrors,
>   CPT_G_PD_Warnings,
>   CPT_G_PD_WatchdogMajor,
>   CPT_G_PD_WatchdogMinor,
>   CPT_G_PD_AutoAnswered, // must be last (RESET_PD_COUNTER)
> 
>   // Periodic logging counter
>   CPT_G_PL_OutOfCallMsgs,
>   CPT_G_PL_DeadCallMsgs,
>   CPT_G_PL_FatalErrors,
>   CPT_G_PL_Warnings,
>   CPT_G_PL_WatchdogMajor,
>   CPT_G_PL_WatchdogMinor,
>   CPT_G_PL_AutoAnswered, // must be last (RESET_PL_COUNTER)
> 
>   E_NB_G_COUNTER,
> 
>   };
> 
>   /*
>   ** exported methods
>   */
> 
>   /**
>    * Constructor.
>    */
>   CStat ();
> 
>   /**
>    * Destructor.
>    */
>   ~CStat ();
> 
> 
>   /**
>    * Delete the single instance of the class.
>    *
>    * Only one instance of CStat exists in the component. This
>    * instance is deleted when the close method is called.
>    */
>   void close (); 
> 
>   /**
>    * ComputeStat Methods are used to modify counter value
>    * It's the main interface to update counter
>    *
>    * @return 0 if the action is known
>    *        -1 else
>    */
>   int computeStat (E_Action P_action);
>   int computeStat (E_Action P_action, unsigned long P_value);
>   int computeStat (E_Action P_action, unsigned long P_value, int which);
> 
>   /* This works for global counters and does not require an instance. */
>   static int globalStat (E_Action P_action);
> 
>   /**
>    * ComputeRtt Methods are used to calculate the response time
>    */
>   void computeRtt ( unsigned long long P_start_time, unsigned long 
> long P_stop_time, int which);
> 
>   /**
>    * GetStat Method is used to retrieve a counter value
>    *
>    * @return the counter value
>    **/
>   unsigned long long GetStat (E_CounterName P_counter);
> 
>   /* Get the current start time. */
>   void getStartTime(struct timeval *t);
> 
>   /**
>    * formatTime.
>    *
>    * This method converts a struct timeval parameter into a printable 
string
>    * in the format given in parameter.
>    *
>    * @param P_tv.
>    * @return a pointer on a static string containing formated time
>    */
>   static char* formatTime (struct timeval* P_tv, bool microseconds = 
false);
> 
>   /**
>    * setRepartitionCallLength 
>    * - set the unsigned int table passed in parameter as the 
> repartition table 
>    *   for call length. This is done by calling the initRepartition 
> methode on 
>    *   the M_CallLengthRepartition variable.
>    * - set the char* list of int (must be separeted with coma as the 
>    *   repartition table for call length
>    *   This is done by calling the createIntegerTable to transform the 
char* 
>    *   list into unsigned int list. Then the initRepartition methode is 
>    *   call with the created unsigned int list and the 
> M_CallLengthRepartition 
>    *   variable
>    *
>    * setRepartitionResponseTime
>    *   Same than setRepartitionCallLength with the variable
>    *  M_ResponseTimeRepartition variableinstead of 
M_CallLengthRepartition 
>    *  variable
>    */
>   void setRepartitionCallLength   (unsigned int* repartition, int 
nombre);
>   void setRepartitionCallLength   (char * liste);
>   void setRepartitionResponseTime (unsigned int* repartition, int 
nombre);
>   void setRepartitionResponseTime (char * liste);
> 
>   /* define the file name to use to dump statistic in file */
>   void setFileName                (char * name);
>   void setFileName                (char * name, char * extension);
>   void initRtt             (char * name, char * extension, unsigned 
> long P_value);
> 
>   /**
>    * Display data periodically updated on screen.
>    */
>   void displayData (FILE *f);
>   void displayStat(FILE *f);
>   void displayRepartition(FILE *f);
>   void displayRtdRepartition (FILE *f, int which);
> 
>   /**
>    * Dump data periodically in the file M_FileName
>    */
>   void dumpData ();
> 
>   void dumpDataRtt ();
> 
>   /**
>    * initialize the class variable member
>    */
>   int init();
> 
>   /**
>    * computeDiffTimeInMs.
>    *
>    * This method calculates elaped time in ms
>    *
>    * @param tf = final date
>    * @param ti = initial date
>    *
>    * @return number of ms between the 2 dates
>    */
>   static long computeDiffTimeInMs (struct timeval* tf, struct timeval* 
ti);
> 
>   /**
>    * msToHHMMSS.
>    *
>    * This converts an unsigned long containing a number of ms
>    * into a string expressing the same value in format HH:MM:SS.
>    *
>    * @param P_ms.
>    *
>    * @return a pointer on a static string containing formated time
>    */
>   static char* msToHHMMSS (unsigned long P_ms);
> 
>   /**
>    * msToHHMMSSmm.
>    *
>    * This converts an unsigned long containing a number of ms
>    * into a string expressing the same value in format HH:MM:SS:mmm.
>    *
>    * @param P_ms.
>    *
>    * @return a pointer on a static string containing formated time
>    */
>   static char* msToHHMMSSmmm (unsigned long P_ms);
> 
>   /* Get a counter ID by name. */
>   int findCounter(const char *counter, bool alloc);
>   int findRtd(const char *name, bool start);
>   void validateRtds();
>   int nRtds();
> 
> private:
>   unsigned long long       M_counters[E_NB_COUNTER];
>   static unsigned long long M_G_counters[E_NB_G_COUNTER - E_NB_COUNTER];
> 
> #define GENERIC_C 0
> #define GENERIC_PD 1
> #define GENERIC_PL 2
> #define GENERIC_TYPES 3
>   unsigned long long      *M_genericCounters;
> 
>   str_int_map         M_genericMap;
>   int_str_map         M_revGenericMap;
>   int_str_map         M_genericDisplay;
> 
>   str_int_map         rtd_started;
>   str_int_map         rtd_stopped;
> 
> #define RTD_COUNT 0
> #define RTD_SUM 1
> #define RTD_SUMSQ 2
> #define RTD_TYPES 3
>   unsigned long long      *M_rtdInfo;
>   str_int_map         M_rtdMap;
>   int_str_map         M_revRtdMap;
> 
>   T_dynamicalRepartition** M_ResponseTimeRepartition;
>   T_dynamicalRepartition*  M_CallLengthRepartition;
>   int                      M_SizeOfResponseTimeRepartition;
>   int                      M_SizeOfCallLengthRepartition;
>   struct timeval           M_startTime;
>   struct timeval           M_pdStartTime;
>   struct timeval           M_plStartTime;
> 
>   bool                     M_headerAlreadyDisplayed;
>   char*                    M_fileName;
>   ofstream*                M_outputStream;
> 
>   bool                     M_headerAlreadyDisplayedRtt ;
>   char*                    M_fileNameRtt               ;
>   ofstream*                M_outputStreamRtt           ;
>   double                   M_time_ref                  ;
> 
>   T_pValue_rtt             M_dumpRespTime              ;
>   unsigned int             M_counterDumpRespTime       ;
>   unsigned long            M_report_freq_dumpRtt       ;
> 
>   /**
>    * initRepartition
>    * This methode is used to create the repartition table with a table 
of 
>    * unsigned int the reparition is created like following, with Vi the 
given 
>    * value in the table
>    * 0    <= x <  V1 
>    * V1   <= x <  V2 
>    *  ...
>    * Vn-1 <= x <  Vn
>    *         x >= Vn
>    * So the repartition table have the size n+1 if the given table has a 
size 
>    * of n */
>   void  initRepartition(unsigned int* repartition, int nombre,
>                         T_dynamicalRepartition ** tabRepartition, int* 
nbTab);
> 
>   /**
>    * createIntegerTable
>    * this method try to create a table of unsigned int with the listof 
char* 
>    * passed in parameters
>    * if it succed, it's return true (1)
>    * else it's return false (0)
>    */
>   int  createIntegerTable(char * P_listeStr, 
>                           unsigned int ** listeInteger, 
>                           int * sizeOfList);
> 
>   /**
>    * isWellFormed
>    * this method check if the char* passed in parameter in really a list 
of 
>    * integer separated with comma.
>    * if yes, it's return true (1)
>    * else, it's return false (0)
>    */
>   int  isWellFormed(char * P_listeStr, int * nombre);
> 
>   /**
>    * updateRepartition
>    * The method looks for the place to set the value passed in parameter
>    * Once found, the associated counter is incremented
>    */
>   void  updateRepartition( T_dynamicalRepartition* tabRepart, 
>                            int sizeOfTab, 
>                            unsigned long value);
> 
>   /**
>    * resetRepartition
>    * Zeros out all repartition counters.
>    */
>   void  resetRepartition(T_dynamicalRepartition* P_tabReport,
>                          int P_sizeOfTab);
>   /**
>    * displayRepartition
>    * Display the repartition passed in parameter at the screen
>    */
>   void  displayRepartition(FILE *f,
>                            T_dynamicalRepartition * tabRepartition, 
>                            int sizeOfTab);
> 
>   /**
>    * sRepartitionHeader
>    * return a string with the range description of the given repartition
>    */
>   char* sRepartitionHeader(T_dynamicalRepartition * tabRepartition, 
>                            int sizeOfTab,
>                            char* P_repartitionName);
> 
>   /**
>    * sRepartitionInfo
>    * return a string with the number of value in the differente range of 
the 
>    * given repartition
>    */
>   char* sRepartitionInfo(T_dynamicalRepartition * tabRepartition, 
>                          int sizeOfTab);
> 
>   /**
>    * UpdateAverageCounter
>    * This methode compute the real moyenne with the passed value on the 
given 
>    * counter
>    */
>   void updateAverageCounter(E_CounterName P_SumCounter,
>                             E_CounterName P_NbOfCallUsed,
>                             E_CounterName P_Squares,
>                             unsigned long P_value);
> 
>   /**
>    * computeStdev
>    * This method computes the standard deviation using our recorded mean
>    * and recorded mean square.
>    */
>   double computeStdev(E_CounterName P_SumCounter,
>                              E_CounterName P_NbOfCallUsed,
>                              E_CounterName P_Squares);
> 
>   /**
>    * computeMean
>    * This method computes the recorded sum and count.
>    */
>   double computeMean(E_CounterName P_SumCounter,
>                              E_CounterName P_NbOfCallUsed);
> 
>   double computeRtdMean(int which, int type);
>   double computeRtdStdev(int which, int type);
> 
>   /**
>    * Effective C++
>    *
>    * To prevent public copy ctor usage: no implementation
>    */
>   CStat (const CStat&);
> 
>   /**
>    * Effective C++
>    *
>    * To prevent public operator= usage: no implementation
>    */
>   CStat& operator=(const CStat&);
> };
> 
> /**
>  * This abstract class provides the ability to sample from a 
distribution.
>  */
> class CSample {
> public:
>    virtual double sample() = 0;
>    virtual int textDescr(char *s, int len) = 0;
>    virtual int timeDescr(char *s, int len) = 0;
>    virtual double cdfInv(double percentile) = 0;
>    virtual ~CSample();
> private:
> };
> 
> /* Always return a fixed value for the sample. */
> class CFixed : public CSample {
> public:
>    CFixed(double value);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> private:
>    double value;
> };
> 
> /* Return the default scenario duration. */
> class CDefaultPause : public CSample {
> public:
>    CDefaultPause();
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> private:
> };
> 
> /* Uniform distribution. */
> class CUniform : public CSample {
> public:
>    CUniform(double min, double max);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> private:
>    double min, max;
> };
> 
> #ifdef HAVE_GSL
> /* Normal distribution. */
> class CNormal : public CSample {
> public:
>    CNormal(double mean, double stdev);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> protected:
>    double mean, stdev;
>    gsl_rng *rng;
> };
> 
> /* Lognormal distribution. */
> class CLogNormal : public CNormal {
> public:
>    CLogNormal(double mean, double stdev) : CNormal(mean, stdev) {};
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> };
> 
> /* Exponential distribution. */
> class CExponential : public CSample {
> public:
>    CExponential(double mean);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> private:
>    double mean;
>    gsl_rng *rng;
> };
> 
> /* Weibull distribution. */
> class CWeibull : public CSample {
> public:
>    CWeibull(double lambda, double k);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> private:
>    double lambda, k;
>    gsl_rng *rng;
> };
> 
> /* Pareto distribution. */
> class CPareto : public CSample {
> public:
>    CPareto(double k, double xsubm);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> protected:
>    double k, xsubm;
>    gsl_rng *rng;
> };
> 
> /* Generalized Pareto distribution. */
> class CGPareto : public CSample {
> public:
>    CGPareto(double shape, double scale, double location);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> protected:
>    double shape, scale, location;
>    gsl_rng *rng;
> };
> 
> 
> /* Gamma distribution. */
> class CGamma : public CSample {
> public:
>    CGamma(double k, double theta);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> protected:
>    double k, theta;
>    gsl_rng *rng;
> };
> 
> /* Negative Binomial distribution. */
> class CNegBin : public CSample {
> public:
>    CNegBin(double p, double n);
>    double sample();
>    int textDescr(char *s, int len);
>    int timeDescr(char *s, int len);
>    double cdfInv(double percentile);
> protected:
>    double p, n;
>    gsl_rng *rng;
> };
> #endif
> 
> #endif // __STAT_H__
> 
------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> SourcForge Community
> SourceForge wants to tell your story.
> http://p.sf.net/sfu/sf-spreadtheword
> _______________________________________________
> Sipp-users mailing list
> Sipp-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sipp-users


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Sipp-users mailing list
Sipp-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sipp-users

Reply via email to