From ea94856063fd9d4881455fe43399aa961d4a09dc Mon Sep 17 00:00:00 2001 From: adash Date: Sun, 25 Feb 2007 03:04:32 +0000 Subject: [PATCH] Initial version checkin TODO: more testing and hash table implementation of object ids and address --- Robust/src/Runtime/DSTM/interface/dstm.c | 125 +++++++++++++++++++++++ Robust/src/Runtime/DSTM/interface/dstm.h | 76 ++++++++++---- 2 files changed, 179 insertions(+), 22 deletions(-) create mode 100644 Robust/src/Runtime/DSTM/interface/dstm.c diff --git a/Robust/src/Runtime/DSTM/interface/dstm.c b/Robust/src/Runtime/DSTM/interface/dstm.c new file mode 100644 index 00000000..6be1b978 --- /dev/null +++ b/Robust/src/Runtime/DSTM/interface/dstm.c @@ -0,0 +1,125 @@ +#include "dstm.h" + +obj_store_t *obj_begin; +obj_listnode_t *obj_lnode_begin; + +extern int classsize[]; + +/* BEGIN - object store */ + +void dstm_init(void) { + obj_begin = NULL; + obj_lnode_begin = NULL; + return; +} + +void create_objstr(unsigned int size) { + obj_store_t *tmp, *ptr; + static int id = 0; + + if ((tmp = (obj_store_t *) malloc(sizeof(obj_store_t))) < 0) { + printf("DSTM: Malloc error %s %d\n", __FILE__, __LINE__); + exit(-1); + } + if ((tmp->base = (char *) malloc(sizeof(char)*size)) < 0) { + printf("DSTM: Malloc error %s %d\n", __FILE__, __LINE__); + exit(-1); + } + tmp->size = size; + tmp->top = tmp->base; + tmp->id = id++; + if (obj_begin == NULL) { // First entry + obj_begin = tmp; + tmp->next = NULL; + } else { // Insert to the front of the linked list + tmp->next = obj_begin; + obj_begin = tmp; + } + return; +} + +void delete_objstr(int id) { + //TODO Implement this along with garbage collector + return; +} + +obj_store_t *get_objstr_begin(void) { + return obj_begin; +} + +/* END object store */ + +/* BEGIN object header */ +int get_newID(void) { + static int id = 0; + + return ++id; +} + +int insertObject(obj_header_t h) { + int left, req; + + left = obj_begin->size - (obj_begin->top - obj_begin->base); + req = getObjSize(h) + sizeof(obj_header_t); + if (req < left) { + memcpy(obj_begin->top, &h, sizeof(obj_header_t)); + obj_begin->top = obj_begin->top + sizeof(obj_header_t) + getObjSize(h); + } else { + return -1; + } + //TODO Update obj_addr_table + return 0; +} + +int getObjSize(obj_header_t h) { + return classsize[h.type]; +} + +void createObject(unsigned short type) { + obj_header_t h; + + h.oid = get_newID(); + h.type = type; + h.version = 0; + h.rcount = 1; + h.status = CLEAN; + insert_object(h); +} +/* END object header */ + +/* BEGIN obj_listnode */ + +int IsEmpty(obj_listnode_t *node) { + return obj_lnode_begin == NULL; +} + +void insert_lnode(obj_listnode_t *node) { + if(obj_lnode_begin == NULL) { // Enter "node" as the first node in linked list + obj_lnode_begin = node; + node->next = NULL; + } else { // Enter "node" to the beginning of the linked list + node->next = obj_lnode_begin; + obj_lnode_begin = node ; + + } + +} + +int delete_lnode(obj_listnode_t *node, unsigned int oid) { + obj_listnode_t pre, curr; + if( obj_lnode_begin == NULL){ + printf(" No nodes to delete "); + return -1; + }else { + //Traverse list + pre = curr = obj_lnode_begin; + while(node->next != NULL) { + pre = curr; + curr= curr->next; + if(oid == node->oid){ + } + } +} + + +/* END obj_listnode */ diff --git a/Robust/src/Runtime/DSTM/interface/dstm.h b/Robust/src/Runtime/DSTM/interface/dstm.h index ba1734dc..98dd7117 100644 --- a/Robust/src/Runtime/DSTM/interface/dstm.h +++ b/Robust/src/Runtime/DSTM/interface/dstm.h @@ -1,49 +1,79 @@ +#ifndef _DSTM_H_ +#define _DSTM_H_ -typedef struct { +#include +#include +#include + +enum status {CLEAN, DIRTY}; + +typedef struct obj_header { unsigned int oid; unsigned short type; unsigned short version; unsigned short rcount; - unsigned short status; -} obj_header; + char status; +} obj_header_t; -typedef struct obj_str{ - void *base; +typedef struct obj_store { + unsigned int id; + char *base; unsigned int size; - void *top; //next available location - struct obj_str *next; -} obj_store; + char *top; //next available location + struct obj_store *next; +} obj_store_t; //use for hash tables, transaction records. //to check oid, do object->oid typedef struct obj_lnode{ - obj_header *object; + obj_header_t *object; + unsigned int oid; struct obj_lnode *next; -} obj_listnode; +} obj_listnode_t; -typedef struct { - unsigned int size; //number of elements, not bytes - obj_listnode *table; //this should point to an array of object lists, of the specified size -} obj_addr_table; +typedef struct obj_addr_table { + unsigned int size; //number of elements, not bytes + obj_listnode_t *table; //this should point to an array of object lists, of the specified size +} obj_addr_table_t; -typedef struct { - obj_listnode *obj_list; - obj_store *cache; - obj_addr_table *lookupTable; -} trans_record; +typedef struct trans_record { + obj_listnode_t *obj_list; + obj_store_t *cache; + obj_addr_table_t *lookupTable; +} trans_record_t; typedef struct obj_location_lnode { unsigned int oid; unsigned int mid; struct obj_location_lnode *next; -} obj_location_listnode; +} obj_location_listnode_t; typedef struct { unsigned int size; //number of elements, not bytes - obj_location_listnode *table; //this should point to an array of object lists, of the specified size + obj_location_listnode_t *table; //this should point to an array of object lists, of the specified size } obj_location_table; -unsigned int objSize(obj_header *); +/* Prototypes for object store */ +void dstm_init(void); +void create_objstr(unsigned int); +void delete_objstr(int); +obj_store_t *get_objstr_begin(void); +/* end object store */ + + +/* Prototypes for object header */ +int get_newID(void); +int insertObject(obj_header_t h); +int getObjSize(obj_header_t h); +void createObject(unsigned short type); +/* end object header */ + + + +/* +void * allocate_size(unsigned int); +void initializeobj(unsigned int); +unsigned int getobjSize(obj_header *); int insertAddr(obj_addr_table *, obj_header *); int removeAddr(obj_addr_table *, unsigned int); obj_header *getAddr(obj_addr_table *, unsigned int); @@ -53,4 +83,6 @@ int transCommit(trans_record *); int insertLocation(obj_location_table *, unsigned int, unsigned int); int removeLocation(obj_location_table *, unsigned int); unsigned int getLocation(obj_location_table *, unsigned int); +*/ +#endif -- 2.34.1