[BACK]Return to Pollster.c++ CVS log [TXT][DIR] Up to [Development] / fam / fam

Annotation of fam/fam/Pollster.c++, Revision 1.1.1.1

1.1       trev        1: //  Copyright (C) 1999 Silicon Graphics, Inc.  All Rights Reserved.
                      2: //
                      3: //  This program is free software; you can redistribute it and/or modify it
                      4: //  under the terms of version 2 of the GNU General Public License as
                      5: //  published by the Free Software Foundation.
                      6: //
                      7: //  This program is distributed in the hope that it would be useful, but
                      8: //  WITHOUT ANY WARRANTY; without even the implied warranty of
                      9: //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  Further, any
                     10: //  license provided herein, whether implied or otherwise, is limited to
                     11: //  this program in accordance with the express provisions of the GNU
                     12: //  General Public License.  Patent licenses, if any, provided herein do not
                     13: //  apply to combinations of this program with other product or programs, or
                     14: //  any other product whatsoever.  This program is distributed without any
                     15: //  warranty that the program is delivered free of the rightful claim of any
                     16: //  third person by way of infringement or the like.  See the GNU General
                     17: //  Public License for more details.
                     18: //
                     19: //  You should have received a copy of the GNU General Public License along
                     20: //  with this program; if not, write the Free Software Foundation, Inc., 59
                     21: //  Temple Place - Suite 330, Boston MA 02111-1307, USA.
                     22:
                     23: #include "Pollster.h"
                     24:
                     25: #include "Interest.h"
                     26: #include "Log.h"
                     27: #include "Scheduler.h"
                     28: #include "ServerHost.h"
                     29:
                     30: bool		  Pollster::remote_polling_enabled = true;
                     31: timeval		  Pollster::pintvl;  //  set when main() calls interval()
                     32: Set<Interest *>	  Pollster::polled_interests;
                     33: Set<ServerHost *> Pollster::polled_hosts;
                     34: bool		  Pollster::polling = false;
                     35:
                     36: void
                     37: Pollster::watch(Interest *ip)
                     38: {
                     39:     polled_interests.insert(ip);
                     40:
                     41:     if (!polling)
                     42: 	start_polling();
                     43: }
                     44:
                     45: void
                     46: Pollster::forget(Interest *ip)
                     47: {
                     48:     int old_size = polled_interests.size();
                     49:     (void) polled_interests.remove(ip);
                     50:     int new_size = polled_interests.size();
                     51:
                     52:     if (old_size && !new_size && !polled_hosts.size())
                     53: 	stop_polling();
                     54: }
                     55:
                     56: void
                     57: Pollster::watch(ServerHost *ip)
                     58: {
                     59:     if (remote_polling_enabled)
                     60:     {   polled_hosts.insert(ip);
                     61:
                     62: 	if (!polling)
                     63: 	    start_polling();
                     64:     }
                     65: }
                     66:
                     67: void
                     68: Pollster::forget(ServerHost *ip)
                     69: {
                     70:     int old_size = polled_hosts.size();
                     71:     (void) polled_hosts.remove(ip);
                     72:     int new_size = polled_hosts.size();
                     73:
                     74:     if (old_size && !new_size && !polled_interests.size())
                     75: 	stop_polling();
                     76: }
                     77:
                     78: //////////////////////////////////////////////////////////////////////////////
                     79:
                     80: void
                     81: Pollster::start_polling()
                     82: {
                     83:     assert(!polling);
                     84:     assert(polled_interests.size() || polled_hosts.size());
                     85:     Log::debug("polling every %d seconds", pintvl.tv_sec);
                     86:     (void) Scheduler::install_recurring_task(pintvl, polling_task, NULL);
                     87:     polling = true;
                     88: }
                     89:
                     90: void
                     91: Pollster::stop_polling()
                     92: {
                     93:     assert(polling);
                     94:     assert(!polled_interests.size());
                     95:     assert(!polled_hosts.size());
                     96:     (void) Scheduler::remove_recurring_task(polling_task, NULL);
                     97:     polling = false;
                     98:     Log::debug("will stop polling");
                     99: }
                    100:
                    101: void
                    102: Pollster::polling_task(void *)
                    103: {
                    104:     timeval t0, t1;
                    105:     (void) gettimeofday(&t0, NULL);
                    106:
                    107:     int ni = 0;
                    108:     for (Interest *ip = polled_interests.first();
                    109: 	 ip;
                    110: 	 ip = polled_interests.next(ip))
                    111:     {
                    112: 	ip->poll();
                    113: 	ni++;
                    114:     }
                    115:
                    116:     int nh = 0;
                    117:     if (remote_polling_enabled)
                    118: 	for (ServerHost *hp = polled_hosts.first();
                    119: 	     hp;
                    120: 	     hp = polled_hosts.next(hp))
                    121: 	{
                    122: 	    hp->poll();
                    123: 	    nh++;
                    124: 	}
                    125:
                    126:     if ((ni || nh) && (Log::get_level() == Log::DEBUG))
                    127:     {   (void) gettimeofday(&t1, NULL);
                    128: 	double t = t1.tv_sec - t0.tv_sec + (t1.tv_usec - t0.tv_usec)/1000000.0;
                    129: 	Log::debug("polled %d interest%s and %d host%s in %.3f seconds",
                    130: 		   ni, ni == 1 ? "" : "s",
                    131: 		   nh, nh == 1 ? "" : "s",
                    132: 		   t);
                    133:     }
                    134: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>