Skip to content

Commit

Permalink
backported new rbtree implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
unbit committed Jan 28, 2013
1 parent 5cce093 commit 719860a
Show file tree
Hide file tree
Showing 9 changed files with 384 additions and 439 deletions.
19 changes: 10 additions & 9 deletions core/async.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,23 +99,23 @@ struct wsgi_request *find_first_available_wsgi_req() {
void async_expire_timeouts() {

struct wsgi_request *wsgi_req;
time_t current_time = uwsgi_now();
uint64_t current_time = (uint64_t) uwsgi_now();
struct uwsgi_async_fd *uaf = NULL, *current_uaf;

struct uwsgi_rb_timer *urbt;

for (;;) {

urbt = uwsgi_min_rb_timer(uwsgi.rb_async_timeouts);
urbt = uwsgi_min_rb_timer(uwsgi.rb_async_timeouts, NULL);

if (urbt == NULL)
return;

if (urbt->key <= current_time) {
if (urbt->value <= current_time) {
wsgi_req = (struct wsgi_request *) urbt->data;
// timeout expired
wsgi_req->async_timed_out = 1;
rb_erase(&wsgi_req->async_timeout->rbt, uwsgi.rb_async_timeouts);
uwsgi_del_rb_timer(uwsgi.rb_async_timeouts, wsgi_req->async_timeout);
free(wsgi_req->async_timeout);
wsgi_req->async_timeout = NULL;
uaf = wsgi_req->waiting_fds;
Expand Down Expand Up @@ -258,12 +258,12 @@ void async_loop() {
timeout = 0;
}
else {
min_timeout = uwsgi_min_rb_timer(uwsgi.rb_async_timeouts);
min_timeout = uwsgi_min_rb_timer(uwsgi.rb_async_timeouts, NULL);
if (uwsgi.async_runqueue_cnt) {
timeout = 0;
}
if (min_timeout) {
timeout = min_timeout->key - uwsgi_now();
timeout = min_timeout->value - uwsgi_now();
if (timeout <= 0) {
async_expire_timeouts();
timeout = 0;
Expand Down Expand Up @@ -354,13 +354,14 @@ void async_loop() {
if (uwsgi.wsgi_req) {
proto_parser_status = uwsgi.wsgi_req->socket->proto(uwsgi.wsgi_req);
// reset timeout
rb_erase(&uwsgi.wsgi_req->async_timeout->rbt, uwsgi.rb_async_timeouts);
uwsgi_del_rb_timer(uwsgi.rb_async_timeouts, uwsgi.wsgi_req->async_timeout);
free(uwsgi.wsgi_req->async_timeout);
uwsgi.wsgi_req->async_timeout = NULL;
// parsing complete
if (!proto_parser_status) {
// remove fd from event poll and fd proto table
uwsgi.async_proto_fd_table[interesting_fd] = NULL;
event_queue_del_fd(uwsgi.async_queue, interesting_fd, event_queue_read());
// put request in the runqueue
runqueue_push(uwsgi.wsgi_req);
continue;
Expand Down Expand Up @@ -395,7 +396,7 @@ void async_loop() {
}
uwsgi.wsgi_req->waiting_fds = NULL;
if (uwsgi.wsgi_req->async_timeout) {
rb_erase(&uwsgi.wsgi_req->async_timeout->rbt, uwsgi.rb_async_timeouts);
uwsgi_del_rb_timer(uwsgi.rb_async_timeouts, uwsgi.wsgi_req->async_timeout);
free(uwsgi.wsgi_req->async_timeout);
uwsgi.wsgi_req->async_timeout = NULL;
}
Expand Down Expand Up @@ -433,7 +434,7 @@ void async_loop() {
}
uwsgi.wsgi_req->waiting_fds = NULL;
if (uwsgi.wsgi_req->async_timeout) {
rb_erase(&uwsgi.wsgi_req->async_timeout->rbt, uwsgi.rb_async_timeouts);
uwsgi_del_rb_timer(uwsgi.rb_async_timeouts, uwsgi.wsgi_req->async_timeout);
free(uwsgi.wsgi_req->async_timeout);
uwsgi.wsgi_req->async_timeout = NULL;
}
Expand Down
20 changes: 10 additions & 10 deletions core/master.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,28 +231,28 @@ int uwsgi_master_check_mercy() {
}


void expire_rb_timeouts(struct rb_root *root) {
void expire_rb_timeouts(struct uwsgi_rbtree *tree) {

time_t current = uwsgi_now();
uint64_t current = (uint64_t) uwsgi_now();
struct uwsgi_rb_timer *urbt;
struct uwsgi_signal_rb_timer *usrbt;

for (;;) {

urbt = uwsgi_min_rb_timer(root);
urbt = uwsgi_min_rb_timer(tree, NULL);

if (urbt == NULL)
return;

if (urbt->key <= current) {
if (urbt->value <= current) {
// remove the timeout and add another
usrbt = (struct uwsgi_signal_rb_timer *) urbt->data;
rb_erase(&usrbt->uwsgi_rb_timer->rbt, root);
free(usrbt->uwsgi_rb_timer);
uwsgi_del_rb_timer(tree, urbt);
free(urbt);
usrbt->iterations_done++;
uwsgi_route_signal(usrbt->sig);
if (!usrbt->iterations || usrbt->iterations_done < usrbt->iterations) {
usrbt->uwsgi_rb_timer = uwsgi_add_rb_timer(root, uwsgi_now() + usrbt->value, usrbt);
usrbt->uwsgi_rb_timer = uwsgi_add_rb_timer(tree, uwsgi_now() + usrbt->value, usrbt);
}
continue;
}
Expand Down Expand Up @@ -622,7 +622,7 @@ int master_loop(char **argv, char **environ) {
int check_interval = 1;

struct uwsgi_rb_timer *min_timeout;
struct rb_root *rb_timers = uwsgi_init_rb_timer();
struct uwsgi_rbtree *rb_timers = uwsgi_init_rb_timer();


if (uwsgi.procname_master) {
Expand Down Expand Up @@ -975,12 +975,12 @@ int master_loop(char **argv, char **environ) {
int interesting_fd = -1;

if (ushared->rb_timers_cnt > 0) {
min_timeout = uwsgi_min_rb_timer(rb_timers);
min_timeout = uwsgi_min_rb_timer(rb_timers, NULL);
if (min_timeout == NULL) {
check_interval = uwsgi.shared->options[UWSGI_OPTION_MASTER_INTERVAL];
}
else {
check_interval = min_timeout->key - uwsgi_now();
check_interval = min_timeout->value - uwsgi_now();
if (check_interval <= 0) {
expire_rb_timeouts(rb_timers);
check_interval = 0;
Expand Down
Loading

0 comments on commit 719860a

Please sign in to comment.