Skip to content

Commit e0a748b

Browse files
committed
fn POOL_create: pass segmentFreqs a slice
1 parent 0b95c2f commit e0a748b

File tree

1 file changed

+29
-32
lines changed

1 file changed

+29
-32
lines changed

lib/dictBuilder/fastcover.rs

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::ptr;
22
use std::sync::{Condvar, Mutex};
33

4-
use libc::{calloc, free, malloc, memcpy, size_t};
4+
use libc::{free, malloc, memcpy, size_t};
55

66
use crate::lib::common::error_private::{ERR_isError, Error};
77
use crate::lib::common::pool::{POOL_add, POOL_create, POOL_free};
@@ -107,10 +107,11 @@ unsafe fn FASTCOVER_selectSegment(
107107
begin: u32,
108108
end: u32,
109109
parameters: ZDICT_cover_params_t,
110-
segmentFreqs: *mut u16,
110+
segmentFreqs: &mut [u16],
111111
) -> COVER_segment_t {
112112
let k = parameters.k;
113113
let d = parameters.d;
114+
let samples = (*ctx).samples;
114115
let f = (*ctx).f;
115116
let dmersInK = k.wrapping_sub(d).wrapping_add(1);
116117
let mut bestSegment = {
@@ -134,22 +135,21 @@ unsafe fn FASTCOVER_selectSegment(
134135
f,
135136
d,
136137
);
137-
if *segmentFreqs.add(idx) as core::ffi::c_int == 0 {
138+
if segmentFreqs[idx] == 0 {
138139
activeSegment.score = (activeSegment.score).wrapping_add(freqs[idx]);
139140
}
140141
activeSegment.end = (activeSegment.end).wrapping_add(1);
141-
let fresh0 = &mut (*segmentFreqs.add(idx));
142-
*fresh0 = (*fresh0 as core::ffi::c_int + 1) as u16;
142+
segmentFreqs[idx] += 1;
143143
if (activeSegment.end).wrapping_sub(activeSegment.begin) == dmersInK.wrapping_add(1) {
144-
let delIndex = FASTCOVER_hashPtrToIndex(
145-
(*ctx).samples.as_ptr().offset(activeSegment.begin as isize)
146-
as *const core::ffi::c_void,
144+
let delIndex = FASTCOVER_hashPtrToIndex_array(
145+
samples[activeSegment.begin as usize..][..8]
146+
.try_into()
147+
.unwrap(),
147148
f,
148149
d,
149150
);
150-
let fresh1 = &mut (*segmentFreqs.add(delIndex));
151-
*fresh1 = (*fresh1 as core::ffi::c_int - 1) as u16;
152-
if *segmentFreqs.add(delIndex) as core::ffi::c_int == 0 {
151+
segmentFreqs[delIndex] -= 1;
152+
if segmentFreqs[delIndex] == 0 {
153153
activeSegment.score = (activeSegment.score).wrapping_sub(freqs[delIndex]);
154154
}
155155
activeSegment.begin = (activeSegment.begin).wrapping_add(1);
@@ -159,24 +159,21 @@ unsafe fn FASTCOVER_selectSegment(
159159
}
160160
}
161161
while activeSegment.begin < end {
162-
let delIndex_0 = FASTCOVER_hashPtrToIndex(
163-
(*ctx).samples.as_ptr().offset(activeSegment.begin as isize)
164-
as *const core::ffi::c_void,
162+
let delIndex_0 = FASTCOVER_hashPtrToIndex_array(
163+
samples[activeSegment.begin as usize..][..8]
164+
.try_into()
165+
.unwrap(),
165166
f,
166167
d,
167168
);
168-
let fresh2 = &mut (*segmentFreqs.add(delIndex_0));
169-
*fresh2 = (*fresh2 as core::ffi::c_int - 1) as u16;
170-
activeSegment.begin = (activeSegment.begin).wrapping_add(1);
169+
segmentFreqs[delIndex_0] -= 1;
170+
activeSegment.begin += 1;
171171
}
172172
let mut pos: u32 = 0;
173173
pos = bestSegment.begin;
174174
while pos != bestSegment.end {
175-
let i = FASTCOVER_hashPtrToIndex(
176-
(*ctx).samples.as_ptr().offset(pos as isize) as *const core::ffi::c_void,
177-
f,
178-
d,
179-
);
175+
let i =
176+
FASTCOVER_hashPtrToIndex_array(samples[pos as usize..][..8].try_into().unwrap(), f, d);
180177
freqs[i] = 0;
181178
pos = pos.wrapping_add(1);
182179
}
@@ -356,7 +353,7 @@ unsafe fn FASTCOVER_buildDictionary(
356353
dictBuffer: *mut core::ffi::c_void,
357354
dictBufferCapacity: size_t,
358355
parameters: ZDICT_cover_params_t,
359-
segmentFreqs: *mut u16,
356+
segmentFreqs: &mut [u16],
360357
) -> size_t {
361358
let dict = dictBuffer as *mut u8;
362359
let mut tail = dictBufferCapacity;
@@ -438,12 +435,12 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
438435
let parameters = (*data).parameters;
439436
let dictBufferCapacity = (*data).dictBufferCapacity;
440437
let totalCompressedSize = Error::GENERIC.to_error_code();
441-
let segmentFreqs = calloc((1) << (*ctx).f, ::core::mem::size_of::<u16>()) as *mut u16;
438+
let mut segmentFreqs: Box<[u16]> = Box::from(vec![0u16; 1 << ctx.f]);
442439
let dict = malloc(dictBufferCapacity) as *mut u8;
443440
let mut selection = COVER_dictSelectionError(Error::GENERIC.to_error_code());
444-
let displayLevel = (*ctx).displayLevel;
445-
let mut freqs = (*ctx).freqs.clone();
446-
if segmentFreqs.is_null() || dict.is_null() {
441+
let displayLevel = ctx.displayLevel;
442+
let mut freqs = ctx.freqs.clone();
443+
if dict.is_null() {
447444
if displayLevel >= 1 {
448445
eprintln!("Failed to allocate buffers: out of memory");
449446
}
@@ -454,7 +451,7 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
454451
dict as *mut core::ffi::c_void,
455452
dictBufferCapacity,
456453
parameters,
457-
segmentFreqs,
454+
&mut segmentFreqs,
458455
);
459456
let nbFinalizeSamples =
460457
(ctx.nbTrainSamples * ctx.accelParams.finalize as size_t / 100) as core::ffi::c_uint;
@@ -478,7 +475,7 @@ unsafe fn FASTCOVER_tryParameters(opaque: *mut core::ffi::c_void) {
478475
free(dict as *mut core::ffi::c_void);
479476
COVER_best_finish((*data).best, parameters, selection);
480477
free(data as *mut core::ffi::c_void);
481-
free(segmentFreqs as *mut core::ffi::c_void);
478+
drop(segmentFreqs);
482479
COVER_dictSelectionFree(selection);
483480
drop(freqs);
484481
}
@@ -603,7 +600,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
603600
if displayLevel >= 2 {
604601
eprintln!("Building dictionary");
605602
}
606-
let segmentFreqs = calloc(1 << parameters.f, ::core::mem::size_of::<u16>()) as *mut u16;
603+
let mut segmentFreqs: Box<[u16]> = Box::from(vec![0u16; 1 << parameters.f]);
607604

608605
let mut freqs = core::mem::take(&mut ctx.freqs);
609606
let tail = FASTCOVER_buildDictionary(
@@ -612,7 +609,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
612609
dictBuffer,
613610
dictBufferCapacity,
614611
coverParams,
615-
segmentFreqs,
612+
&mut segmentFreqs,
616613
);
617614
ctx.freqs = freqs;
618615

@@ -632,7 +629,7 @@ pub unsafe extern "C" fn ZDICT_trainFromBuffer_fastCover(
632629
eprintln!("Constructed dictionary of size {}", dictionarySize);
633630
}
634631
FASTCOVER_ctx_destroy(&mut ctx);
635-
free(segmentFreqs as *mut core::ffi::c_void);
632+
drop(segmentFreqs);
636633
dictionarySize
637634
}
638635
#[cfg_attr(feature = "export-symbols", export_name = crate::prefix!(ZDICT_optimizeTrainFromBuffer_fastCover))]

0 commit comments

Comments
 (0)