2 extern int classsize[];
4 //NOTE: "pile" ptr points to the head of the linked list of the machine pile data structures
6 /* This function creates a new pile data structure to hold
7 * obj ids of objects modified or read inside a transaction,
8 * no of objects read and no of objects modified
9 * that belong to a single machine */
11 plistnode_t *pCreate(int objects) {
14 //Create main structure
15 if((pile = calloc(1, sizeof(plistnode_t))) == NULL) {
16 printf("Calloc error %s %d\n", __FILE__, __LINE__);
19 if ((pile->oidmod = calloc(objects, sizeof(unsigned int))) == NULL) {
20 printf("Calloc error %s %d\n", __FILE__, __LINE__);
24 if ((pile->oidcreated = calloc(objects, sizeof(unsigned int))) == NULL) {
25 printf("Calloc error %s %d\n", __FILE__, __LINE__);
30 if ((pile->objread = calloc(objects, sizeof(unsigned int) + sizeof(short))) == NULL) {
31 printf("Calloc error %s %d\n", __FILE__, __LINE__);
34 free(pile->oidcreated);
38 pile->nummod = pile->numread = pile->numcreated = pile->sum_bytes = 0;
43 /* This function inserts necessary information into
44 * a machine pile data structure */
45 plistnode_t *pInsert(plistnode_t *pile, objheader_t *headeraddr, unsigned int mid, int num_objs) {
46 plistnode_t *ptr, *tmp;
47 int found = 0, offset;
50 //Add oid into a machine that is already present in the pile linked list structure
52 if (tmp->mid == mid) {
53 if (STATUS(headeraddr) & NEW) {
54 tmp->oidcreated[tmp->numcreated] = OID(headeraddr);
55 tmp->numcreated = tmp->numcreated + 1;
56 tmp->sum_bytes += sizeof(objheader_t) + classsize[TYPE(headeraddr)];
57 } else if (STATUS(headeraddr) & DIRTY) {
58 tmp->oidmod[tmp->nummod] = OID(headeraddr);
59 tmp->nummod = tmp->nummod + 1;
60 tmp->sum_bytes += sizeof(objheader_t) + classsize[TYPE(headeraddr)];
62 offset = (sizeof(unsigned int) + sizeof(short)) * tmp->numread;
63 *((unsigned int *)(tmp->objread + offset))=OID(headeraddr);
64 offset += sizeof(unsigned int);
65 memcpy(tmp->objread + offset, &headeraddr->version, sizeof(short));
66 tmp->numread = tmp->numread + 1;
73 //Add oid for any new machine
75 if((ptr = pCreate(num_objs)) == NULL) {
79 if (STATUS(headeraddr) & NEW) {
80 ptr->oidcreated[ptr->numcreated] = OID(headeraddr);
81 ptr->numcreated = ptr->numcreated + 1;
82 ptr->sum_bytes += sizeof(objheader_t) + classsize[TYPE(headeraddr)];
83 } else if (STATUS(headeraddr) & DIRTY) {
84 ptr->oidmod[ptr->nummod] = OID(headeraddr);
85 ptr->nummod = ptr->nummod + 1;
86 ptr->sum_bytes += sizeof(objheader_t) + classsize[TYPE(headeraddr)];
88 *((unsigned int *)ptr->objread)=OID(headeraddr);
89 memcpy(ptr->objread + sizeof(unsigned int), &headeraddr->version, sizeof(short));
90 ptr->numread = ptr->numread + 1;
96 STATUS(headeraddr) &= ~(NEW);
97 STATUS(headeraddr) &= ~(DIRTY);
102 //Count the number of machine piles
103 int pCount(plistnode_t *pile) {
114 //Make a list of mid's for each machine group
115 int pListMid(plistnode_t *pile, unsigned int *list) {
119 while (tmp != NULL) {
127 //Delete the entire pile
128 void pDelete(plistnode_t *pile) {
129 plistnode_t *next, *tmp;
134 //free(tmp->oidread);