Skip to content

Commit

Permalink
apps.interlink: avoid engine/appname kludge by attaching in :link()
Browse files Browse the repository at this point in the history
By postponing attaching inter-process links to the :link() callback we can
avoid the kludge introduced to core.app that passes the app name to :new().
Semantics should be unchanged, although it might be a little less obvious when
the initialization happens.
  • Loading branch information
eugeneia committed May 3, 2018
1 parent c583ac7 commit 5fbe79e
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 18 deletions.
25 changes: 16 additions & 9 deletions src/apps/interlink/receiver.lua
Expand Up @@ -7,14 +7,19 @@ local interlink = require("lib.interlink")

local Receiver = {name="apps.interlink.Receiver"}

function Receiver:new (_, name)
function Receiver:new ()
packet.enable_group_freelist()
local self = {}
self.shm_name = "group/interlink/"..name..".interlink"
self.backlink = "interlink/receiver/"..name..".interlink"
self.interlink = interlink.attach_receiver(self.shm_name)
shm.alias(self.backlink, self.shm_name)
return setmetatable(self, {__index=Receiver})
return setmetatable({attached=false}, {__index=Receiver})
end

function Receiver:link ()
if not self.attached then
self.shm_name = "group/interlink/"..self.appname..".interlink"
self.backlink = "interlink/receiver/"..self.appname..".interlink"
self.interlink = interlink.attach_receiver(self.shm_name)
shm.alias(self.backlink, self.shm_name)
self.attached = true
end
end

function Receiver:pull ()
Expand All @@ -28,8 +33,10 @@ function Receiver:pull ()
end

function Receiver:stop ()
interlink.detach_receiver(self.interlink, self.shm_name)
shm.unlink(self.backlink)
if self.attached then
interlink.detach_receiver(self.interlink, self.shm_name)
shm.unlink(self.backlink)
end
end

-- Detach receivers to prevent leaking interlinks opened by pid.
Expand Down
25 changes: 16 additions & 9 deletions src/apps/interlink/transmitter.lua
Expand Up @@ -7,14 +7,19 @@ local interlink = require("lib.interlink")

local Transmitter = {name="apps.interlink.Transmitter"}

function Transmitter:new (_, name)
function Transmitter:new ()
packet.enable_group_freelist()
local self = {}
self.shm_name = "group/interlink/"..name..".interlink"
self.backlink = "interlink/transmitter/"..name..".interlink"
self.interlink = interlink.attach_transmitter(self.shm_name)
shm.alias(self.backlink, self.shm_name)
return setmetatable(self, {__index=Transmitter})
return setmetatable({attached=false}, {__index=Transmitter})
end

function Transmitter:link ()
if not self.attached then
self.shm_name = "group/interlink/"..self.appname..".interlink"
self.backlink = "interlink/transmitter/"..self.appname..".interlink"
self.interlink = interlink.attach_transmitter(self.shm_name)
shm.alias(self.backlink, self.shm_name)
self.attached = true
end
end

function Transmitter:push ()
Expand All @@ -28,8 +33,10 @@ function Transmitter:push ()
end

function Transmitter:stop ()
interlink.detach_transmitter(self.interlink, self.shm_name)
shm.unlink(self.backlink)
if self.attached then
interlink.detach_transmitter(self.interlink, self.shm_name)
shm.unlink(self.backlink)
end
end

-- Detach transmitters to prevent leaking interlinks opened by pid.
Expand Down

0 comments on commit 5fbe79e

Please sign in to comment.