|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifndef RATELIMIT_H
|
|
Packit |
8f70b4 |
#define RATELIMIT_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "TimeDate.h"
|
|
Packit |
8f70b4 |
#include "buffer.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class RateLimit
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
class BytesPool
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
friend class RateLimit;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int pool;
|
|
Packit |
8f70b4 |
int rate;
|
|
Packit |
8f70b4 |
int pool_max;
|
|
Packit |
8f70b4 |
Time t;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void AdjustTime();
|
|
Packit |
8f70b4 |
void Reset();
|
|
Packit |
8f70b4 |
void Used(int);
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
private:
|
|
Packit |
8f70b4 |
static xmap_p<RateLimit> *total;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
enum level_e { PER_CONN, PER_HOST, TOTAL } level;
|
|
Packit |
8f70b4 |
RateLimit *parent;
|
|
Packit |
8f70b4 |
int xfer_number;
|
|
Packit |
8f70b4 |
BytesPool pool[2];
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void init(level_e lvl,const char *closure);
|
|
Packit |
8f70b4 |
RateLimit(level_e lvl,const char *closure) { init(lvl,closure); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void AddXfer(int add);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
RateLimit(const char *closure) { init(PER_CONN,closure); }
|
|
Packit |
8f70b4 |
~RateLimit();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
enum dir_t { GET=0, PUT=1 };
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int BytesAllowed(dir_t how);
|
|
Packit |
8f70b4 |
int BytesAllowedToGet() { return BytesAllowed(GET); }
|
|
Packit |
8f70b4 |
int BytesAllowedToPut() { return BytesAllowed(PUT); }
|
|
Packit |
8f70b4 |
void BytesUsed(int,dir_t);
|
|
Packit |
8f70b4 |
void BytesGot(int b) { BytesUsed(b,GET); }
|
|
Packit |
8f70b4 |
void BytesPut(int b) { BytesUsed(b,PUT); }
|
|
Packit |
8f70b4 |
bool Relaxed(dir_t dir);
|
|
Packit |
8f70b4 |
void Reset();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Reconfig(const char *name,const char *c);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int LimitBufferSize(int size,dir_t d) const;
|
|
Packit |
8f70b4 |
void SetBufferSize(IOBuffer *buf,int size) const;
|
|
Packit |
8f70b4 |
void SetBufferSize(SMTaskRef<IOBuffer>& buf,int size) const { SetBufferSize(buf.get_non_const(),size); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static void ClassCleanup();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif // RATELIMIT_H
|