/* $Id$
 * Copyright (C) 2006-2007 VozTelecom Sistemas S.L
 * This file is part of openser, a free SIP server.
 * openser 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
 * openser is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * 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

#include <sys/time.h>
#include <time.h>
#include "../../hash_func.h"/* for TABLE_ENTRIES define*/
#include "../../locking.h"/* for TABLE_ENTRIES define*/
#include "../tm/h_table.h"/* for struct cell*/
#define STATS_CELLS 50
#define UAS_T 0
#define UAC_T 1
 * stores statistics about a given APP SERVER,
 * for instance, how much it lasted to respond to
 * a given incoming request transaction, how many requests went in
 * and how many responses went out, etc.
 * this should be about... 16*4+20*4+4 bytes...64+80+4=148 bytes each cell
struct statscell
   /** 0 = UAS, 1 = UAC*/
   char type;
   /**difference between a request_event and a reply_action*/
   union {
      struct {
	 struct timeval as_relay;
	 struct timeval event_sent;
	 struct timeval action_recvd;
      } uas;
      struct {
	 struct timeval action_recvd;
	 struct timeval event_sent;
	 struct timeval action_reply_sent;
      } uac;
/** Transactions statistics table */
struct statstable
   gen_lock_t *mutex;
   unsigned int dispatch[15];
   unsigned int event[15];
   unsigned int action[15];
   unsigned int started_transactions;
   unsigned int finished_transactions;
   unsigned int received_replies;
   unsigned int received;
extern struct statstable *seas_stats_table;
extern char use_stats;

 * Initialize and destroy statistics table
struct statstable* init_seas_stats_table();
inline int stop_stats_server();
inline void destroy_seas_stats_table();
/** Statistics server process
 * functions
void serve_stats(int fd);
int start_stats_server(char *socket);
inline int print_stats_info(int f,int sock);
 * Statistics functions
inline void as_relay_stat(struct cell *t);
inline void event_stat(struct cell *t);
inline void action_stat(struct cell *t);
inline void stats_reply();
#define receivedplus() \
   do{ \
      lock_get(seas_stats_table->mutex); \
      seas_stats_table->received++; \
      lock_release(seas_stats_table->mutex); \