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.36 by root, Tue Sep 12 19:20:06 2006 UTC vs.
Revision 1.41 by root, Thu Sep 14 01:12:28 2006 UTC

32#include <object.h> 32#include <object.h>
33#include <funcpoint.h> 33#include <funcpoint.h>
34#include <loader.h> 34#include <loader.h>
35 35
36int nrofallocobjects = 0; 36int nrofallocobjects = 0;
37static UUID uuid;
38const uint64 UUID_SKIP = 1<<19;
37 39
38object *objects; /* Pointer to the list of used objects */ 40object *objects; /* Pointer to the list of used objects */
39object *active_objects; /* List of active objects that need to be processed */ 41object *active_objects; /* List of active objects that need to be processed */
40 42
41short freearr_x[SIZEOFFREE] = { 0, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1, 43short freearr_x[SIZEOFFREE] = { 0, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1,
49}; 51};
50int freedir[SIZEOFFREE] = { 52int freedir[SIZEOFFREE] = {
51 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 53 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8,
52 1, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8 54 1, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 8, 8, 8, 8
53}; 55};
56
57static void
58write_uuid (void)
59{
60 char filename1[MAX_BUF], filename2[MAX_BUF];
61
62 sprintf (filename1, "%s/uuid", settings.localdir);
63 sprintf (filename2, "%s/uuid~", settings.localdir);
64
65 FILE *fp;
66
67 if (!(fp = fopen (filename2, "w")))
68 {
69 LOG (llevError, "ERROR: cannot open %s for writing, unable to write UUID!\n", filename2);
70 return;
71 }
72
73 fprintf (fp, "<1,%llx>\n", (unsigned long long)uuid.seq + UUID_SKIP * 2);
74 fclose (fp);
75 rename (filename2, filename1);
76}
77
78static void
79read_uuid (void)
80{
81 char filename[MAX_BUF];
82
83 sprintf (filename, "%s/uuid", settings.localdir);
84
85 FILE *fp;
86
87 if (!(fp = fopen (filename, "r")))
88 {
89 if (errno == ENOENT)
90 {
91 LOG (llevInfo, "RESET uid to 1\n");
92 uuid.seq = 0;
93 write_uuid ();
94 return;
95 }
96
97 LOG (llevError, "FATAL: cannot open %s for reading!\n", filename);
98 _exit (1);
99 }
100
101 int version;
102 unsigned long long uid;
103 if (2 != fscanf (fp, "<%d,%llx>\n", &version, &uid) || version != 1)
104 {
105 LOG (llevError, "FATAL: error reading uid from %s!\n", filename);
106 _exit (1);
107 }
108
109 uuid.seq = uid;
110 write_uuid ();
111 LOG (llevDebug, "read UID: %lld\n", uid);
112 fclose (fp);
113}
114
115UUID
116gen_uuid ()
117{
118 UUID uid;
119
120 uid.seq = ++uuid.seq;
121
122 if (!(uuid.seq & (UUID_SKIP - 1)))
123 write_uuid ();
124
125 return uid;
126}
127
128void
129init_uuid ()
130{
131 read_uuid ();
132}
54 133
55/* Returns TRUE if every key_values in wants has a partner with the same value in has. */ 134/* Returns TRUE if every key_values in wants has a partner with the same value in has. */
56static int 135static int
57compare_ob_value_lists_one (const object *wants, const object *has) 136compare_ob_value_lists_one (const object *wants, const object *has)
58{ 137{
254 { 333 {
255 if (inv->inv) 334 if (inv->inv)
256 sum_weight (inv); 335 sum_weight (inv);
257 sum += inv->carrying + inv->weight * (inv->nrof ? inv->nrof : 1); 336 sum += inv->carrying + inv->weight * (inv->nrof ? inv->nrof : 1);
258 } 337 }
338
259 if (op->type == CONTAINER && op->stats.Str) 339 if (op->type == CONTAINER && op->stats.Str)
260 sum = (sum * (100 - op->stats.Str)) / 100; 340 sum = (sum * (100 - op->stats.Str)) / 100;
341
261 if (op->carrying != sum) 342 if (op->carrying != sum)
262 op->carrying = sum; 343 op->carrying = sum;
344
263 return sum; 345 return sum;
264} 346}
265 347
266/** 348/**
267 * Return the outermost environment object for a given object. 349 * Return the outermost environment object for a given object.
836 if (op->more != NULL) 918 if (op->more != NULL)
837 update_object (op->more, action); 919 update_object (op->more, action);
838} 920}
839 921
840static unordered_vector<object *> mortals; 922static unordered_vector<object *> mortals;
841static std::vector<object *> freed; 923static std::vector<object *, slice_allocator <object *> > freed;
842 924
843void object::free_mortals () 925void object::free_mortals ()
844{ 926{
845 for (unordered_vector<object *>::iterator i = mortals.begin (); i != mortals.end ();) 927 for (unordered_vector<object *>::iterator i = mortals.begin (); i != mortals.end ();)
846 if ((*i)->refcnt) 928 if ((*i)->refcnt)
847 ++i; // further delay freeing 929 ++i; // further delay freeing
848 else 930 else
849 { 931 {
932 //printf ("free_mortal(%p,%ld,%ld)\n", *i, pticks, (*i)->count);//D
850 freed.push_back (*i);//D 933 //freed.push_back (*i);//D
851 //delete *i; 934 delete *i;
852 mortals.erase (i); 935 mortals.erase (i);
853 } 936 }
854 937
855 if (mortals.size() && 0)//D 938 if (mortals.size() && 0)//D
856 LOG (llevDebug, "%d objects in mortal queue\n", mortals.size());//D 939 LOG (llevDebug, "%d objects in mortal queue\n", mortals.size());//D
871} 954}
872 955
873void object::link () 956void object::link ()
874{ 957{
875 count = ++ob_count; 958 count = ++ob_count;
959 uuid = gen_uuid ();
876 960
877 prev = 0; 961 prev = 0;
878 next = objects; 962 next = objects;
879 963
880 if (objects) 964 if (objects)
883 objects = this; 967 objects = this;
884} 968}
885 969
886void object::unlink () 970void object::unlink ()
887{ 971{
888 count = 0; 972 //count = 0;//D
889 973 if (!prev && !next) return;//D
890 /* Remove this object from the list of used objects */
891 if (prev)
892 {
893 prev->next = next;
894 prev = 0;
895 }
896
897 if (next)
898 {
899 next->prev = prev;
900 next = 0;
901 }
902 974
903 if (this == objects) 975 if (this == objects)
904 objects = next; 976 objects = next;
977
978 /* Remove this object from the list of used objects */
979 if (prev) prev->next = next;
980 if (next) next->prev = prev;
981
982 prev = 0;
983 next = 0;
905} 984}
906 985
907object *object::create () 986object *object::create ()
908{ 987{
909 object *op; 988 object *op;
943 1022
944 if (!QUERY_FLAG (this, FLAG_REMOVED)) 1023 if (!QUERY_FLAG (this, FLAG_REMOVED))
945 remove_ob (this); 1024 remove_ob (this);
946 1025
947 SET_FLAG (this, FLAG_FREED); 1026 SET_FLAG (this, FLAG_FREED);
1027
1028 //printf ("free(%p,%ld,%ld)\n", this, pticks, count);//D
948 1029
949 if (more) 1030 if (more)
950 { 1031 {
951 more->free (free_inventory); 1032 more->free (free_inventory);
952 more = 0; 1033 more = 0;
1222 * This function goes through all objects below and including top, and 1303 * This function goes through all objects below and including top, and
1223 * merges op to the first matching object. 1304 * merges op to the first matching object.
1224 * If top is NULL, it is calculated. 1305 * If top is NULL, it is calculated.
1225 * Returns pointer to object if it succeded in the merge, otherwise NULL 1306 * Returns pointer to object if it succeded in the merge, otherwise NULL
1226 */ 1307 */
1227
1228object * 1308object *
1229merge_ob (object *op, object *top) 1309merge_ob (object *op, object *top)
1230{ 1310{
1231 if (!op->nrof) 1311 if (!op->nrof)
1232 return 0; 1312 return 0;
2653 2733
2654 if (tempfile == NULL) 2734 if (tempfile == NULL)
2655 { 2735 {
2656 LOG (llevError, "Error - Unable to access load object temp file\n"); 2736 LOG (llevError, "Error - Unable to access load object temp file\n");
2657 return NULL; 2737 return NULL;
2658 }; 2738 }
2739
2659 fprintf (tempfile, obstr); 2740 fprintf (tempfile, obstr);
2660 fclose (tempfile); 2741 fclose (tempfile);
2661 2742
2662 op = get_object (); 2743 op = get_object ();
2663 2744

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines