csv_lib/models/
worker.rs

1use std::sync::{Arc, Mutex};
2use crate::models::editable_persist::EditablePersist;
3use crate::models::in_row_iter::InRowIter;
4use crate::parallel::row_parallel::RowParallel;
5
6/// Ejecuta tareas sobre un chunk de CSV, pasando control del lock al closure.
7pub fn execute_task_in_thread<'mmap,Closure, Param>(
8    slice: &'mmap [u8],
9    line_break: u8,
10    field_separator: u8,
11    string_delimiter: u8,
12    force_memchr: bool,
13    mut func: Closure,
14    param: Arc<Mutex<Param>>,
15    thread_id: usize,
16)
17where
18    Closure: FnMut(&mut RowParallel<'mmap>,usize, Arc<Mutex<Param>>) + Send,
19    Param: Send + 'mmap,
20{
21    //global file iter
22    let mut iterator = InRowIter::new(slice, line_break, string_delimiter);
23    let mut acumulator = 0usize;
24    while let Some(row_data) = iterator.next() {
25        if acumulator == 0{
26            acumulator = iterator.get_cursor();
27        }
28        let mut row = RowParallel::new(slice,row_data, iterator.get_cursor(),line_break, field_separator, string_delimiter, force_memchr);
29        row.set_global_cursor(acumulator);
30        func(&mut row,thread_id, param.clone()); // solo se pasa el Arc
31        acumulator += iterator.get_cursor();
32    }
33}
34
35
36
37pub fn execute_task_with_param_thread<'mmap,Closure, Param, CloneParam>(
38    slice: &'mmap [u8],
39    line_break: u8,
40    field_separator: u8,
41    string_delimiter: u8,
42    force_memchr: bool,
43    mut func: Closure,
44    param: Arc<Mutex<Param>>,
45    thread_param: EditablePersist<CloneParam>,
46    thread_id: usize,
47)
48where Closure: FnMut(&mut RowParallel<'mmap>,usize, Arc<Mutex<Param>>, &mut EditablePersist<CloneParam>) + Send,
49      Param: Send + 'mmap,
50      CloneParam: Clone,
51
52{
53    //global file iter
54    let mut iterator = InRowIter::new(slice, line_break, string_delimiter);
55    let mut acumulator = 0usize;
56    let mut param_thread = thread_param.clone();
57    while let Some(row_data) = iterator.next() {
58        if acumulator == 0{
59            acumulator = iterator.get_cursor();
60        }
61        let mut row = RowParallel::new(slice,row_data, iterator.get_cursor(),line_break, field_separator, string_delimiter, force_memchr);
62        row.set_global_cursor(acumulator);
63        func(&mut row,thread_id, param.clone(), &mut param_thread);
64        acumulator += iterator.get_cursor();
65    }
66}