Skip to content

Commit 67ba8d2

Browse files
committed
Implement suggestions from CR & delete unnecessary state field
1 parent 3abd3b5 commit 67ba8d2

File tree

9 files changed

+65
-53
lines changed

9 files changed

+65
-53
lines changed

lib/membrane/bin/pad_data.ex

+6-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ defmodule Membrane.Bin.PadData do
2727
link_id: private_field,
2828
endpoint: private_field,
2929
linked?: private_field,
30-
response_received?: private_field
30+
response_received?: private_field,
31+
linking_timeout_id: private_field,
32+
linked_in_spec?: private_field
3133
}
3234

3335
@enforce_keys [
@@ -40,7 +42,9 @@ defmodule Membrane.Bin.PadData do
4042
:endpoint,
4143
:linked?,
4244
:response_received?,
43-
:spec_ref
45+
:spec_ref,
46+
:linking_timeout_id,
47+
:linked_in_spec?
4448
]
4549

4650
defstruct @enforce_keys

lib/membrane/core/bin.ex

+2-2
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ defmodule Membrane.Core.Bin do
209209
{:noreply, state}
210210
end
211211

212-
defp do_handle_info(Message.new(:linking_timeout, pad_ref), state) do
213-
state = PadController.handle_linking_timeout(pad_ref, state)
212+
defp do_handle_info(Message.new(:linking_timeout, [pad_ref, linking_timeout_id]), state) do
213+
:ok = PadController.handle_linking_timeout(pad_ref, linking_timeout_id, state)
214214
{:noreply, state}
215215
end
216216

lib/membrane/core/bin/pad_controller.ex

+34-25
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@ defmodule Membrane.Core.Bin.PadController do
88
alias Membrane.{Core, LinkError, Pad}
99
alias Membrane.Core.Bin.{ActionHandler, CallbackContext, State}
1010
alias Membrane.Core.{CallbackHandler, Child, Message}
11-
alias Membrane.Core.Child.PadModel
1211
alias Membrane.Core.Element.StreamFormatController
1312
alias Membrane.Core.Parent.{ChildLifeController, Link, SpecificationParser}
1413

15-
require Membrane.Core.Child.PadModel
14+
require Membrane.Core.Child.PadModel, as: PadModel
1615
require Membrane.Core.Message
1716
require Membrane.Logger
1817
require Membrane.Pad
@@ -50,8 +49,7 @@ defmodule Membrane.Core.Bin.PadController do
5049
state =
5150
case PadModel.get_data(state, pad_ref) do
5251
{:error, :unknown_pad} ->
53-
init_pad_data(pad_ref, pad_info, state)
54-
|> Map.update!(:pad_refs, &[pad_ref | &1])
52+
init_pad_data(pad_ref, state)
5553

5654
# This case is for pads that were instantiated before the external link request,
5755
# that is in the internal link request (see `handle_internal_link_request/4`).
@@ -69,9 +67,17 @@ defmodule Membrane.Core.Bin.PadController do
6967
state
7068
end
7169

72-
state = PadModel.update_data!(state, pad_ref, &%{&1 | link_id: link_id, options: pad_options})
70+
linking_timeout_id = make_ref()
7371

74-
_ref = Process.send_after(self(), Message.new(:linking_timeout, pad_ref), 5000)
72+
state =
73+
PadModel.update_data!(
74+
state,
75+
pad_ref,
76+
&%{&1 | link_id: link_id, linking_timeout_id: linking_timeout_id, options: pad_options}
77+
)
78+
79+
message = Message.new(:linking_timeout, [pad_ref, linking_timeout_id])
80+
_ref = Process.send_after(self(), message, 5000)
7581

7682
maybe_handle_pad_added(pad_ref, state)
7783
end
@@ -96,20 +102,16 @@ defmodule Membrane.Core.Bin.PadController do
96102
end
97103
end
98104

99-
@spec handle_linking_timeout(Pad.ref(), State.t()) :: State.t() | no_return()
100-
def handle_linking_timeout(pad_ref, state) do
101-
case Map.fetch(state.linking_timeout_counters, pad_ref) do
102-
{:ok, 1} ->
103-
Map.update!(state, :linking_timeout_counters, &Map.delete(&1, pad_ref))
104-
105-
{:ok, counter} when counter > 1 ->
106-
put_in(state.linking_timeout_counters[pad_ref], counter - 1)
107-
108-
_else ->
109-
raise Membrane.LinkError, """
110-
Bin pad #{inspect(pad_ref)} wasn't linked internally within timeout. Pad data: #{PadModel.get_data(state, pad_ref) |> inspect(pretty: true)}
111-
"""
105+
@spec handle_linking_timeout(Pad.ref(), reference(), State.t()) :: :ok | no_return()
106+
def handle_linking_timeout(pad_ref, linking_timeout_id, state) do
107+
with {:ok, pad_data} <- PadModel.get_data(state, pad_ref),
108+
%{linking_timeout_id: ^linking_timeout_id, linked_in_spec?: false} <- pad_data do
109+
raise Membrane.LinkError, """
110+
Bin pad #{inspect(pad_ref)} wasn't linked internally within timeout. Pad data: #{PadModel.get_data(state, pad_ref) |> inspect(pretty: true)}
111+
"""
112112
end
113+
114+
:ok
113115
end
114116

115117
@doc """
@@ -137,7 +139,7 @@ defmodule Membrane.Core.Bin.PadController do
137139

138140
# Static pads can be linked internally before the external link request
139141
pad_info.availability == :always ->
140-
init_pad_data(pad_ref, pad_info, state)
142+
init_pad_data(pad_ref, state)
141143

142144
true ->
143145
raise LinkError, "Dynamic pads must be firstly linked externally, then internally"
@@ -282,7 +284,6 @@ defmodule Membrane.Core.Bin.PadController do
282284
with {:ok, %{availability: :on_request}} <- PadModel.get_data(state, pad_ref) do
283285
{pad_data, state} =
284286
maybe_handle_pad_removed(pad_ref, state)
285-
|> Map.update!(:pad_refs, &List.delete(&1, pad_ref))
286287
|> PadModel.pop_data!(pad_ref)
287288

288289
if pad_data.endpoint do
@@ -349,9 +350,15 @@ defmodule Membrane.Core.Bin.PadController do
349350
end
350351
end
351352

352-
defp init_pad_data(pad_ref, pad_info, state) do
353+
@spec init_pad_data(Pad.ref(), State.t()) :: State.t()
354+
def init_pad_data(pad_ref, state) do
355+
if PadModel.assert_instance(state, pad_ref) == :ok do
356+
raise "Cannot init pad data for pad #{inspect(pad_ref)}, because it already exists"
357+
end
358+
353359
pad_data =
354-
pad_info
360+
state.pads_info
361+
|> Map.get(Pad.name_by_ref(pad_ref))
355362
|> Map.delete(:accepted_formats_str)
356363
|> Map.merge(%{
357364
ref: pad_ref,
@@ -360,10 +367,12 @@ defmodule Membrane.Core.Bin.PadController do
360367
linked?: false,
361368
response_received?: false,
362369
spec_ref: nil,
363-
options: nil
370+
options: nil,
371+
linking_timeout_id: nil,
372+
linked_in_spec?: false
364373
})
365374
|> then(&struct!(Membrane.Bin.PadData, &1))
366375

367-
put_in(state, [:pads_data, pad_ref], pad_data)
376+
put_in(state.pads_data[pad_ref], pad_data)
368377
end
369378
end

lib/membrane/core/bin/state.ex

-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ defmodule Membrane.Core.Bin.State do
2020
children: ChildrenModel.children(),
2121
subprocess_supervisor: pid(),
2222
name: Membrane.Bin.name() | nil,
23-
pad_refs: [Pad.ref()],
2423
pads_info: PadModel.pads_info() | nil,
2524
pads_data: PadModel.pads_data() | nil,
2625
parent_pid: pid,
@@ -45,7 +44,6 @@ defmodule Membrane.Core.Bin.State do
4544
terminating?: boolean(),
4645
resource_guard: Membrane.ResourceGuard.t(),
4746
setup_incomplete?: boolean(),
48-
linking_timeout_counters: %{optional(Pad.ref()) => integer()},
4947
stalker: Membrane.Core.Stalker.t()
5048
}
5149

@@ -63,7 +61,6 @@ defmodule Membrane.Core.Bin.State do
6361
parent_pid: nil,
6462
playback: :stopped,
6563
internal_state: nil,
66-
pad_refs: [],
6764
pads_info: nil,
6865
children: %{},
6966
links: %{},
@@ -77,6 +74,5 @@ defmodule Membrane.Core.Bin.State do
7774
resource_guard: nil,
7875
subprocess_supervisor: nil,
7976
children_log_metadata: [],
80-
linking_timeout_counters: %{},
8177
pads_data: nil
8278
end

lib/membrane/core/child/pad_spec_handler.ex

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ defmodule Membrane.Core.Child.PadSpecHandler do
2121
| pads_info:
2222
get_pads(state)
2323
|> Map.new(),
24-
pads_data: %{},
25-
pad_refs: []
24+
pads_data: %{}
2625
}
2726
end
2827

lib/membrane/core/element/pad_controller.ex

+2-6
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,7 @@ defmodule Membrane.Core.Element.PadController do
229229
state = generate_eos_if_needed(pad_ref, state)
230230
state = maybe_handle_pad_removed(pad_ref, state)
231231

232-
{pad_data, state} =
233-
Map.update!(state, :pad_refs, &List.delete(&1, pad_ref))
234-
|> PadModel.pop_data!(pad_ref)
232+
{pad_data, state} = PadModel.pop_data!(state, pad_ref)
235233

236234
with %{direction: :input, flow_control: :auto, other_effective_flow_control: :pull} <-
237235
pad_data do
@@ -321,9 +319,7 @@ defmodule Membrane.Core.Element.PadController do
321319
|> then(&struct!(Membrane.Element.PadData, &1))
322320

323321
state =
324-
state
325-
|> put_in([:pads_data, endpoint.pad_ref], pad_data)
326-
|> Map.update!(:pad_refs, &[endpoint.pad_ref | &1])
322+
put_in(state, [:pads_data, endpoint.pad_ref], pad_data)
327323

328324
:ok =
329325
AtomicDemand.set_sender_status(

lib/membrane/core/element/state.ex

-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ defmodule Membrane.Core.Element.State do
1919
type: Element.type(),
2020
name: Element.name(),
2121
internal_state: Element.state() | nil,
22-
pad_refs: [Pad.ref()] | nil,
2322
pads_info: PadModel.pads_info() | nil,
2423
pads_data: PadModel.pads_data() | nil,
2524
parent_pid: pid,
@@ -65,7 +64,6 @@ defmodule Membrane.Core.Element.State do
6564
playback: :stopped,
6665
type: nil,
6766
internal_state: nil,
68-
pad_refs: [],
6967
pads_info: %{},
7068
synchronization: nil,
7169
delayed_demands: MapSet.new(),

lib/membrane/core/parent/child_life_controller.ex

+18-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ defmodule Membrane.Core.Parent.ChildLifeController do
55
alias __MODULE__.{CrashGroupUtils, LinkUtils, StartupUtils}
66
alias Membrane.{Child, ChildrenSpec}
77
alias Membrane.Core.{Bin, CallbackHandler, Component, Parent, Pipeline}
8+
alias Membrane.Core.Bin.PadController
89

910
alias Membrane.Core.Parent.{
1011
ChildEntryParser,
@@ -17,6 +18,7 @@ defmodule Membrane.Core.Parent.ChildLifeController do
1718
alias Membrane.Pad
1819
alias Membrane.ParentError
1920

21+
require Membrane.Core.Child.PadModel, as: PadModel
2022
require Membrane.Core.Component
2123
require Membrane.Core.Message, as: Message
2224
require Membrane.Logger
@@ -312,17 +314,25 @@ defmodule Membrane.Core.Parent.ChildLifeController do
312314
defp do_proceed_spec_startup(spec_ref, %{status: :created} = spec_data, state) do
313315
state =
314316
with %Bin.State{} <- state do
315-
linking_timeout_counters =
317+
bin_pads_linked_in_spec =
316318
spec_data.links_ids
317319
|> Enum.map(&Map.fetch!(state.links, &1))
318320
|> Enum.flat_map(&[&1.from, &1.to])
319-
|> Enum.filter(&(&1.child == {Membrane.Bin, :itself}))
320-
|> Enum.reduce(
321-
state.linking_timeout_counters,
322-
&Map.update(&2, &1.pad_ref, 1, fn i -> i + 1 end)
323-
)
324-
325-
%{state | linking_timeout_counters: linking_timeout_counters}
321+
|> Enum.flat_map(fn
322+
%{child: {Membrane.Bin, :itself}, pad_ref: pad_ref} -> [pad_ref]
323+
_other -> []
324+
end)
325+
326+
bin_pads_linked_in_spec
327+
|> Enum.reduce(state, fn pad_ref, state ->
328+
with {:error, :unknown_pad} <- PadModel.assert_instance(state, pad_ref) do
329+
PadController.init_pad_data(pad_ref, state)
330+
# |> Map.update!(:pad_refs, &[pad_ref | &1])
331+
else
332+
:ok -> state
333+
end
334+
|> PadModel.set_data!(pad_ref, :linked_in_spec?, true)
335+
end)
326336
end
327337

328338
do_proceed_spec_startup(spec_ref, %{spec_data | status: :initializing}, state)

test/membrane/core/element/pad_controller_test.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ defmodule Membrane.Core.Element.PadControllerTest do
6565
state
6666
)
6767

68-
assert Map.drop(new_state, [:pads_data, :pad_refs]) ==
69-
Map.drop(state, [:pads_data, :pad_refs])
68+
assert Map.delete(new_state, :pads_data) ==
69+
Map.delete(state, :pads_data)
7070

7171
assert PadModel.assert_instance(new_state, :input) == :ok
7272
end

0 commit comments

Comments
 (0)