From 737ef0f8ccf4ce47c55b72d96a27b546fef5c3b6 Mon Sep 17 00:00:00 2001 From: Ken Bynell Date: Mon, 27 May 2024 16:34:51 -0500 Subject: [PATCH] multithreaded_maybe?????????????? --- commands/debug2.js | 45 ++++---- commands/packMod.js | 7 +- commands/worker_test.js | 10 ++ extension.js | 5 +- support_files/helper_functions.js | 56 +++++++++- support_files/log_utils.js | 170 ++++++++++++++++++++---------- 6 files changed, 211 insertions(+), 82 deletions(-) diff --git a/commands/debug2.js b/commands/debug2.js index 26191151..39b86e25 100644 --- a/commands/debug2.js +++ b/commands/debug2.js @@ -12,6 +12,8 @@ const { lslibPath, rootModPath, gameInstallLocation } = getConfig(); const compatRootModPath = path.join(rootModPath + "\\"); const lslibToolsPath = path.join(lslibPath, TOOL_SUBDIR); +const { saveConfigFile, loadConfigFile } = require('../support_files/helper_functions') + const { CREATE_LOGGER, raiseError, raiseInfo } = require('../support_files/log_utils'); var bg3mh_logger = CREATE_LOGGER(); @@ -19,32 +21,33 @@ const { FIND_FILES, getFormats, dirSeparator } = require('../support_files/lslib const { pak } = getFormats(); const { processPak } = require('../support_files/process_pak.js'); +const { isMainThread, parentPort, Worker } = require('node:worker_threads') + const debug2 = vscode.commands.registerCommand('bg3-mod-helper.debug2Command', async function () { // raiseInfo("hi dipshit! 💩"); - // let test_dir = path.join(rootModPath, 'unpacking_test\\test_paks'); - let test_dir = path.join(gameInstallLocation, 'Data'); - let unpackDest = "W:\\Libraries\\Documents\\Baldur's Gate 3 Mods\\unpacked_game_data"; - let unpackList = await FIND_FILES(pak, test_dir); - - console.log(test_dir); - - raiseInfo(unpackList); - - // for (let i = 0; i < unpackList.length; i++) { - for await (const pakPath of unpackList) { - //let pakPath = dirSeparator(unpackList[i]); - //let pakPath = unpackList[i]; - let modName = path.basename(pakPath, pak); - console.log(modName) - //let unpackDest = dirSeparator(path.join(path.dirname(pakPath), modName)); - console.log(unpackDest); - - raiseInfo(`${modName} unpacking started`); - // processPak(pakPath, modName, unpackDest); - raiseInfo(`${modName} unpacking ended`); + + let halfCoreCount = os.availableParallelism() / 2; + let workerArray = []; + let workerInfo = await loadConfigFile(true); + + if (isMainThread) { + for (let i = 0; i < halfCoreCount; i++) { + workerArray.push(new Worker(__dirname + "/worker_test.js")); + + workerArray[i].on('message', (message) => { + console.log(`${message} received from worker ${workerArray[i].threadId}!`) + }); + + workerArray[i].postMessage(workerInfo); + } + } + saveConfigFile(); + console.log(await loadConfigFile(true)); + + }); module.exports = { debug2 } diff --git a/commands/packMod.js b/commands/packMod.js index 7089273c..044a46e6 100644 --- a/commands/packMod.js +++ b/commands/packMod.js @@ -85,14 +85,15 @@ const packModCommand = vscode.commands.registerCommand('bg3-mod-helper.packMod', } } + // changed existsSync() to statSync().isFile(), since existsSync() is being deprecated. this section can be shortened with the saveConfigFile and loadConfigFile functions in helper_functions.js // Path to .vscode directory and settings file const vscodeDirPath = path.join(rootModPath, '.vscode'); const settingsFilePath = path.join(vscodeDirPath, 'settings.json'); let settingsContent = ''; // Check and save settings.json if .vscode exists - if (fs.existsSync(vscodeDirPath)) { - if (fs.existsSync(settingsFilePath)) { + if (fs.statSync(vscodeDirPath).isFile()) { + if (fs.statSync(settingsFilePath).isFile()) { settingsContent = fs.readFileSync(settingsFilePath, 'utf8'); } // console.log('test1') @@ -104,7 +105,7 @@ const packModCommand = vscode.commands.registerCommand('bg3-mod-helper.packMod', if (settingsContent) { // console.log('test3') - if (!fs.existsSync(vscodeDirPath)) { + if (!fs.statSync(vscodeDirPath).isFile()) { fs.mkdirSync(vscodeDirPath, { recursive: true }); // console.log('test4') } diff --git a/commands/worker_test.js b/commands/worker_test.js index 27dad586..47db30b1 100644 --- a/commands/worker_test.js +++ b/commands/worker_test.js @@ -1,3 +1,13 @@ // const { CREATE_LOGGER, raiseError, raiseInfo } = require('../support_files/log_utils.js'); // const bg3mh_logger = CREATE_LOGGER(); +const { parentPort } = require('node:worker_threads'); +const path = require('node:path'); +const fs = require('node:fs'); + +parentPort.once('message', (message) => { + let messageParsed = JSON.parse(message); + + let rootModPath = messageParsed.rootModPath; + parentPort.postMessage(rootModPath); +}); \ No newline at end of file diff --git a/extension.js b/extension.js index f8d85fa6..804b6ce2 100644 --- a/extension.js +++ b/extension.js @@ -33,7 +33,7 @@ const addDependenciesCommand = require('./commands/addDependencies') const AutoCompleteProvider = require('./autocomplete/autoCompleteProvider'); -const { CREATE_LOGGER } = require('./support_files/log_utils'); +const { CREATE_LOGGER, raiseInfo } = require('./support_files/log_utils'); var bg3mh_logger = CREATE_LOGGER(); const debugCommand = require('./commands/debug'); @@ -116,7 +116,8 @@ function activate(context) { excludedFiles: config.get('excludedFiles') || [], gameInstallLocation: config.get('gameInstallLocation') }); - bg3mh_logger.info('Initial configs set:' + JSON.stringify(config, null, 2)) + raiseInfo('Initial configs set:' + JSON.stringify(config, null, 2), false); + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { vscode.window.showWarningMessage( 'bg3-mod-helper extension requires a workspace to be set for optimal functionality, one not found.' diff --git a/support_files/helper_functions.js b/support_files/helper_functions.js index 555c41d0..5abc527d 100644 --- a/support_files/helper_functions.js +++ b/support_files/helper_functions.js @@ -1,9 +1,13 @@ const vscode = require('vscode'); const path = require('path'); -const { getConfig } = require('./config'); +const { getConfig, setConfig } = require('./config'); const fs = require('fs'); -const { CREATE_LOGGER } = require('./log_utils'); +const rootModPath = getConfig().rootModPath; +const vscodeDirPath = path.join(rootModPath, '.vscode'); +const settingsFilePath = path.join(vscodeDirPath, 'settings.json'); + +const { CREATE_LOGGER, raiseInfo } = require('./log_utils'); var bg3mh_logger = CREATE_LOGGER(); // Function to insert text, replacing the current selection @@ -65,4 +69,50 @@ async function findInstancesInWorkspace(word, currentFilePath, maxFilesToShow) { return instances; } -module.exports = { insertText, findInstancesInWorkspace, getFullPath }; \ No newline at end of file + +async function saveConfigFile(settingToSave = "all") { + let config = vscode.workspace.getConfiguration('bg3ModHelper'); + let settings = {}; + + console.log(`${settingsFilePath}\n${rootModPath}`) + + if (settingToSave === "all") { + settings = { + maxFilesToShow: config.get('hover.maxFiles'), + hoverEnabled: config.get('hover.enabled'), + maxCacheSize: config.get('maxCacheSize'), + rootModPath: config.get('rootModPath'), + modDestPath: config.get('modDestPath'), + lslibPath: config.get('lslibPath'), + autoLaunchOnPack: config.get('autoLaunchOnPack'), + launchContinueGame: config.get('launchContinueGame'), + addHandlesToAllLocas: config.get('addHandlesToAllLocas'), + excludedFiles: config.get('excludedFiles') || [], + gameInstallLocation: config.get('gameInstallLocation') + }; + } + + setConfig(settings); + let settingsJson = JSON.stringify(config, null, 4); + + fs.writeFileSync(settingsFilePath, settingsJson, 'utf8'); + raiseInfo('Initial configs set:' + JSON.stringify(config, null, 4), false); +} + + +async function loadConfigFile(get = false) { + let settingsContent; + + if (fs.statSync(settingsFilePath).isFile()) { + settingsContent = fs.readFileSync(settingsFilePath, 'utf8'); + raiseInfo(settingsContent, false); + + if (get) { + return settingsContent; + } else { + return undefined; + } + } +} + +module.exports = { insertText, findInstancesInWorkspace, getFullPath, loadConfigFile, saveConfigFile }; \ No newline at end of file diff --git a/support_files/log_utils.js b/support_files/log_utils.js index d12d0f14..7bcb8b51 100644 --- a/support_files/log_utils.js +++ b/support_files/log_utils.js @@ -1,8 +1,9 @@ const path = require('path'); -const vscode = require('vscode'); -const lslibPath = require('./config').getConfig().lslibPath; -const logPath = path.normalize(lslibPath + "\\logs\\bg3mh_log_" + LOGDATE() + ".log"); +var lslibPath; +var logPath; + +const { isMainThread } = require('worker_threads'); // TODO: clear logs function @@ -20,66 +21,129 @@ function LOGDATE() { return date_string; } - -function CREATE_LOGGER() { - var log4js = require('log4js'); - log4js.configure ({ - appenders: { - bg3mh_logger: { - type: "file", - filename: logPath, - layout: { - type: "pattern", - pattern: "[%d] %f{1}:%l in %M [%p]: %m" - } - } - }, - categories: { - default: { - appenders: - ["bg3mh_logger"], - level: "debug", - enableCallStack: true +var raiseError, raiseInfo, CREATE_LOGGER; + + +if (isMainThread) { + const vscode = require('vscode'); + lslibPath = require('./config').getConfig().lslibPath; + logPath = path.normalize(lslibPath + "\\logs\\bg3mh_log_" + LOGDATE() + ".log"); + + CREATE_LOGGER = () => { + var log4js = require('log4js'); + log4js.configure ({ + appenders: { + bg3mh_logger: { + type: "file", + filename: logPath, + layout: { + type: "pattern", + pattern: "[%d] %f{1}:%l in %M [%p]: %m" + } + } }, - error: { - appenders: - ["bg3mh_logger"], - level: "error", - enableCallStack: true + categories: { + default: { + appenders: + ["bg3mh_logger"], + level: "debug", + enableCallStack: true + }, + error: { + appenders: + ["bg3mh_logger"], + level: "error", + enableCallStack: true + }, + info: { + appenders: + ["bg3mh_logger"], + level: "info", + enableCallStack: true + }, }, - info: { - appenders: - ["bg3mh_logger"], - level: "info", - enableCallStack: true - }, - }, - }); + }); + + return log4js.getLogger("bg3mh_logger"); + } - return log4js.getLogger("bg3mh_logger"); -} + raiseError = (error, popup = true) => { + var bg3mh_logger = CREATE_LOGGER(); + + if (popup) { + vscode.window.showErrorMessage(`${error}`); + } + console.error(error); + bg3mh_logger.error(error); + } + + raiseInfo = (info, popup = true) => { + var bg3mh_logger = CREATE_LOGGER(); + + if (popup) { + vscode.window.showInformationMessage(`${info}`); + } + console.info(info); + bg3mh_logger.info(info); + } +} else { + lslibPath = require('./config').getConfig().lslibPath; + logPath = path.normalize(lslibPath + "\\logs\\bg3mh_log_" + LOGDATE() + ".log"); + + CREATE_LOGGER = () => { + var log4js = require('log4js'); + log4js.configure ({ + appenders: { + bg3mh_logger: { + type: "file", + filename: logPath, + layout: { + type: "pattern", + pattern: "[%d] %f{1}:%l in %M [%p]: %m" + } + } + }, + categories: { + default: { + appenders: + ["bg3mh_logger"], + level: "debug", + enableCallStack: true + }, + error: { + appenders: + ["bg3mh_logger"], + level: "error", + enableCallStack: true + }, + info: { + appenders: + ["bg3mh_logger"], + level: "info", + enableCallStack: true + }, + }, + }); + + return log4js.getLogger("bg3mh_logger"); + } + raiseError = (error) => { + var bg3mh_logger = CREATE_LOGGER(); -function raiseError(error, popup = true) { - var bg3mh_logger = CREATE_LOGGER(); + console.error(error); + bg3mh_logger.error(error); + } + + raiseInfo = (info) => { + var bg3mh_logger = CREATE_LOGGER(); - if (popup) { - vscode.window.showErrorMessage(`${error}`); + console.info(info); + bg3mh_logger.info(info); } - console.error(error); - bg3mh_logger.error(error); } -function raiseInfo(info, popup = true) { - var bg3mh_logger = CREATE_LOGGER(); - - if (popup) { - vscode.window.showInformationMessage(`${info}`); - } - console.info(info); - bg3mh_logger.info(info); -} module.exports = { LOGDATE, logPath, CREATE_LOGGER, raiseError, raiseInfo }; \ No newline at end of file