/// <summary> /// FIX ME!! /// </summary> /// <param name="thread"></param> public static void RegisterThread12Many(Thread thread) { lock (ThreadRegLock) { IncrementUseCount(thread); lock (ThreadRegLock) unregisteredThreads.Remove(thread); PlMtEngine oldSelf; if (ThreadEngines.TryGetValue(thread.ManagedThreadId, out oldSelf)) { oldSelf.PlSetEngine(); return; } try { //var _iEngineNumber = libpl.PL_create_engine(IntPtr.Zero); oldSelf = new PlMtEngine(); oldSelf.PlSetEngine(); ThreadEngines.Add(thread.ManagedThreadId, oldSelf); } catch (Exception) { throw; } } }
//[TestMethod] //[Ignore] public void Test_PlMtEngine_desroy_exception() { PlMtEngine mple1 = new PlMtEngine(); PlQuery q1 = null; mple1.PlSetEngine(); q1 = new PlQuery("member(A, [a,b,c])"); mple1.PlDetachEngine(); mple1.Free(); q1.Dispose(); }
public void Test_Muliptle_engines() { // test case : // initialise // create thread and do // pl_create_engine // loop // pl_set_engine // do somthing in prolog // pl_detache_engine // create 2. thread and do // pl_create_engine // loop // pl_set_engine // do somthing in prolog // pl_detache_engine // pl_destroy_engine // create 3. thread and do // pl_create_engine // pl_set_engine // do somthing in prolog // pl_detache_engine // pl_destroy_engine // the first Thread PlMtEngine mple1 = new PlMtEngine(); PlQuery q1 = null; // the second Thread PlMtEngine mple2 = new PlMtEngine(); PlQuery q2 = null; string[] testResult = { "a", "b", "c" }; mple1.PlSetEngine(); q1 = new PlQuery("member(A, [a,b,c])"); Assert.IsTrue(q1.NextSolution()); Assert.AreEqual(testResult[0], q1.Args[0].ToString()); Assert.IsTrue(q1.NextSolution()); Assert.AreEqual(testResult[1], q1.Args[0].ToString()); mple1.PlDetachEngine(); mple2.PlSetEngine(); q2 = new PlQuery("member(A, [a,b,c])"); Assert.IsTrue(q2.NextSolution()); Assert.AreEqual(testResult[0], q2.Args[0].ToString()); mple2.PlDetachEngine(); mple1.PlSetEngine(); Assert.IsTrue(q1.NextSolution()); Assert.AreEqual(testResult[2], q1.Args[0].ToString()); q1.Dispose(); mple1.PlDetachEngine(); mple2.PlSetEngine(); Assert.IsTrue(q2.NextSolution()); Assert.AreEqual(testResult[1], q2.Args[0].ToString()); //q2.Free(); mple2.PlDetachEngine(); // mple1.Free(); // mple2.Free(); }