forked from StarOpenSource/Engine
Add Engine.State, Engine.bootstrap & Engine.shutdown
This commit is contained in:
parent
1e40c8b121
commit
eea7f5f4af
2 changed files with 169 additions and 3 deletions
|
@ -38,13 +38,176 @@ class Engine private constructor() {
|
||||||
*/
|
*/
|
||||||
companion object {
|
companion object {
|
||||||
/**
|
/**
|
||||||
* Initializes the engine.
|
* Contains the [Logger] instance of the engine.
|
||||||
*
|
*
|
||||||
* @since v1-alpha10
|
* @since v1-alpha10
|
||||||
*/
|
*/
|
||||||
|
internal val logger: Logger = Logger("engine-core")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the state the engine is in.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var state: State = State.UNINITIALIZED
|
||||||
|
private set
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains if the engine is currently
|
||||||
|
* bootstrapping or has been bootstrapped.
|
||||||
|
*
|
||||||
|
* `null` indicates that the engine hasn't
|
||||||
|
* been bootstrapped yet, `true` indicates
|
||||||
|
* that the engine has been bootstrapped
|
||||||
|
* and `false` indicates that the engine
|
||||||
|
* is currently bootstrapping itself.
|
||||||
|
*
|
||||||
|
* @see bootstrap
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var bootstrapping: Boolean? = null
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Initialization
|
||||||
|
/**
|
||||||
|
* Bootstraps the engine.
|
||||||
|
*
|
||||||
|
* This method initializes static variables
|
||||||
|
* and generally performs actions which
|
||||||
|
* should only be executed once.
|
||||||
|
*
|
||||||
|
* @throws Throwable on initialization error
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
@Throws(Throwable::class)
|
||||||
|
private fun bootstrap() {
|
||||||
|
if (state != State.UNINITIALIZED || bootstrapping != null)
|
||||||
|
return
|
||||||
|
|
||||||
|
bootstrapping = true
|
||||||
|
logger.info("Bootstrapping")
|
||||||
|
|
||||||
|
// Run bootstrapping code
|
||||||
|
|
||||||
|
bootstrapping = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the engine.
|
||||||
|
*
|
||||||
|
* @throws Throwable on initialization error
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
@Throws(Throwable::class)
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
Logger.instance.info("Initializing")
|
// Abort if initializing, shutting down
|
||||||
|
// or the engine has crashed
|
||||||
|
if (
|
||||||
|
bootstrapping == true
|
||||||
|
|| state == State.INITIALIZING
|
||||||
|
|| state == State.SHUTTING_DOWN
|
||||||
|
|| state == State.CRASHED
|
||||||
|
) return
|
||||||
|
|
||||||
|
// Bootstrap if not already done so
|
||||||
|
bootstrap()
|
||||||
|
|
||||||
|
state = State.INITIALIZING
|
||||||
|
logger.info("Initializing")
|
||||||
|
|
||||||
|
// Run initialization code
|
||||||
|
|
||||||
|
state = State.INITIALIZED
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shuts the engine down.
|
||||||
|
*
|
||||||
|
* @throws Throwable on shutdown error
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
@Throws(Throwable::class)
|
||||||
|
fun shutdown() {
|
||||||
|
// Abort if not initialized
|
||||||
|
if (state != State.INITIALIZED)
|
||||||
|
return
|
||||||
|
|
||||||
|
state = State.SHUTTING_DOWN
|
||||||
|
logger.info("Shutting down")
|
||||||
|
|
||||||
|
// Run shutdown code
|
||||||
|
|
||||||
|
state = State.SHUT_DOWN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the states the engine can be in.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
enum class State {
|
||||||
|
/**
|
||||||
|
* Specifies that the engine has
|
||||||
|
* not been initialized at least
|
||||||
|
* once yet.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
UNINITIALIZED,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the engine is
|
||||||
|
* in the initialization process.
|
||||||
|
*
|
||||||
|
* Many methods are considered
|
||||||
|
* unsafe and should not be called.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
INITIALIZING,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies that the engine has fully
|
||||||
|
* initialized and can be safely used.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
INITIALIZED,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the engine is in
|
||||||
|
* the process of shutting down.
|
||||||
|
*
|
||||||
|
* Many methods are considered
|
||||||
|
* unsafe and should not be called.
|
||||||
|
*/
|
||||||
|
SHUTTING_DOWN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the engine has been shut down.
|
||||||
|
*
|
||||||
|
* This may not be a final state.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
SHUT_DOWN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the engine has crashed and
|
||||||
|
* is in a state where further usage is
|
||||||
|
* HIGHLY discouraged. Any further calls may
|
||||||
|
* cause the process or virtual machine to
|
||||||
|
* exit with a fatal error.
|
||||||
|
*
|
||||||
|
* This is a final state. The engine cannot
|
||||||
|
* be initialized again after having crashed.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
CRASHED
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,10 @@ class Main private constructor() {
|
||||||
Engine.initialize()
|
Engine.initialize()
|
||||||
|
|
||||||
// Print hello world
|
// Print hello world
|
||||||
logger.info("Hello World! <red><bold>Caused by <clinit> and \\<init>.")
|
logger.info("Hello World!")
|
||||||
|
|
||||||
|
// Shutdown engine
|
||||||
|
Engine.shutdown()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue