浏览代码

Btpd now uses evloop, it's own event loop, instead of libevent.

master
Richard Nyberg 16 年前
父节点
当前提交
eb421cc586
共有 15 个文件被更改,包括 160 次插入125 次删除
  1. +27
    -20
      btpd/btpd.c
  2. +8
    -3
      btpd/btpd.h
  3. +5
    -8
      btpd/cli_if.c
  4. +4
    -4
      btpd/content.c
  5. +19
    -21
      btpd/http_tr_if.c
  6. +3
    -10
      btpd/main.c
  7. +8
    -7
      btpd/nameconn.c
  8. +30
    -17
      btpd/net.c
  9. +1
    -2
      btpd/net.h
  10. +1
    -2
      btpd/net_types.h
  11. +4
    -7
      btpd/peer.c
  12. +2
    -3
      btpd/thread_cb.c
  13. +12
    -12
      btpd/tracker_req.c
  14. +5
    -5
      btpd/upload.c
  15. +31
    -4
      btpd/util.c

+ 27
- 20
btpd/btpd.c 查看文件

@@ -4,9 +4,9 @@
#include <signal.h>

static uint8_t m_peer_id[20];
static struct event m_sigint;
static struct event m_sigterm;
static struct event m_heartbeat;
static struct timeout m_heartbeat;
static struct timeout m_grace_timer;
static int m_signal;
static int m_shutdown;

long btpd_seconds;
@@ -37,11 +37,9 @@ btpd_shutdown(int grace_seconds)
BTPDQ_FOREACH(tp, torrent_get_all(), entry)
if (tp->state != T_STOPPING)
torrent_stop(tp, 0);
if (grace_seconds >= 0) {
if (event_once(-1, EV_TIMEOUT, grace_cb, NULL,
(& (struct timeval) { grace_seconds, 0 })) != 0)
btpd_err("failed to add event (%s).\n", strerror(errno));
}
if (grace_seconds >= 0)
btpd_timer_add(&m_grace_timer,
(& (struct timespec){ grace_seconds, 0 }));
}
}

@@ -57,19 +55,23 @@ btpd_get_peer_id(void)
}

static void
signal_cb(int signal, short type, void *arg)
signal_handler(int signal)
{
btpd_log(BTPD_L_BTPD, "Got signal %d.\n", signal);
btpd_shutdown(30);
m_signal = signal;
}

static void
heartbeat_cb(int fd, short type, void *arg)
{
btpd_ev_add(&m_heartbeat, (& (struct timeval) { 1, 0 }));
btpd_timer_add(&m_heartbeat, (& (struct timespec) { 1, 0 }));
btpd_seconds++;
net_on_tick();
torrent_on_tick_all();
if (m_signal) {
btpd_log(BTPD_L_BTPD, "Got signal %d.\n", m_signal);
btpd_shutdown(30);
m_signal = 0;
}
if (m_shutdown && torrent_count() == 0)
btpd_exit(0);
}
@@ -82,11 +84,21 @@ void addrinfo_init(void);
void
btpd_init(void)
{
struct sigaction sa;
unsigned long seed;
uint8_t idcon[1024];
struct timeval now;
int n;

bzero(&sa, sizeof(sa));
sa.sa_handler = SIG_IGN;
sa.sa_flags = SA_RESTART;
sigfillset(&sa.sa_mask);
sigaction(SIGPIPE, &sa, NULL);
sa.sa_handler = signal_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);

gettimeofday(&now, NULL);
n = snprintf(idcon, sizeof(idcon), "%ld%ld%d", now.tv_sec, now.tv_usec,
net_port);
@@ -111,14 +123,9 @@ btpd_init(void)
tr_init();
tlib_init();

signal(SIGPIPE, SIG_IGN);

signal_set(&m_sigint, SIGINT, signal_cb, NULL);
btpd_ev_add(&m_sigint, NULL);
signal_set(&m_sigterm, SIGTERM, signal_cb, NULL);
btpd_ev_add(&m_sigterm, NULL);
evtimer_set(&m_heartbeat, heartbeat_cb, NULL);
btpd_ev_add(&m_heartbeat, (& (struct timeval) { 1, 0 }));
timer_init(&m_grace_timer, grace_cb, NULL);
timer_init(&m_heartbeat, heartbeat_cb, NULL);
btpd_timer_add(&m_heartbeat, (& (struct timespec) { 1, 0 }));

if (!empty_start)
active_start();


+ 8
- 3
btpd/btpd.h 查看文件

@@ -26,7 +26,7 @@
#define DAEMON
#include <btpd_if.h>
#undef DAEMON
#include <event.h>
#include <evloop.h>
#include <metainfo.h>
#include <queue.h>
#include <subr.h>
@@ -70,8 +70,13 @@ void *btpd_malloc(size_t size);
__attribute__((malloc))
void *btpd_calloc(size_t nmemb, size_t size);

void btpd_ev_add(struct event *ev, struct timeval *tv);
void btpd_ev_del(struct event *ev);
void btpd_ev_new(struct fdev *ev, int fd, uint16_t flags, evloop_cb_t cb,
void *arg);
void btpd_ev_del(struct fdev *ev);
void btpd_ev_enable(struct fdev *ev, uint16_t flags);
void btpd_ev_disable(struct fdev *ev, uint16_t flags);
void btpd_timer_add(struct timeout *to, struct timespec *ts);
void btpd_timer_del(struct timeout *to);

void btpd_shutdown(int grace_seconds);
int btpd_is_stopping(void);


+ 5
- 8
btpd/cli_if.c 查看文件

@@ -5,10 +5,10 @@

struct cli {
int sd;
struct event read;
struct fdev read;
};

static struct event m_cli_incoming;
static struct fdev m_cli_incoming;

static int
write_buffer(struct cli *cli, struct iobuf *iob)
@@ -420,10 +420,10 @@ cli_read_cb(int sd, short type, void *arg)
goto error;

free(msg);
btpd_ev_add(&cli->read, NULL);
return;

error:
btpd_ev_del(&cli->read);
close(cli->sd);
free(cli);
if (msg != NULL)
@@ -447,8 +447,7 @@ client_connection_cb(int sd, short type, void *arg)

struct cli *cli = btpd_calloc(1, sizeof(*cli));
cli->sd = nsd;
event_set(&cli->read, cli->sd, EV_READ, cli_read_cb, cli);
btpd_ev_add(&cli->read, NULL);
btpd_ev_new(&cli->read, cli->sd, EV_READ, cli_read_cb, cli);
}

void
@@ -478,7 +477,5 @@ ipc_init(void)
listen(sd, 4);
set_nonblocking(sd);

event_set(&m_cli_incoming, sd, EV_READ | EV_PERSIST,
client_connection_cb, NULL);
btpd_ev_add(&m_cli_incoming, NULL);
btpd_ev_new(&m_cli_incoming, sd, EV_READ, client_connection_cb, NULL);
}

+ 4
- 4
btpd/content.c 查看文件

@@ -53,7 +53,7 @@ BTPDQ_HEAD(std_tq, start_test_data);

static struct std_tq m_startq = BTPDQ_HEAD_INITIALIZER(m_startq);

static struct event m_workev;
static struct timeout m_workev;

#define READBUFLEN (1 << 14)

@@ -456,7 +456,7 @@ startup_test_run(void)
if (std->start >= tp->npieces)
startup_test_end(tp, 1);
if (!BTPDQ_EMPTY(&m_startq))
event_add(&m_workev, (& (struct timeval) { 0, 0 }));
btpd_timer_add(&m_workev, (& (struct timespec) { 0, 0 }));
}

void
@@ -473,7 +473,7 @@ startup_test_begin(struct torrent *tp, struct file_time_size *fts)
std->fts = fts;
BTPDQ_INSERT_TAIL(&m_startq, std, entry);
if (std == BTPDQ_FIRST(&m_startq))
event_add(&m_workev, (& (struct timeval) { 0, 0 }));
btpd_timer_add(&m_workev, (& (struct timespec) { 0, 0 }));
} else {
free(fts);
startup_test_end(tp, 0);
@@ -539,5 +539,5 @@ cm_start(struct torrent *tp, int force_test)
void
cm_init(void)
{
evtimer_set(&m_workev, worker_cb, NULL);
timer_init(&m_workev, worker_cb, NULL);
}

+ 19
- 21
btpd/http_tr_if.c 查看文件

@@ -11,8 +11,7 @@ struct http_tr_req {
struct torrent *tp;
struct http_req *req;
struct iobuf buf;
struct event rdev;
struct event wrev;
struct fdev ioev;
nameconn_t nc;
int sd;
enum tr_event event;
@@ -22,8 +21,7 @@ static void
http_tr_free(struct http_tr_req *treq)
{
if (treq->sd != -1) {
btpd_ev_del(&treq->rdev);
btpd_ev_del(&treq->wrev);
btpd_ev_del(&treq->ioev);
close(treq->sd);
}
iobuf_free(&treq->buf);
@@ -143,19 +141,21 @@ http_cb(struct http_req *req, struct http_response *res, void *arg)
}

static void
sd_wr_cb(int sd, short type, void *arg)
sd_io_cb(int sd, short type, void *arg)
{
struct http_tr_req *treq = arg;
if (http_write(treq->req, sd) && http_want_write(treq->req))
btpd_ev_add(&treq->wrev, NULL);
}

static void
sd_rd_cb(int sd, short type, void *arg)
{
struct http_tr_req *treq = arg;
if (http_read(treq->req, sd) && http_want_read(treq->req))
btpd_ev_add(&treq->rdev, NULL);
switch (type) {
case EV_READ:
if (http_read(treq->req, sd) && !http_want_read(treq->req))
btpd_ev_disable(&treq->ioev, EV_READ);
break;
case EV_WRITE:
if (http_write(treq->req, sd) && !http_want_write(treq->req))
btpd_ev_disable(&treq->ioev, EV_WRITE);
break;
default:
abort();
}
}

static void
@@ -168,12 +168,10 @@ nc_cb(void *arg, int error, int sd)
http_tr_free(treq);
} else {
treq->sd = sd;
event_set(&treq->wrev, sd, EV_WRITE, sd_wr_cb, treq);
event_set(&treq->rdev, sd, EV_READ, sd_rd_cb, treq);
if (http_want_read(treq->req))
btpd_ev_add(&treq->rdev, NULL);
if (http_want_write(treq->req))
btpd_ev_add(&treq->wrev, NULL);
uint16_t flags =
(http_want_read(treq->req) ? EV_READ : 0) |
(http_want_write(treq->req) ? EV_WRITE : 0);
btpd_ev_new(&treq->ioev, sd, flags, sd_io_cb, treq);
}
}



+ 3
- 10
btpd/main.c 查看文件

@@ -2,7 +2,6 @@

#include <sys/file.h>
#include <err.h>
#include <evdns.h>
#include <getopt.h>

static void
@@ -222,19 +221,13 @@ args_done:

setup_daemon(daemonize, dir, log);

event_init();

if ((errno = evdns_resolv_conf_parse(DNS_OPTION_NAMESERVERS,
"/etc/resolv.conf")) != 0) {
btpd_log(BTPD_L_ERROR,
"failed to setup dns from /etc/resolv.conf (%d).\n", errno);
}
evloop_init();

btpd_init();

event_dispatch();
evloop();

btpd_err("Unexpected exit from libevent.\n");
btpd_err("Unexpected exit from evloop.\n");

return 1;
}

+ 8
- 7
btpd/nameconn.c 查看文件

@@ -1,7 +1,7 @@
#include "btpd.h"

struct nameconn {
struct event write_ev;
struct fdev write_ev;
void (*cb)(void *, int, int);
void *arg;
aictx_t ai_handle;
@@ -35,9 +35,11 @@ nc_write_cb(int sd, short type, void *arg)
socklen_t errsiz = sizeof(int);
if (getsockopt(nc->sd, SOL_SOCKET, SO_ERROR, &error, &errsiz) < 0)
btpd_err("getsockopt error (%s).\n", strerror(errno));
if (error == 0)
if (error == 0) {
btpd_ev_del(&nc->write_ev);
nc_done(nc, 0);
else {
} else {
btpd_ev_del(&nc->write_ev);
close(nc->sd);
nc->ai_cur = nc->ai_cur->ai_next;
nc_connect(nc);
@@ -64,10 +66,9 @@ again:
err = connect(nc->sd, ai->ai_addr, ai->ai_addrlen);
if (err == 0)
nc_done(nc, 0);
else if (err < 0 && errno == EINPROGRESS) {
event_set(&nc->write_ev, nc->sd, EV_WRITE, nc_write_cb, nc);
btpd_ev_add(&nc->write_ev, NULL);
} else {
else if (err < 0 && errno == EINPROGRESS)
btpd_ev_new(&nc->write_ev, nc->sd, EV_WRITE, nc_write_cb, nc);
else {
close(nc->sd);
nc->ai_cur = ai->ai_next;
goto again;


+ 30
- 17
btpd/net.c 查看文件

@@ -9,7 +9,7 @@ static unsigned long m_bw_bytes_out;
static unsigned long m_rate_up;
static unsigned long m_rate_dwn;

static struct event m_net_incoming;
static struct fdev m_net_incoming;

unsigned net_npeers;

@@ -154,7 +154,6 @@ net_write(struct peer *p, unsigned long wmax)
nwritten = writev(p->sd, iov, niov);
if (nwritten < 0) {
if (errno == EAGAIN) {
btpd_ev_add(&p->out_ev, NULL);
p->t_wantwrite = btpd_seconds;
return 0;
} else {
@@ -194,10 +193,10 @@ net_write(struct peer *p, unsigned long wmax)
bcount = 0;
}
}
if (!BTPDQ_EMPTY(&p->outq)) {
btpd_ev_add(&p->out_ev, NULL);
if (!BTPDQ_EMPTY(&p->outq))
p->t_wantwrite = btpd_seconds;
}
else
btpd_ev_disable(&p->ioev, EV_WRITE);
p->t_lastwrite = btpd_seconds;

return nwritten;
@@ -435,7 +434,6 @@ net_read(struct peer *p, unsigned long rmax)
}

out:
btpd_ev_add(&p->in_ev, NULL);
return nread > 0 ? nread : 0;
}

@@ -557,12 +555,14 @@ net_bw_tick(void)
if (net_bw_limit_in > 0) {
while ((p = BTPDQ_FIRST(&net_bw_readq)) != NULL && m_bw_bytes_in > 0) {
BTPDQ_REMOVE(&net_bw_readq, p, rq_entry);
btpd_ev_enable(&p->ioev, EV_READ);
p->flags &= ~PF_ON_READQ;
m_bw_bytes_in -= net_read(p, m_bw_bytes_in);
}
} else {
while ((p = BTPDQ_FIRST(&net_bw_readq)) != NULL) {
BTPDQ_REMOVE(&net_bw_readq, p, rq_entry);
btpd_ev_enable(&p->ioev, EV_READ);
p->flags &= ~PF_ON_READQ;
net_read(p, 0);
}
@@ -572,12 +572,14 @@ net_bw_tick(void)
while (((p = BTPDQ_FIRST(&net_bw_writeq)) != NULL
&& m_bw_bytes_out > 0)) {
BTPDQ_REMOVE(&net_bw_writeq, p, wq_entry);
btpd_ev_enable(&p->ioev, EV_WRITE);
p->flags &= ~PF_ON_WRITEQ;
m_bw_bytes_out -= net_write(p, m_bw_bytes_out);
}
} else {
while ((p = BTPDQ_FIRST(&net_bw_writeq)) != NULL) {
BTPDQ_REMOVE(&net_bw_writeq, p, wq_entry);
btpd_ev_enable(&p->ioev, EV_WRITE);
p->flags &= ~PF_ON_WRITEQ;
net_write(p, 0);
}
@@ -606,34 +608,49 @@ net_on_tick(void)
net_bw_tick();
}

void
net_read_cb(int sd, short type, void *arg)
static void
net_read_cb(struct peer *p)
{
struct peer *p = (struct peer *)arg;
if (net_bw_limit_in == 0)
net_read(p, 0);
else if (m_bw_bytes_in > 0)
m_bw_bytes_in -= net_read(p, m_bw_bytes_in);
else {
btpd_ev_disable(&p->ioev, EV_READ);
p->flags |= PF_ON_READQ;
BTPDQ_INSERT_TAIL(&net_bw_readq, p, rq_entry);
}
}

void
net_write_cb(int sd, short type, void *arg)
static void
net_write_cb(struct peer *p)
{
struct peer *p = (struct peer *)arg;
if (net_bw_limit_out == 0)
net_write(p, 0);
else if (m_bw_bytes_out > 0)
m_bw_bytes_out -= net_write(p, m_bw_bytes_out);
else {
btpd_ev_disable(&p->ioev, EV_WRITE);
p->flags |= PF_ON_WRITEQ;
BTPDQ_INSERT_TAIL(&net_bw_writeq, p, wq_entry);
}
}

void
net_io_cb(int sd, short type, void *arg)
{
switch (type) {
case EV_READ:
net_read_cb(arg);
break;
case EV_WRITE:
net_write_cb(arg);
break;
default:
abort();
}
}

void
net_init(void)
{
@@ -641,8 +658,6 @@ net_init(void)
m_bw_bytes_in = net_bw_limit_in;

int safe_fds = getdtablesize() * 4 / 5;
if (strcmp(event_get_method(), "select") == 0)
safe_fds = min(safe_fds, FD_SETSIZE * 4 / 5);
if (net_max_peers == 0 || net_max_peers > safe_fds)
net_max_peers = safe_fds;

@@ -661,7 +676,5 @@ net_init(void)
listen(sd, 10);
set_nonblocking(sd);

event_set(&m_net_incoming, sd, EV_READ | EV_PERSIST,
net_connection_cb, NULL);
btpd_ev_add(&m_net_incoming, NULL);
btpd_ev_new(&m_net_incoming, sd, EV_READ, net_connection_cb, NULL);
}

+ 1
- 2
btpd/net.h 查看文件

@@ -31,8 +31,7 @@ int net_active(struct torrent *tp);

int net_torrent_has_peer(struct net *n, const uint8_t *id);

void net_read_cb(int sd, short type, void *arg);
void net_write_cb(int sd, short type, void *arg);
void net_io_cb(int sd, short type, void *arg);

int net_connect2(struct sockaddr *sa, socklen_t salen, int *sd);
int net_connect(const char *ip, int port, int *sd);


+ 1
- 2
btpd/net_types.h 查看文件

@@ -52,8 +52,7 @@ struct peer {
size_t outq_off;
struct nb_tq outq;

struct event in_ev;
struct event out_ev;
struct fdev ioev;

unsigned long rate_up, rate_dwn;
unsigned long count_up, count_dwn;


+ 4
- 7
btpd/peer.c 查看文件

@@ -23,8 +23,7 @@ peer_kill(struct peer *p)
if (p->flags & PF_ON_WRITEQ)
BTPDQ_REMOVE(&net_bw_writeq, p, wq_entry);

btpd_ev_del(&p->in_ev);
btpd_ev_del(&p->out_ev);
btpd_ev_del(&p->ioev);
close(p->sd);

nl = BTPDQ_FIRST(&p->outq);
@@ -59,7 +58,7 @@ peer_send(struct peer *p, struct net_buf *nb)

if (BTPDQ_EMPTY(&p->outq)) {
assert(p->outq_off == 0);
btpd_ev_add(&p->out_ev, NULL);
btpd_ev_enable(&p->ioev, EV_WRITE);
p->t_wantwrite = btpd_seconds;
}
BTPDQ_INSERT_TAIL(&p->outq, nl, entry);
@@ -88,7 +87,7 @@ peer_unsend(struct peer *p, struct nb_link *nl)
BTPDQ_REMOVE(&net_bw_writeq, p, wq_entry);
p->flags &= ~PF_ON_WRITEQ;
} else
btpd_ev_del(&p->out_ev);
btpd_ev_disable(&p->ioev, EV_WRITE);
}
return 1;
} else
@@ -275,9 +274,7 @@ peer_create_common(int sd)

peer_set_in_state(p, SHAKE_PSTR, 28);

event_set(&p->out_ev, p->sd, EV_WRITE, net_write_cb, p);
event_set(&p->in_ev, p->sd, EV_READ, net_read_cb, p);
btpd_ev_add(&p->in_ev, NULL);
btpd_ev_new(&p->ioev, p->sd, EV_READ, net_io_cb, p);

BTPDQ_INSERT_TAIL(&net_unattached, p, p_entry);
net_npeers++;


+ 2
- 3
btpd/thread_cb.c 查看文件

@@ -15,7 +15,7 @@ struct td_cb {
BTPDQ_HEAD(td_cb_tq, td_cb);

static int m_td_rd, m_td_wr;
static struct event m_td_ev;
static struct fdev m_td_ev;
static struct td_cb_tq m_td_cbs = BTPDQ_HEAD_INITIALIZER(m_td_cbs);
static pthread_mutex_t m_td_lock;

@@ -82,6 +82,5 @@ td_init(void)
if ((err = pthread_mutex_init(&m_td_lock, NULL)) != 0)
btpd_err("Couldn't create mutex (%s).\n", strerror(err));

event_set(&m_td_ev, m_td_rd, EV_READ|EV_PERSIST, td_cb, NULL);
btpd_ev_add(&m_td_ev, NULL);
btpd_ev_new(&m_td_ev, m_td_rd, EV_READ, td_cb, NULL);
}

+ 12
- 12
btpd/tracker_req.c 查看文件

@@ -2,8 +2,8 @@

#define REQ_DELAY 1
#define STOP_ERRORS 5
#define REQ_TIMEOUT (& (struct timeval) { 120, 0 })
#define RETRY_WAIT (& (struct timeval) { rand_between(35, 70), 0 })
#define REQ_TIMEOUT (& (struct timespec) { 120, 0 })
#define RETRY_WAIT (& (struct timespec) { rand_between(35, 70), 0 })

long tr_key;

@@ -24,7 +24,7 @@ struct tracker {
int tier, url;
struct mi_announce *ann;
void *req;
struct event timer;
struct timeout timer;
};

typedef struct _dummy *(*request_fun_t)(struct torrent *, enum tr_event,
@@ -97,7 +97,7 @@ static void
tr_set_stopped(struct torrent *tp)
{
struct tracker *tr = tp->tr;
btpd_ev_del(&tr->timer);
btpd_timer_del(&tr->timer);
tr->ttype = TIMER_NONE;
if (tr->req != NULL)
tr_cancel(tr);
@@ -116,8 +116,8 @@ tr_send(struct torrent *tp, enum tr_event event)
if (m_tlast_req > btpd_seconds - REQ_DELAY) {
m_tnext_req = max(m_tnext_req, m_tlast_req) + REQ_DELAY;
tr->ttype = TIMER_RETRY;
btpd_ev_add(&tr->timer,
(& (struct timeval) { m_tnext_req - btpd_seconds, 0 }));
btpd_timer_add(&tr->timer,
(& (struct timespec) { m_tnext_req - btpd_seconds, 0 }));
return;
}

@@ -130,11 +130,11 @@ tr_send(struct torrent *tp, enum tr_event event)
}
next_url(tr);
tr->ttype = TIMER_RETRY;
btpd_ev_add(&tr->timer, (& (struct timeval) { 5, 0 }));
btpd_timer_add(&tr->timer, (& (struct timespec) { 5, 0 }));
} else {
m_tlast_req = btpd_seconds;
tr->ttype = TIMER_TIMEOUT;
btpd_ev_add(&tr->timer, REQ_TIMEOUT);
btpd_timer_add(&tr->timer, REQ_TIMEOUT);
}
}

@@ -151,11 +151,11 @@ tr_result(struct torrent *tp, enum tr_res res, int interval)
tr->interval = interval;
tr->nerrors = 0;
tr->ttype = TIMER_INTERVAL;
btpd_ev_add(&tr->timer, (& (struct timeval) { tr->interval, 0}));
btpd_timer_add(&tr->timer, (& (struct timespec) { tr->interval, 0}));
} else {
tr->nerrors++;
tr->ttype = TIMER_RETRY;
btpd_ev_add(&tr->timer, RETRY_WAIT);
btpd_timer_add(&tr->timer, RETRY_WAIT);
next_url(tr);
}
}
@@ -193,7 +193,7 @@ tr_create(struct torrent *tp, const char *mi)
tp->tr = btpd_calloc(1, sizeof(*tp->tr));
if ((tp->tr->ann = mi_announce(mi)) == NULL)
btpd_err("Out of memory.\n");
evtimer_set(&tp->tr->timer, timer_cb, tp);
timer_init(&tp->tr->timer, timer_cb, tp);
return 0;
}

@@ -202,7 +202,7 @@ tr_kill(struct torrent *tp)
{
struct tracker *tr = tp->tr;
tp->tr = NULL;
btpd_ev_del(&tr->timer);
btpd_timer_del(&tr->timer);
if (tr->req != NULL)
tr_cancel(tr);
mi_free_announce(tr->ann);


+ 5
- 5
btpd/upload.c 查看文件

@@ -1,8 +1,8 @@
#include "btpd.h"

#define CHOKE_INTERVAL (& (struct timeval) { 10, 0 })
#define CHOKE_INTERVAL (& (struct timespec) { 10, 0 })

static struct event m_choke_timer;
static struct timeout m_choke_timer;
static unsigned m_npeers;
static struct peer_tq m_peerq = BTPDQ_HEAD_INITIALIZER(m_peerq);
static int m_max_uploads;
@@ -110,7 +110,7 @@ shuffle_optimists(void)
static void
choke_cb(int sd, short type, void *arg)
{
btpd_ev_add(&m_choke_timer, CHOKE_INTERVAL);
btpd_timer_add(&m_choke_timer, CHOKE_INTERVAL);
static int cb_count = 0;
cb_count++;
if (cb_count % 3 == 0)
@@ -190,6 +190,6 @@ ul_init(void)
m_max_uploads = 5 + (net_bw_limit_out / (100 << 10));
}

evtimer_set(&m_choke_timer, choke_cb, NULL);
btpd_ev_add(&m_choke_timer, CHOKE_INTERVAL);
timer_init(&m_choke_timer, choke_cb, NULL);
btpd_timer_add(&m_choke_timer, CHOKE_INTERVAL);
}

+ 31
- 4
btpd/util.c 查看文件

@@ -22,19 +22,46 @@ btpd_calloc(size_t nmemb, size_t size)
}

void
btpd_ev_add(struct event *ev, struct timeval *tv)
btpd_ev_new(struct fdev *ev, int fd, uint16_t flags, evloop_cb_t cb, void *arg)
{
if (event_add(ev, tv) != 0)
if (fdev_new(ev, fd, flags, cb, arg) != 0)
btpd_err("Failed to add event (%s).\n", strerror(errno));
}

void
btpd_ev_del(struct event *ev)
btpd_ev_del(struct fdev *ev)
{
if (event_del(ev) != 0)
if (fdev_del(ev) != 0)
btpd_err("Failed to remove event (%s).\n", strerror(errno));
}

void
btpd_ev_enable(struct fdev *ev, uint16_t flags)
{
if (fdev_enable(ev, flags) != 0)
btpd_err("Failed to enable event (%s).\n", strerror(errno));
}

void
btpd_ev_disable(struct fdev *ev, uint16_t flags)
{
if (fdev_disable(ev, flags) != 0)
btpd_err("Failed to disable event (%s).\n", strerror(errno));
}

void
btpd_timer_add(struct timeout *to, struct timespec *ts)
{
if (timer_add(to, ts) != 0)
btpd_err("Failed to add timeout (%s).\n", strerror(errno));
}

void
btpd_timer_del(struct timeout *to)
{
timer_del(to);
}

static const char *
logtype_str(uint32_t type)
{


正在加载...
取消
保存