/* * Copyright (c) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import * as path from "path"; import cluster from "cluster"; import process from "process"; import { ESMODULE, FAIL, GEN_ABC_SCRIPT, GEN_MODULE_ABC_SCRIPT, JSBUNDLE } from "./pre_define"; if (process.env['arkEnvParams'] === undefined) { process.exit(FAIL); } let arkEnvParams = JSON.parse(process.env.arkEnvParams); if (arkEnvParams['mode'] !== JSBUNDLE && arkEnvParams['mode'] !== ESMODULE) { process.exit(FAIL); } if (arkEnvParams['workerNumber'] !== undefined && arkEnvParams['splittedData'] !== undefined && arkEnvParams['cmdPrefix'] !== undefined) { let workerNumber: number = parseInt(arkEnvParams['workerNumber']); let splittedData: any = JSON.parse(arkEnvParams['splittedData']); let cmdPrefix: string = arkEnvParams['cmdPrefix']; const clusterNewApiVersion: number = 16; const currentNodeVersion: number = parseInt(process.version.split('.')[0]); const useNewApi: boolean = currentNodeVersion >= clusterNewApiVersion; if ((useNewApi && cluster.isPrimary) || (!useNewApi && cluster.isMaster)) { let genAbcScript: string = GEN_ABC_SCRIPT; if (arkEnvParams['mode'] === ESMODULE) { genAbcScript = GEN_MODULE_ABC_SCRIPT; } if (useNewApi) { cluster.setupPrimary({ exec: path.resolve(__dirname, genAbcScript) }); } else { cluster.setupMaster({ exec: path.resolve(__dirname, genAbcScript) }); } for (let i = 0; i < workerNumber; ++i) { let workerData: Object = { 'inputs': JSON.stringify(splittedData[i]), 'cmd': cmdPrefix }; if (arkEnvParams['mode'] === ESMODULE) { let sn: number = i + 1; let workerFileName: string = `filesInfo_${sn}.txt`; workerData['workerFileName'] = workerFileName; workerData['cachePath'] = arkEnvParams['cachePath']; } cluster.fork(workerData); } cluster.on("exit", (worker, code, signal) => { if (code === FAIL) { process.exit(FAIL); } }); } }