about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMadhav Madhusoodanan <f20200049@pilani.bits-pilani.ac.in>2025-03-30 12:15:29 +0400
committerAmanieu d'Antras <amanieu@gmail.com>2025-05-27 23:27:38 +0000
commite15d6fae921cd981e47604a2e9406dd1c724f148 (patch)
tree4e4ffa5d4ede647ac0f0b6d7c19336565c20139a
parentca67119d5fa91f9237e8ed91fc64fd448107e2d4 (diff)
downloadrust-e15d6fae921cd981e47604a2e9406dd1c724f148.tar.gz
rust-e15d6fae921cd981e47604a2e9406dd1c724f148.zip
fixed `too many files open` issue
-rw-r--r--library/stdarch/crates/intrinsic-test/src/arm/functions.rs37
-rw-r--r--library/stdarch/crates/intrinsic-test/src/common/gen_c.rs9
-rw-r--r--library/stdarch/crates/intrinsic-test/src/common/gen_rust.rs7
-rw-r--r--library/stdarch/crates/intrinsic-test/src/common/mod.rs7
4 files changed, 36 insertions, 24 deletions
diff --git a/library/stdarch/crates/intrinsic-test/src/arm/functions.rs b/library/stdarch/crates/intrinsic-test/src/arm/functions.rs
index a529f37aac2..a23bac991ff 100644
--- a/library/stdarch/crates/intrinsic-test/src/arm/functions.rs
+++ b/library/stdarch/crates/intrinsic-test/src/arm/functions.rs
@@ -2,11 +2,12 @@ use super::argument::Argument;
 use super::config::{AARCH_CONFIGURATIONS, POLY128_OSTREAM_DEF, build_notices};
 use super::format::Indentation;
 use super::intrinsic::Intrinsic;
-use crate::common::gen_c::{compile_c, create_c_files, generate_c_program};
-use crate::common::gen_rust::{compile_rust, create_rust_files, generate_rust_program};
+use crate::common::gen_c::{compile_c, create_c_filenames, generate_c_program};
+use crate::common::gen_rust::{compile_rust, create_rust_filenames, generate_rust_program};
+use crate::common::write_file;
 use itertools::Itertools;
 use rayon::prelude::*;
-use std::io::Write;
+use std::collections::BTreeMap;
 
 // The number of times each intrinsic will be called.
 const PASSES: u32 = 20;
@@ -149,13 +150,14 @@ fn generate_rust_program_arm(intrinsic: &Intrinsic, target: &str) -> String {
 }
 
 fn compile_c_arm(
-    intrinsics_name_list: Vec<String>,
+    intrinsics_name_list: &Vec<String>,
+    filename_mapping: BTreeMap<&String, String>,
     compiler: &str,
     target: &str,
     cxx_toolchain_dir: Option<&str>,
 ) -> bool {
-    let compiler_commands = intrinsics_name_list.iter().map(|intrinsic_name|{
-        let c_filename = format!(r#"c_programs/{intrinsic_name}.cpp"#);
+    let compiler_commands = intrinsics_name_list.iter().map(|intrinsic_name| {
+        let c_filename = filename_mapping.get(intrinsic_name).unwrap();
         let flags = std::env::var("CPPFLAGS").unwrap_or("".into());
         let arch_flags = if target.contains("v7") {
             "-march=armv8.6-a+crypto+crc+dotprod+fp16"
@@ -223,24 +225,29 @@ pub fn build_c(
     target: &str,
     cxx_toolchain_dir: Option<&str>,
 ) -> bool {
-    let _ = std::fs::create_dir("c_programs");
     let intrinsics_name_list = intrinsics
         .par_iter()
         .map(|i| i.name.clone())
         .collect::<Vec<_>>();
-    let file_mapping = create_c_files(&intrinsics_name_list);
+    let filename_mapping = create_c_filenames(&intrinsics_name_list);
 
     intrinsics.par_iter().for_each(|i| {
         let c_code = generate_c_program_arm(&["arm_neon.h", "arm_acle.h", "arm_fp16.h"], i, target);
-        match file_mapping.get(&i.name) {
-            Some(mut file) => file.write_all(c_code.into_bytes().as_slice()).unwrap(),
+        match filename_mapping.get(&i.name) {
+            Some(filename) => write_file(filename, c_code),
             None => {}
         };
     });
 
     match compiler {
         None => true,
-        Some(compiler) => compile_c_arm(intrinsics_name_list, compiler, target, cxx_toolchain_dir),
+        Some(compiler) => compile_c_arm(
+            &intrinsics_name_list,
+            filename_mapping,
+            compiler,
+            target,
+            cxx_toolchain_dir,
+        ),
     }
 }
 
@@ -254,12 +261,12 @@ pub fn build_rust(
         .par_iter()
         .map(|i| i.name.clone())
         .collect::<Vec<_>>();
-    let file_mapping = create_rust_files(&intrinsics_name_list);
+    let filename_mapping = create_rust_filenames(&intrinsics_name_list);
 
     intrinsics.par_iter().for_each(|i| {
-        let c_code = generate_rust_program_arm(i, target);
-        match file_mapping.get(&i.name) {
-            Some(mut file) => file.write_all(c_code.into_bytes().as_slice()).unwrap(),
+        let rust_code = generate_rust_program_arm(i, target);
+        match filename_mapping.get(&i.name) {
+            Some(filename) => write_file(filename, rust_code),
             None => {}
         }
     });
diff --git a/library/stdarch/crates/intrinsic-test/src/common/gen_c.rs b/library/stdarch/crates/intrinsic-test/src/common/gen_c.rs
index b58b68ff617..a2a4115da62 100644
--- a/library/stdarch/crates/intrinsic-test/src/common/gen_c.rs
+++ b/library/stdarch/crates/intrinsic-test/src/common/gen_c.rs
@@ -1,7 +1,6 @@
 use itertools::Itertools;
 use rayon::prelude::*;
 use std::collections::BTreeMap;
-use std::fs::File;
 use std::process::Command;
 
 pub fn generate_c_program(
@@ -79,14 +78,14 @@ pub fn compile_c(compiler_commands: &[String]) -> bool {
         .is_none()
 }
 
-pub fn create_c_files(identifiers: &Vec<String>) -> BTreeMap<&String, File> {
+pub fn create_c_filenames(identifiers: &Vec<String>) -> BTreeMap<&String, String> {
+    let _ = std::fs::create_dir("c_programs");
     identifiers
         .par_iter()
         .map(|identifier| {
             let c_filename = format!(r#"c_programs/{identifier}.cpp"#);
-            let file = File::create(&c_filename).unwrap();
 
-            (identifier, file)
+            (identifier, c_filename)
         })
-        .collect::<BTreeMap<&String, File>>()
+        .collect::<BTreeMap<&String, String>>()
 }
diff --git a/library/stdarch/crates/intrinsic-test/src/common/gen_rust.rs b/library/stdarch/crates/intrinsic-test/src/common/gen_rust.rs
index 00186359f19..30599146842 100644
--- a/library/stdarch/crates/intrinsic-test/src/common/gen_rust.rs
+++ b/library/stdarch/crates/intrinsic-test/src/common/gen_rust.rs
@@ -115,16 +115,15 @@ path = "{binary}/main.rs""#,
     }
 }
 
-pub fn create_rust_files(identifiers: &Vec<String>) -> BTreeMap<&String, File> {
+pub fn create_rust_filenames(identifiers: &Vec<String>) -> BTreeMap<&String, String> {
     identifiers
         .par_iter()
         .map(|identifier| {
             let rust_dir = format!(r#"rust_programs/{}"#, identifier);
             let _ = std::fs::create_dir_all(&rust_dir);
             let rust_filename = format!(r#"{rust_dir}/main.rs"#);
-            let file = File::create(&rust_filename).unwrap();
 
-            (identifier, file)
+            (identifier, rust_filename)
         })
-        .collect::<BTreeMap<&String, File>>()
+        .collect::<BTreeMap<&String, String>>()
 }
diff --git a/library/stdarch/crates/intrinsic-test/src/common/mod.rs b/library/stdarch/crates/intrinsic-test/src/common/mod.rs
index b4e6a16a4e8..1c9f8027760 100644
--- a/library/stdarch/crates/intrinsic-test/src/common/mod.rs
+++ b/library/stdarch/crates/intrinsic-test/src/common/mod.rs
@@ -1,4 +1,6 @@
 use crate::common::types::ProcessedCli;
+use std::fs::File;
+use std::io::Write;
 
 pub mod compare;
 pub mod gen_c;
@@ -14,3 +16,8 @@ pub trait SupportedArchitectureTest {
     fn build_rust_file(&self) -> bool;
     fn compare_outputs(&self) -> bool;
 }
+
+pub fn write_file(filename: &String, code: String) {
+    let mut file = File::create(&filename).unwrap();
+    file.write_all(code.into_bytes().as_slice()).unwrap();
+}