1) Fixed a race condition that could allow multiple threads to run the plugin

initialization code simultaneously
master
Durel 7 years ago
parent c9bcb108f1
commit 2fc9be6937

@ -746,12 +746,12 @@ end -- OnPluginDisconnect
function OnPluginEnable() function OnPluginEnable()
dbot.note("OnPluginEnable!") dbot.debug("OnPluginEnable!")
end -- OnPluginEnable end -- OnPluginEnable
function OnPluginDisable() function OnPluginDisable()
dbot.note("OnPluginDisable!") dbot.debug("OnPluginDisable!")
end -- OnPluginDisable end -- OnPluginDisable
@ -771,7 +771,7 @@ function OnPluginTelnetOption(msg)
-- if the user is AFK when they log in and then exits AFK at some indeterminate time in the future. -- if the user is AFK when they log in and then exits AFK at some indeterminate time in the future.
if (dbot.gmcp.isInitialized) and (not inv.init.initializedActive) then if (dbot.gmcp.isInitialized) and (not inv.init.initializedActive) then
local retval = inv.init.atActive() local retval = inv.init.atActive()
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) and (retval ~= DRL_RET_BUSY) then
dbot.warn("OnPluginTelnetOption: Failed to init \"at active\" inventory modules: " .. dbot.warn("OnPluginTelnetOption: Failed to init \"at active\" inventory modules: " ..
dbot.retval.getString(retval)) dbot.retval.getString(retval))
end -- if end -- if
@ -815,7 +815,7 @@ function OnPluginBroadcast(msg, pluginId, pluginName, text)
if dbot.gmcp.stateIsActive() then if dbot.gmcp.stateIsActive() then
retval = inv.init.atActive() retval = inv.init.atActive()
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) and (retval ~= DRL_RET_BUSY) then
dbot.warn("OnPluginBroadcast: Failed to init \"at active\" inventory modules: " .. dbot.warn("OnPluginBroadcast: Failed to init \"at active\" inventory modules: " ..
dbot.retval.getString(retval)) dbot.retval.getString(retval))
end -- if end -- if
@ -935,6 +935,8 @@ inv.inSafeMode = false
inv.init.initializedInstall = false inv.init.initializedInstall = false
inv.init.initializedActive = false inv.init.initializedActive = false
inv.init.activePending = false
drlDoSaveState = true drlDoSaveState = true
drlDoNotSaveState = false drlDoNotSaveState = false
@ -969,8 +971,8 @@ function inv.init.atInstall()
if (inv[module].init.atInstall ~= nil) then if (inv[module].init.atInstall ~= nil) then
local initVal = inv[module].init.atInstall() local initVal = inv[module].init.atInstall()
if (initVal ~= DRL_RET_SUCCESS) then if (initVal ~= DRL_RET_SUCCESS) then
dbot.warn("inv.init.atInstall: Failed to initialize \"at install\" inv." .. module .. " module: " .. dbot.warn("inv.init.atInstall: Failed to initialize \"at install\" inv." .. module ..
dbot.retval.getString(initVal)) " module: " .. dbot.retval.getString(initVal))
retval = initVal retval = initVal
else else
dbot.debug("Initialized \"at install\" module inv." .. module) dbot.debug("Initialized \"at install\" module inv." .. module)
@ -1004,9 +1006,17 @@ end -- inv.init.atInstall
-- at the "active" state involve waiting for results so we use a co-routine to handle all of -- at the "active" state involve waiting for results so we use a co-routine to handle all of
-- the "at active" operations. -- the "at active" operations.
function inv.init.atActive() function inv.init.atActive()
local retval = DRL_RET_SUCCESS
if (not inv.init.activePending) then
inv.init.activePending = true
wait.make(inv.init.atActiveCR) wait.make(inv.init.atActiveCR)
else
dbot.debug("inv.init.atActive: Another initialization is in progress")
retval = DRL_RET_BUSY
end -- if
return DRL_RET_SUCCESS return retval
end -- inv.init.atActive end -- inv.init.atActive
@ -1015,6 +1025,7 @@ function inv.init.atActiveCR()
if (dbot.gmcp.isInitialized == false) then if (dbot.gmcp.isInitialized == false) then
dbot.error("inv.init.atActiveCR: GMCP is not initialized when we are active!?!") dbot.error("inv.init.atActiveCR: GMCP is not initialized when we are active!?!")
inv.init.activePending = false
return DRL_RET_INTERNAL_ERROR return DRL_RET_INTERNAL_ERROR
end -- if end -- if
@ -1037,8 +1048,8 @@ function inv.init.atActiveCR()
if (inv[module].init.atActive ~= nil) then if (inv[module].init.atActive ~= nil) then
local initVal = inv[module].init.atActive() local initVal = inv[module].init.atActive()
if (initVal ~= DRL_RET_SUCCESS) then if (initVal ~= DRL_RET_SUCCESS) then
dbot.warn("inv.init.atActiveCR: Failed to initialize \"at active\" inv." .. module .. " module: " .. dbot.warn("inv.init.atActiveCR: Failed to initialize \"at active\" inv." .. module ..
dbot.retval.getString(initVal)) " module: " .. dbot.retval.getString(initVal))
retval = initVal retval = initVal
else else
dbot.debug("Initialized \"at active\" module inv." .. module) dbot.debug("Initialized \"at active\" module inv." .. module)
@ -1069,6 +1080,7 @@ function inv.init.atActiveCR()
end -- if end -- if
-- Return success or the most recently encountered init error -- Return success or the most recently encountered init error
inv.init.activePending = false
return retval return retval
end -- inv.init.atActiveCR end -- inv.init.atActiveCR
@ -1109,6 +1121,7 @@ function inv.fini(doSaveState)
-- This indicates that we are now uninitialized -- This indicates that we are now uninitialized
inv.init.initializedInstall = false inv.init.initializedInstall = false
inv.init.initializedActive = false inv.init.initializedActive = false
inv.init.activePending = false
inv.state = nil inv.state = nil
-- Return success or the most recently encountered de-init error -- Return success or the most recently encountered de-init error

Loading…
Cancel
Save