1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import * as path from "path"; 17import cluster from "cluster"; 18import process from "process"; 19import { 20 ESMODULE, 21 FAIL, 22 GEN_ABC_SCRIPT, 23 GEN_MODULE_ABC_SCRIPT, 24 JSBUNDLE 25} from "./pre_define"; 26 27if (process.env['arkEnvParams'] === undefined) { 28 process.exit(FAIL); 29} 30 31let arkEnvParams = JSON.parse(process.env.arkEnvParams); 32if (arkEnvParams['mode'] !== JSBUNDLE && arkEnvParams['mode'] !== ESMODULE) { 33 process.exit(FAIL); 34} 35 36if (arkEnvParams['workerNumber'] !== undefined && 37 arkEnvParams['splittedData'] !== undefined && 38 arkEnvParams['cmdPrefix'] !== undefined) { 39 let workerNumber: number = parseInt(arkEnvParams['workerNumber']); 40 let splittedData: any = JSON.parse(arkEnvParams['splittedData']); 41 let cmdPrefix: string = arkEnvParams['cmdPrefix']; 42 43 const clusterNewApiVersion: number = 16; 44 const currentNodeVersion: number = parseInt(process.version.split('.')[0]); 45 const useNewApi: boolean = currentNodeVersion >= clusterNewApiVersion; 46 47 if ((useNewApi && cluster.isPrimary) || (!useNewApi && cluster.isMaster)) { 48 let genAbcScript: string = GEN_ABC_SCRIPT; 49 if (arkEnvParams['mode'] === ESMODULE) { 50 genAbcScript = GEN_MODULE_ABC_SCRIPT; 51 } 52 if (useNewApi) { 53 cluster.setupPrimary({ 54 exec: path.resolve(__dirname, genAbcScript) 55 }); 56 } else { 57 cluster.setupMaster({ 58 exec: path.resolve(__dirname, genAbcScript) 59 }); 60 } 61 62 for (let i = 0; i < workerNumber; ++i) { 63 let workerData: any = { 64 'inputs': JSON.stringify(splittedData[i]), 65 'cmd': cmdPrefix 66 }; 67 if (arkEnvParams['mode'] === ESMODULE) { 68 let sn: number = i + 1; 69 let workerFileName: string = `filesInfo_${sn}.txt`; 70 workerData['workerFileName'] = workerFileName; 71 workerData['cachePath'] = arkEnvParams['cachePath']; 72 } 73 cluster.fork(workerData); 74 } 75 76 cluster.on("exit", (worker, code, signal) => { 77 if (code === FAIL) { 78 process.exit(FAIL); 79 } 80 }); 81 } 82} 83