Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
3882-Refactor-remove-client-set.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 3882-Refactor-remove-client-set.patch of Package erlang
From a6c11b12be9e2e4805e2e5a07e8e7776a3be4421 Mon Sep 17 00:00:00 2001 From: Dan Gudmundsson <dgud@erlang.org> Date: Wed, 4 Jan 2023 10:51:45 +0100 Subject: [PATCH 2/3] Refactor, remove client set Was only used to lookup if {ip,port} existed, but we have already have the qeueu for that. --- lib/ssl/src/dtls_packet_demux.erl | 72 ++++++++++++------------------- 1 file changed, 28 insertions(+), 44 deletions(-) diff --git a/lib/ssl/src/dtls_packet_demux.erl b/lib/ssl/src/dtls_packet_demux.erl index 19f1d2359c..5c4556fbb8 100644 --- a/lib/ssl/src/dtls_packet_demux.erl +++ b/lib/ssl/src/dtls_packet_demux.erl @@ -55,7 +55,6 @@ dtls_options, emulated_options, dtls_msq_queues = kv_new(), - clients = set_new(), dtls_processes = kv_new(), accepters = queue:new(), first, @@ -194,10 +193,10 @@ handle_info({ErrorTag, Socket, Error}, #state{listener = Socket, transport = {_, ?LOG_NOTICE(Report), {noreply, State#state{close=true}}; -handle_info({'DOWN', _, process, Pid, _}, #state{clients = Clients, - dtls_processes = Processes0, - dtls_msq_queues = MsgQueues0, - close = ListenClosed} = State) -> +handle_info({'DOWN', _, process, Pid, _}, + #state{dtls_processes = Processes0, + dtls_msq_queues = MsgQueues0, + close = ListenClosed} = State) -> Client = kv_get(Pid, Processes0), Processes = kv_delete(Pid, Processes0), MsgQueues = kv_delete(Client, MsgQueues0), @@ -205,8 +204,7 @@ handle_info({'DOWN', _, process, Pid, _}, #state{clients = Clients, true -> {stop, normal, State}; false -> - {noreply, State#state{clients = set_delete(Client, Clients), - dtls_processes = Processes, + {noreply, State#state{dtls_processes = Processes, dtls_msq_queues = MsgQueues}} end. @@ -219,38 +217,35 @@ code_change(_OldVsn, State, _Extra) -> %%%=================================================================== %%% Internal functions %%%=================================================================== -handle_datagram(Client, Msg, #state{clients = Clients, - accepters = AcceptorsQueue0} = State) -> - case set_is_member(Client, Clients) of - false -> +handle_datagram(Client, Msg, #state{dtls_msq_queues = MsgQueues, accepters = AcceptorsQueue0} = State) -> + case kv_lookup(Client, MsgQueues) of + none -> case queue:out(AcceptorsQueue0) of - {{value, {UserPid, From}}, AcceptorsQueue} -> - setup_new_connection(UserPid, From, Client, Msg, + {{value, {UserPid, From}}, AcceptorsQueue} -> + setup_new_connection(UserPid, From, Client, Msg, State#state{accepters = AcceptorsQueue}); {empty, _} -> %% Drop packet client will resend State end; - true -> - dispatch(Client, Msg, State) + {value, Queue} -> + dispatch(Queue, Client, Msg, State) end. -dispatch(Client, Msg, #state{dtls_msq_queues = MsgQueues} = State) -> - case kv_lookup(Client, MsgQueues) of - {value, Queue0} -> - case queue:out(Queue0) of - {{value, Pid}, Queue} when is_pid(Pid) -> - Pid ! Msg, - State#state{dtls_msq_queues = - kv_update(Client, Queue, MsgQueues)}; - {{value, _UDP}, _Queue} -> - State#state{dtls_msq_queues = - kv_update(Client, queue:in(Msg, Queue0), MsgQueues)}; - {empty, Queue} -> - State#state{dtls_msq_queues = - kv_update(Client, queue:in(Msg, Queue), MsgQueues)} - end +dispatch(Queue0, Client, Msg, #state{dtls_msq_queues = MsgQueues} = State) -> + case queue:out(Queue0) of + {{value, Pid}, Queue} when is_pid(Pid) -> + Pid ! Msg, + State#state{dtls_msq_queues = + kv_update(Client, Queue, MsgQueues)}; + {{value, _UDP}, _Queue} -> + State#state{dtls_msq_queues = + kv_update(Client, queue:in(Msg, Queue0), MsgQueues)}; + {empty, Queue} -> + State#state{dtls_msq_queues = + kv_update(Client, queue:in(Msg, Queue), MsgQueues)} end. + next_datagram(Socket, N) -> inet:setopts(Socket, [{active, N}]). @@ -259,7 +254,7 @@ handle_active_once(Client, Pid, #state{dtls_msq_queues = MsgQueues} = State0) -> case queue:out(Queue0) of {{value, Pid}, _} when is_pid(Pid) -> State0; - {{value, Msg}, Queue} -> + {{value, Msg}, Queue} -> Pid ! Msg, State0#state{dtls_msq_queues = kv_update(Client, Queue, MsgQueues)}; {empty, Queue0} -> @@ -267,7 +262,6 @@ handle_active_once(Client, Pid, #state{dtls_msq_queues = MsgQueues} = State0) -> end. setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes, - clients = Clients, dtls_msq_queues = MsgQueues, dtls_options = DTLSOpts, port = Port, @@ -281,8 +275,7 @@ setup_new_connection(User, From, Client, Msg, #state{dtls_processes = Processes, erlang:monitor(process, Pid), gen_server:reply(From, {ok, Pid, {Client, Socket}}), Pid ! Msg, - State#state{clients = set_insert(Client, Clients), - dtls_msq_queues = kv_insert(Client, queue:new(), MsgQueues), + State#state{dtls_msq_queues = kv_insert(Client, queue:new(), MsgQueues), dtls_processes = kv_insert(Pid, Client, Processes)}; {error, Reason} -> gen_server:reply(From, {error, Reason}), @@ -295,7 +288,7 @@ kv_lookup(Key, Store) -> gb_trees:lookup(Key, Store). kv_insert(Key, Value, Store) -> gb_trees:insert(Key, Value, Store). -kv_get(Key, Store) -> +kv_get(Key, Store) -> gb_trees:get(Key, Store). kv_delete(Key, Store) -> gb_trees:delete(Key, Store). @@ -304,15 +297,6 @@ kv_new() -> kv_empty(Store) -> gb_trees:is_empty(Store). -set_new() -> - gb_sets:empty(). -set_insert(Item, Set) -> - gb_sets:insert(Item, Set). -set_delete(Item, Set) -> - gb_sets:delete(Item, Set). -set_is_member(Item, Set) -> - gb_sets:is_member(Item, Set). - call(Server, Msg) -> try gen_server:call(Server, Msg, infinity) -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor