135 lines
2.9 KiB
Haxe
Raw Normal View History

2025-01-22 16:18:30 +01:00
package gc;
import haxe.io.Bytes;
import haxe.crypto.Md5;
import cpp.vm.Gc;
import sys.io.File;
#if haxe4
import sys.thread.Thread;
#else
import cpp.vm.Thread;
#end
class Wrapper
{
public var a:Int;
public function new(inA:Int) a = inA;
}
@:cppInclude("./ZoneTest.cpp")
@:depend("./ZoneTest.cpp")
class TestGCThreaded extends haxe.unit.TestCase
{
@:keep
static var keepRunning = false;
@:keep
static var nativeRunning = false;
var bigText:String;
override public function setup()
{
var lines = [ for(i in 0...100000) "abc123\n" ];
#if nme
bigText = lines.join("");
#else
File.saveContent( "gc/big.txt", lines.join("") );
#end
}
public function testThreadOnce():Void
{
startNative();
doThreadedWork(4,100);
stopNative();
assertTrue(true);
}
public function testThreadMany():Void
{
startNative();
for(i in 0...10)
#if nme
doThreadedWork(4,100);
#else
doThreadedWork(100,100);
#end
stopNative();
assertTrue(true);
}
@:native("nativeLoop")
extern static function nativeLoop() : Void;
function startNative()
{
Thread.create( () -> {
nativeRunning = true;
keepRunning = true;
nativeLoop();
});
}
function stopNative()
{
keepRunning = false;
while(nativeRunning)
Sys.sleep(0.1);
}
function doThreadedWork(numThreads, numWork):Void
{
var threads:Array<Thread> = makeThreads(numThreads);
for (i in 0...numWork)
threads[i % threads.length].sendMessage('doWork');
for (i in 0...numThreads)
{
threads[i].sendMessage('exit');
Thread.readMessage(true);
}
}
function makeThreads(numThreads:Int):Array<Thread>
{
#if nme
var text:String = bigText;
#else
var text:String = File.getContent("gc/big.txt");
#end
var main:Thread = Thread.current();
var threads:Array<Thread> = [];
for (i in 0...numThreads)
{
threads.push( Thread.create(function() {
while(true) {
var message:Dynamic = Thread.readMessage(true);
if(message == 'exit')
break;
else
Md5.encode(text);
var arrays = new Array<Array<Wrapper>>();
for(i in 0...100)
{
var wrappers = new Array<Wrapper>();
arrays.push(wrappers);
for(j in 0...1000)
wrappers.push( new Wrapper(1) );
}
var sum = 0;
for(a in arrays)
for(w in a)
sum += w.a;
assertTrue(sum==100000);
}
main.sendMessage('done');
}) );
}
return threads;
}
}