浏览代码

Added enumeration pool.

woollybah 11 年之前
父节点
当前提交
8070d56e6e
共有 1 个文件被更改,包括 32 次插入2 次删除
  1. 32 2
      linkedlist.mod/linkedlist.bmx

+ 32 - 2
linkedlist.mod/linkedlist.bmx

@@ -14,6 +14,7 @@ ModuleInfo "Modserver: BRL"
 
 
 ModuleInfo "History: 1.08"
 ModuleInfo "History: 1.08"
 ModuleInfo "History: Clear TLink fields on Remove()."
 ModuleInfo "History: Clear TLink fields on Remove()."
+ModuleInfo "History: Added enumeration pool."
 ModuleInfo "History: 1.07 Release"
 ModuleInfo "History: 1.07 Release"
 ModuleInfo "History: Changed Reverse to maintain TLink stability"
 ModuleInfo "History: Changed Reverse to maintain TLink stability"
 ModuleInfo "History: 1.06 Release"
 ModuleInfo "History: 1.06 Release"
@@ -21,6 +22,10 @@ ModuleInfo "History: Added optional CompareFunc parameter to Sort"
 ModuleInfo "History: 1.05 Release"
 ModuleInfo "History: 1.05 Release"
 ModuleInfo "History: Sort now swaps links instead of values"
 ModuleInfo "History: Sort now swaps links instead of values"
 
 
+?Threaded
+Import BRL.Threads
+?
+
 Function CompareObjects( o1:Object,o2:Object )
 Function CompareObjects( o1:Object,o2:Object )
 	Return o1.Compare( o2 )
 	Return o1.Compare( o2 )
 End Function
 End Function
@@ -72,10 +77,26 @@ bbdoc: Enumerator Object use by TList in order to implement Eachin support.
 End Rem
 End Rem
 Type TListEnum
 Type TListEnum
 
 
+	Global _pool:TList = New TList
+?Threaded
+	Global _mutex:TMutex = CreateMutex()
+?
+
 	Field _link:TLink
 	Field _link:TLink
 
 
 	Method HasNext()
 	Method HasNext()
-		Return _link._value<>_link
+		Local has:Int = _link._value<>_link
+		If Not has Then
+?Threaded
+			LockMutex(_mutex)
+?
+			_pool.AddLast(Self)
+?Threaded
+			UnlockMutex(_mutex)
+?
+			_link = Null
+		End If
+		Return has
 	End Method
 	End Method
 
 
 	Method NextObject:Object()
 	Method NextObject:Object()
@@ -405,7 +426,16 @@ Type TList
 	End Method
 	End Method
 		
 		
 	Method ObjectEnumerator:TListEnum()
 	Method ObjectEnumerator:TListEnum()
-		Local enum:TListEnum=New TListEnum
+?Threaded
+			LockMutex(_mutex)
+?
+		Local enum:TListEnum=TListEnum._pool.RemoveFirst()
+?Threaded
+			UnlockMutex(_mutex)
+?
+		If Not enum Then
+			enum = New TListEnum
+		End If
 		enum._link=_head._succ
 		enum._link=_head._succ
 		Return enum
 		Return enum
 	End Method
 	End Method