Plan 9 from Bell Labs’s /usr/web/sources/contrib/mjl/wip/deluge/rate.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


#include "deluge.h"

Rate *
ratenew(int nticks)
{
	int i;
	Rate *r;

	r = emalloc(sizeof r[0]);
	r->ul = emalloc(sizeof r->ul[0] * nticks);
	r->dl = emalloc(sizeof r->dl[0] * nticks);
	r->nticks = nticks;
	r->i = 0;
	r->ulcur = 0;
	r->dlcur = 0;
	for(i = 0; i < r->nticks; i++)
		r->ul[i] = r->dl[i] = 0;
	r->first = time(0);
	return r;
}

void
rateadd(Rate *r, vlong ul, vlong dl)
{
	r->ul[r->i] += ul;
	r->ulcur += ul;
	r->dl[r->i] += dl;
	r->dlcur += dl;
}


void
ratetick(Rate *r)
{
	r->i = (r->i + 1) % r->nticks;
	if(r->first + r->nticks <= time(0)){
		r->ulcur -= r->ul[r->i];
		r->dlcur -= r->dl[r->i];
	}
	r->ul[r->i] = r->dl[r->i] = 0;
}

vlong
ratesum(Rate *r, int nticks, int which)
{
	ulong *p;
	vlong count;
	int i;

	assert(which == Upload || which == Download);

	p = (which == Upload) ? r->ul : r->dl;

	assert(nticks <= r->nticks);

	count = 0;
	i = r->i;
	while(nticks > 0){
		count += p[i];
		i = (i+1) % r->nticks;
		nticks--;
	}
	return count;
}


double
ratecurrent(Rate *r, int nticks, int which)
{
	ulong d;
	vlong sum;

	d = MIN(r->nticks, time(0) - r->first);
	sum = ratesum(r, nticks, which);
	if(d == 0)
		return (double)sum;
	return sum / d;
}


void
ratefree(Rate *r)
{
	free(r->ul);
	free(r->dl);
	free(r);
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.