ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/object.C
(Generate patch)

Comparing deliantra/server/common/object.C (file contents):
Revision 1.323 by root, Sun Apr 11 23:56:09 2010 UTC vs.
Revision 1.324 by root, Mon Apr 12 05:22:37 2010 UTC

36static const uint64 UUID_GAP = 1<<19; 36static const uint64 UUID_GAP = 1<<19;
37uint32_t mapspace::smellcount = 10000; 37uint32_t mapspace::smellcount = 10000;
38 38
39objectvec objects; 39objectvec objects;
40activevec actives; 40activevec actives;
41
42freelist_item *object::freelist;
43uint32_t object::object_count;
44uint32_t object::free_count;
45uint32_t object::create_count;
46uint32_t object::destroy_count;
41 47
42//+GPL 48//+GPL
43 49
44short freearr_x[SIZEOFFREE] = { 50short freearr_x[SIZEOFFREE] = {
45 0, 51 0,
809 unlink (); 815 unlink ();
810 816
811 free_key_values (this); 817 free_key_values (this);
812} 818}
813 819
814static int object_count;
815
816void object::link () 820void object::link ()
817{ 821{
818 assert (!index);//D 822 assert (!index);//D
819 uuid = UUID::gen (); 823 uuid = UUID::gen ();
820 count = ++object_count;
821 824
822 refcnt_inc (); 825 refcnt_inc ();
823 objects.insert (this); 826 objects.insert (this);
827
828 ++create_count;
829
824} 830}
825 831
826void object::unlink () 832void object::unlink ()
827{ 833{
828 if (!index) 834 if (!index)
829 return; 835 return;
836
837 ++destroy_count;
830 838
831 objects.erase (this); 839 objects.erase (this);
832 refcnt_dec (); 840 refcnt_dec ();
833} 841}
834 842
960 // then destroy 968 // then destroy
961 op->destroy (); 969 op->destroy ();
962 } 970 }
963} 971}
964 972
973void
974object::freelist_free (int count)
975{
976 while (count-- && freelist)
977 {
978 freelist_item *next = freelist->next;
979 // count is being "destroyed"
980
981 sfree ((char *)freelist, sizeof (object));
982
983 freelist = next;
984 --free_count;
985 }
986}
987
988object *
965object *object::create () 989object::create ()
966{ 990{
967 object *op = new object; 991 object *op;
992
993 if (freelist)
994 {
995 freelist_item li = *freelist;
996 memset (freelist, 0, sizeof (object));
997
998 op = new (freelist) object;
999 op->count = li.count;
1000
1001 freelist = li.next;
1002 --free_count;
1003 }
1004 else
1005 {
1006 void *ni = salloc0<char> (sizeof (object));
1007
1008 op = new(ni) object;
1009
1010 op->count = ++object_count;
1011 }
1012
968 op->link (); 1013 op->link ();
1014
969 return op; 1015 return op;
1016}
1017
1018void
1019object::do_delete ()
1020{
1021 uint32_t count = this->count;
1022
1023 this->~object ();
1024
1025 freelist_item *li = (freelist_item *)this;
1026 li->next = freelist;
1027 li->count = count;
1028
1029 freelist = li;
1030 ++free_count;
970} 1031}
971 1032
972static struct freed_map : maptile 1033static struct freed_map : maptile
973{ 1034{
974 freed_map () 1035 freed_map ()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines