time_ring.c

00001 /* Copyright 2008 Michael Marsh, University of Maryland.
00002  *
00003  * This file is part of pydtn.
00004  *
00005  * pydtn is free software: you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation, either version 3 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * pydtn is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with pydtn.  If not, see <http://www.gnu.org/licenses/>.
00017  *
00018  * The views and conclusions contained in the software and documentation
00019  * are those of the authors and should not be interpreted as representing
00020  * official policies, either expressed or implied, of the University
00021  * of Maryland.
00022  *
00023  * pydtn extends and embeds the Python interpreter, which is
00024  * Copyright 2001-2006 Python Software Foundation, All Rights Reserved,
00025  * and is released under the PSF License Agreement.
00026  *
00027  * RANLUX random number generation uses the Boost library,
00028  * Copyright 1994-2006 by various authors (details in individual files),
00029  * which is released under the Boost Software License, Version 1.0.
00030  */
00031 
00032 #include "aodv.h"
00033 
00034 void
00035 aodv_initialize_time_ring( aodv_time_ring_t* ring, unsigned int size )
00036 {
00037    unsigned int i;
00038 
00039    ring->size = size;
00040    ring->offset = 0;
00041    ring->ring = (struct timeval*) calloc( size, sizeof(struct timeval) );
00042    for ( i = 0 ; i < size ; ++i )
00043    {
00044       ring->ring[i].tv_sec = -1;
00045       ring->ring[i].tv_usec = 0;
00046    }
00047 }
00048 
00049 /***********************************************************
00050  *  Update a time ring buffer with the current time.
00051  *
00052  *  The current time is inserted only if the corresponding
00053  *  action is consistent with the rate cap.
00054  *
00055  *  Returns:
00056  *    1  if the current time was successfully inserted
00057  *    0  otherwise
00058  *
00059  */
00060 int
00061 aodv_insert_time( aodv_time_ring_t* ring )
00062 {
00063    struct timeval curr;
00064    struct timeval diff;
00065 
00066    if ( NULL == ring )
00067    {
00068       return 0;
00069    }
00070    if ( NULL == ring->ring )
00071    {
00072       return 0;
00073    }
00074 
00075    aodv_gettime( &curr );
00076 
00077    diff.tv_sec  = curr.tv_sec  - ring->ring[ring->offset].tv_sec;
00078    diff.tv_usec = curr.tv_usec - ring->ring[ring->offset].tv_usec;
00079 
00080    if ( diff.tv_usec < 0 )
00081    {
00082       diff.tv_usec += 1000000;
00083       diff.tv_sec -= 1;
00084    }
00085 
00086    if ( diff.tv_sec >= 1 )
00087    {
00088       ring->ring[ring->offset].tv_sec = curr.tv_sec;
00089       ring->ring[ring->offset].tv_usec = curr.tv_usec;
00090       ring->offset = ( ring->offset + 1 ) % ring->size;
00091       return 1;
00092    }
00093    return 0;
00094 }
00095 
00096 void
00097 free_aodv_time_ring( aodv_time_ring_t* ring )
00098 {
00099    if ( NULL == ring ) return;
00100    if ( NULL != ring->ring )
00101    {
00102       free( ring->ring );
00103    }
00104    free( ring );
00105 }
00106 

Generated on Mon Mar 24 11:15:45 2008 for Pydtn Simulator by  doxygen 1.5.4