shithub: mc

Download patch

ref: d8959a4a6d41b0a1328d81eef7c29d10ec669f8e
parent: 9c70e61a54066bf48e9c93178e66442b527762d1
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Mar 20 18:59:21 EDT 2017

Align big free sizes.

	This means that our big allocation sizes will always be
	page aligned.

	This also adds tests.

--- a/lib/std/bytealloc.myr
+++ b/lib/std/bytealloc.myr
@@ -11,19 +11,21 @@
 use "backtrace"
 
 pkg std =
-	const startalloctrace	: (f : byte[:]	-> void)
+	const startalloctrace	: (f : byte[:] -> void)
 	const endalloctrace	: (-> void)
 
+	/* public for testing */
+	pkglocal const zbytealloc	: (sz:size -> byte#)
+	const bytealloc			: (sz:size -> byte#)
+	const bytefree			: (m:byte#, sz:size -> void)
+
 	/* null pointers. only used internally. */
 	pkglocal const Zsliceptr	= (0 : byte#)
-	pkglocal const Align	= 16	/* minimum allocation alignment */
+	pkglocal const Align		= 16	/* minimum allocation alignment */
 
 	pkglocal const align	: (m : std.size, align : std.size -> std.size)
 	pkglocal const allocsz	: (sz : std.size -> std.size)
 
-	pkglocal const bytealloc	: (sz:size	-> byte#)
-	pkglocal const zbytealloc	: (sz:size	-> byte#)
-	pkglocal const bytefree	: (m:byte#, sz:size	-> void)
 ;;
 
 const Zslab	= (0 : slab#)
@@ -193,9 +195,9 @@
 const bigfree = {p, sz
 	var minsz, minp, minidx
 
-	minsz = sz
 	minp = p
 	minidx = -1
+	minsz = align(sz, Align)
 	lock(memlck)
 	for var i = 0; i < cache.len; i++
 		if cache[i].sz < minsz
--- /dev/null
+++ b/lib/std/test/bytealloc.myr
@@ -1,0 +1,52 @@
+use std
+
+const main = {
+	var a : byte#[1000]
+
+	for sz in [10, 100, 1000, 10000, 10000]
+		std.put("sz: {}\n", sz)
+		for cnt in [1, 10, 100]
+			std.put("cnt: {}\n", cnt)
+			/* alloc forwards, dealloc forwards */
+			for var i = 0; i < cnt; i++
+				a[i] = std.bytealloc(sz)
+			;;
+			for var i = 0; i < cnt; i++
+				std.bytefree(a[i], sz)
+			;;
+
+			/* alloc forwards, dealloc backwards */
+			for var i = 0; i < cnt; i++
+				a[i] = std.bytealloc(sz)
+			;;
+			for var i = cnt; i > 0; i--
+				std.bytefree(a[i - 1], sz)
+			;;
+
+			/* alloc forwards, dealloc randomly */
+			for var i = 0; i < cnt; i++
+				a[i] = std.bytealloc(sz)
+			;;
+			shuffle(a[:cnt])
+			for var i = cnt; i > 0; i--
+				std.bytefree(a[i - 1], sz)
+			;;
+		;;
+	;;
+}
+
+const shuffle = {a
+	var t
+	var rng
+	var j
+
+	/* we want determinism for benchmarking */
+	rng = std.mksrng(123)
+	for var i = 0; i < a.len - 1; i++
+		j = std.rngrand(rng, i, a.len)
+		t = a[j]
+		a[j] = a[i]
+		a[i] = t
+	;;
+}
+