Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Mar 2018 03:07:16 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r331281 - head/stand/lua
Message-ID:  <201803210307.w2L37Gnp041093@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Wed Mar 21 03:07:16 2018
New Revision: 331281
URL: https://svnweb.freebsd.org/changeset/base/331281

Log:
  lualoader: Add primitive hook module, use it to untangle bogus reference
  
  See: comments in the hook module about intended usage, as well as the
  introduced use for config.reloaded.
  
  Use the newly introduced hook module to define a "config.reloaded" hook.
  This is currently used to register core's clearKernelCache as a reload hook
  to avoid a circular dependency and fix this functionality- it didn't
  actually work out, and it isn't immediately obvious how it slipped into src.
  
  Other hook types will be introduced into the core lualoader as useful hook
  points are identified.

Added:
  head/stand/lua/hook.lua   (contents, props changed)
Modified:
  head/stand/lua/Makefile
  head/stand/lua/config.lua
  head/stand/lua/core.lua

Modified: head/stand/lua/Makefile
==============================================================================
--- head/stand/lua/Makefile	Wed Mar 21 01:17:01 2018	(r331280)
+++ head/stand/lua/Makefile	Wed Mar 21 03:07:16 2018	(r331281)
@@ -8,6 +8,7 @@ FILES=	cli.lua \
 	config.lua \
 	core.lua \
 	drawer.lua \
+	hook.lua \
 	loader.lua \
 	menu.lua \
 	password.lua \

Modified: head/stand/lua/config.lua
==============================================================================
--- head/stand/lua/config.lua	Wed Mar 21 01:17:01 2018	(r331280)
+++ head/stand/lua/config.lua	Wed Mar 21 03:07:16 2018	(r331281)
@@ -29,6 +29,8 @@
 -- $FreeBSD$
 --
 
+local hook = require("hook")
+
 local config = {}
 local modules = {}
 local carousel_choices = {}
@@ -503,7 +505,7 @@ function config.reload(file)
 	modules = {}
 	config.restoreEnv()
 	config.load(file)
-	core.configReloaded()
+	hook.runAll("config.reloaded")
 end
 
 function config.loadelf()
@@ -523,4 +525,5 @@ function config.loadelf()
 	end
 end
 
+hook.registerType("config.reloaded")
 return config

Modified: head/stand/lua/core.lua
==============================================================================
--- head/stand/lua/core.lua	Wed Mar 21 01:17:01 2018	(r331280)
+++ head/stand/lua/core.lua	Wed Mar 21 03:07:16 2018	(r331281)
@@ -30,6 +30,7 @@
 --
 
 local config = require("config")
+local hook = require("hook")
 
 local core = {}
 
@@ -138,7 +139,7 @@ function core.setSafeMode(safe_mode)
 	core.sm = safe_mode
 end
 
-function core.configReloaded()
+function core.clearCachedKernels()
 	-- Clear the kernel cache on config changes, autodetect might have
 	-- changed or if we've switched boot environments then we could have
 	-- a new kernel set.
@@ -364,4 +365,6 @@ end
 if core.isSystem386() and core.getACPIPresent(false) then
 	core.setACPI(true)
 end
+
+hook.register("config.reloaded", core.clearCachedKernels)
 return core

Added: head/stand/lua/hook.lua
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/stand/lua/hook.lua	Wed Mar 21 03:07:16 2018	(r331281)
@@ -0,0 +1,84 @@
+--
+-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+--
+-- Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
+-- All rights reserved.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+-- 1. Redistributions of source code must retain the above copyright
+--    notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above copyright
+--    notice, this list of conditions and the following disclaimer in the
+--    documentation and/or other materials provided with the distribution.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+-- ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+-- SUCH DAMAGE.
+--
+-- $FreeBSD$
+--
+
+local hook = {}
+
+local registered_hooks = {}
+
+-- Module exports
+-- Register a hook type; these are the names that hooks may be registered for.
+-- It is expected that modules will register all of their hook types upon
+-- initial load. Other modules may then, at any time, register a hook for these
+-- types.
+--
+-- Naming convention: hook types should be sensible named, preferably prefixed
+-- with the name of the module that registered them. They would also ideally
+-- describe an action that may or may not match a function name.
+-- e.g. config.reloaded which takes place after config has been reloaded,
+-- possibly from a different source.
+function hook.registerType(hooktype)
+	registered_hooks[hooktype] = {}
+end
+
+function hook.register(hooktype, hookfunc)
+	local selected_hooks = registered_hooks[hooktype]
+	if selected_hooks == nil then
+		print("Tried registering a hook for an unknown hook type: " ..
+		    hooktype)
+		return
+	end
+	selected_hooks[#selected_hooks + 1] = hookfunc
+	registered_hooks[hooktype] = selected_hooks
+end
+
+-- Takes a hooktype and runs all functions associated with that specific hook
+-- type in the order that they were registered in. This ordering should likely
+-- not be relied upon.
+function hook.runAll(hooktype)
+	local selected_hooks = registered_hooks[hooktype]
+	if selected_hooks == nil then
+		-- This message, and the print() above, should only be seen by
+		-- developers. Hook type registration should have happened at
+		-- module load, so if this hasn't happened then we have messed
+		-- up the order in which we've loaded modules and we need to
+		-- catch that as soon as possible.
+		print("Tried to run hooks for an unknown hook type: " ..
+		    hooktype)
+		return 0
+	end
+	if #selected_hooks > 0 then
+		for _, func in ipairs(selected_hooks) do
+			func()
+		end
+	end
+	return #selected_hooks
+end
+
+return hook



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803210307.w2L37Gnp041093>