Reworking the libevent handling to have only one event handle per file descriptor.
This should be a speed improvement in any case, and might also be the cause for bug #0000016: Hubsoft locks up at around 60 users
This commit is contained in:
		
							parent
							
								
									ae017af758
								
							
						
					
					
						commit
						97b53a99fb
					
				@ -146,8 +146,8 @@ int hub_handle_support(struct user* u, struct adc_message* cmd)
 | 
			
		||||
		if (ok)
 | 
			
		||||
		{
 | 
			
		||||
			hub_send_handshake(u);
 | 
			
		||||
			if (u->ev_read)
 | 
			
		||||
				event_add(u->ev_read, &timeout);
 | 
			
		||||
			if (u->ev_handle)
 | 
			
		||||
				event_add(u->ev_handle, &timeout);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
@ -71,8 +71,8 @@ void on_login_success(struct user* u)
 | 
			
		||||
		hub_send_motd(u);
 | 
			
		||||
		
 | 
			
		||||
	/* reset to idle timeout */
 | 
			
		||||
	if (u->ev_read)
 | 
			
		||||
		event_add(u->ev_read, &timeout);
 | 
			
		||||
	if (u->ev_handle)
 | 
			
		||||
		event_add(u->ev_handle, &timeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void on_login_failure(struct user* u, enum status_message msg)
 | 
			
		||||
 | 
			
		||||
@ -149,18 +149,18 @@ void net_on_read(int fd, short ev, void *arg)
 | 
			
		||||
	
 | 
			
		||||
	if (user_is_logged_in(user))
 | 
			
		||||
	{
 | 
			
		||||
		if (user->ev_read)
 | 
			
		||||
		if (user->ev_handle)
 | 
			
		||||
		{
 | 
			
		||||
			struct timeval timeout = { TIMEOUT_IDLE, 0 };
 | 
			
		||||
			event_add(user->ev_read, &timeout);
 | 
			
		||||
			event_add(user->ev_handle, &timeout);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if (user_is_connecting(user))
 | 
			
		||||
	{
 | 
			
		||||
		if (user->ev_read)
 | 
			
		||||
		if (user->ev_handle)
 | 
			
		||||
		{
 | 
			
		||||
			struct timeval timeout = { TIMEOUT_HANDSHAKE, 0 };
 | 
			
		||||
			event_add(user->ev_read, &timeout);
 | 
			
		||||
			event_add(user->ev_handle, &timeout);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -250,8 +250,8 @@ void net_on_write(int fd, short ev, void *arg)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (user->send_queue_size > 0 && user->ev_write)
 | 
			
		||||
			event_add(user->ev_write, NULL);
 | 
			
		||||
		if (user->send_queue_size > 0 && user->ev_handle)
 | 
			
		||||
			event_add(user->ev_handle, NULL);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -307,11 +307,9 @@ void net_on_accept(int server_fd, short ev, void *arg)
 | 
			
		||||
		net_set_nonblocking(fd, 1);
 | 
			
		||||
		net_set_nosigpipe(fd, 1);
 | 
			
		||||
		
 | 
			
		||||
		event_set(user->ev_read,  fd, EV_READ | EV_PERSIST, net_on_read,  user);
 | 
			
		||||
		event_set(user->ev_write, fd, EV_WRITE,             net_on_write, user);
 | 
			
		||||
		event_base_set(hub->evbase, user->ev_read);
 | 
			
		||||
		event_base_set(hub->evbase, user->ev_write);
 | 
			
		||||
		event_add(user->ev_read,  &timeout);
 | 
			
		||||
		event_set(user->ev_handle,  fd, EV_READ | EV_PERSIST, net_on_read,  user);
 | 
			
		||||
		event_base_set(hub->evbase, user->ev_handle);
 | 
			
		||||
		event_add(user->ev_handle,  &timeout);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -135,8 +135,8 @@ int route_to_user(struct user* user, struct adc_message* msg)
 | 
			
		||||
		{
 | 
			
		||||
			queue_command(user, msg, ret);
 | 
			
		||||
			
 | 
			
		||||
			if (user->send_queue_size && user->ev_write)
 | 
			
		||||
				event_add(user->ev_write, NULL);
 | 
			
		||||
			if (user->send_queue_size && user->ev_handle)
 | 
			
		||||
				event_add(user->ev_handle, NULL);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
@ -158,8 +158,8 @@ int route_to_user(struct user* user, struct adc_message* msg)
 | 
			
		||||
		{
 | 
			
		||||
			/* queue command */
 | 
			
		||||
			queue_command(user, msg, 0);
 | 
			
		||||
                        if (user->ev_write)
 | 
			
		||||
				event_add(user->ev_write, NULL);
 | 
			
		||||
                        if (user->ev_handle)
 | 
			
		||||
				event_add(user->ev_handle, NULL);
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								src/user.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								src/user.c
									
									
									
									
									
								
							@ -30,13 +30,11 @@ struct user* user_create(struct hub_info* hub, int sd)
 | 
			
		||||
	if (user == NULL)
 | 
			
		||||
		return NULL; /* OOM */
 | 
			
		||||
 | 
			
		||||
	user->ev_write = hub_malloc_zero(sizeof(struct event));
 | 
			
		||||
	user->ev_read  = hub_malloc_zero(sizeof(struct event));
 | 
			
		||||
	user->ev_handle = hub_malloc_zero(sizeof(struct event));
 | 
			
		||||
 | 
			
		||||
	if (!user->ev_write || !user->ev_read)
 | 
			
		||||
	if (!user->ev_handle)
 | 
			
		||||
	{
 | 
			
		||||
	    hub_free(user->ev_read);
 | 
			
		||||
	    hub_free(user->ev_write);
 | 
			
		||||
	    hub_free(user->ev_handle);
 | 
			
		||||
	    hub_free(user);
 | 
			
		||||
	    return NULL;
 | 
			
		||||
	}
 | 
			
		||||
@ -65,18 +63,11 @@ void user_destroy(struct user* user)
 | 
			
		||||
{
 | 
			
		||||
	hub_log(log_trace, "user_destroy(), user=%p", user);
 | 
			
		||||
 | 
			
		||||
	if (user->ev_write)
 | 
			
		||||
	if (user->ev_handle)
 | 
			
		||||
	{
 | 
			
		||||
		event_del(user->ev_write);
 | 
			
		||||
		hub_free(user->ev_write);
 | 
			
		||||
		user->ev_write = 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	if (user->ev_read)
 | 
			
		||||
	{
 | 
			
		||||
		event_del(user->ev_read);
 | 
			
		||||
		hub_free(user->ev_read);
 | 
			
		||||
		user->ev_read = 0;
 | 
			
		||||
		event_del(user->ev_handle);
 | 
			
		||||
		hub_free(user->ev_handle);
 | 
			
		||||
		user->ev_handle = 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	net_close(user->sd);
 | 
			
		||||
@ -213,11 +204,11 @@ void user_disconnect(struct user* user, int reason)
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* dont read more data from this user */
 | 
			
		||||
	if (user->ev_read)
 | 
			
		||||
	if (user->ev_handle)
 | 
			
		||||
	{
 | 
			
		||||
		event_del(user->ev_read);
 | 
			
		||||
		hub_free(user->ev_read);
 | 
			
		||||
		user->ev_read = 0;
 | 
			
		||||
		event_del(user->ev_handle);
 | 
			
		||||
		hub_free(user->ev_handle);
 | 
			
		||||
		user->ev_handle = 0;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	hub_log(log_trace, "user_disconnect(), user=%p, reason=%d, state=%d", user, reason, user->state);
 | 
			
		||||
 | 
			
		||||
@ -99,8 +99,7 @@ struct user_counts
 | 
			
		||||
struct user
 | 
			
		||||
{
 | 
			
		||||
	int                  sd;                      /** socket descriptor */
 | 
			
		||||
	struct event*        ev_read;                 /** libevent struct for read events */
 | 
			
		||||
	struct event*        ev_write;                /** libevent struct for write events */
 | 
			
		||||
	struct event*        ev_handle;
 | 
			
		||||
	enum user_state      state;                   /** see enum user_state */
 | 
			
		||||
	enum user_credentials credentials;            /** see enum user_credentials */
 | 
			
		||||
	struct user_info     id;                      /** Contains nick name and CID */
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user