void init_validation() { int i; vs.type = TRANSACTION_SUBMIT; vs.ST = 0; vs.abort_count = 0; vs.commit_count = 0; vs.update_set_count = 0; vs.ws = bloom_new(BIG_BLOOM); vs.snapshots = DB_MALLOC(sizeof(bloom*) * MaxPreviousST); for (i = 0; i < MaxPreviousST; i++) vs.snapshots[i] = bloom_new(BIG_BLOOM); vs.abort_tr_ids = DB_MALLOC(sizeof(tr_id) * MAX_ABORT_COUNT); vs.commit_tr_ids = DB_MALLOC(sizeof(tr_id) * ValidationBufferSize); us_buffer = DB_MALLOC(sizeof(buffer)); us_buffer->data = DB_MALLOC(1024*1024); buffer_clear(us_buffer); }
// release one day event's extend data:tw0 INT32 data_release_extend() { INT32 ret,i,j; date_time start_dt, end_dt; UINT8 *tmpbuf = 0; // use to avoid memory fragment ret = ERR_FAILED; epg_enter_mutex(); MTP_PRINT("%s\n", __FUNCTION__); tmpbuf = (UINT8*)MALLOC(300); do { for(i=0; i<db_block.index; i++) { get_event_start_time(&db_block.node[i], &start_dt); get_event_end_time(&db_block.node[i], &end_dt); if(eit_compare_time(&tw0.t_min,&end_dt)<=0 ||eit_compare_time(&tw0.t_max, &start_dt)>=0 ) {// release extend data for(j=0; j<MAX_EPG_LANGUAGE_COUNT; j++) { if(db_block.node[i].status==NODE_ACTIVE && db_block.node[i].lang[j].ext_text_length!=0) { if(tmpbuf!=NULL && db_block.node[i].status==NODE_ACTIVE && db_block.node[i].lang[j].text_length!=0) {// avoid memory fragment MEMCPY(tmpbuf, db_block.node[i].lang[j].text_char, db_block.node[i].lang[j].text_length); DB_FREE(db_block.node[i].lang[j].text_char); db_block.node[i].lang[j].text_char = NULL; } MTP_PRINT("%d-%d\n", start_dt.month, start_dt.day); DB_FREE(db_block.node[i].lang[j].ext_text_char); db_block.node[i].lang[j].ext_text_char = NULL; db_block.node[i].lang[j].ext_text_length = 0; if(tmpbuf!=NULL && db_block.node[i].status==NODE_ACTIVE && db_block.node[i].lang[j].text_length!=0) {// avoid memory fragment db_block.node[i].lang[j].text_char = (UINT8*)DB_MALLOC(db_block.node[i].lang[j].text_length); MEMCPY(db_block.node[i].lang[j].text_char, tmpbuf, db_block.node[i].lang[j].text_length); } ret = SUCCESS; } } } } }while(ret!=SUCCESS && update_time_window(&tw0, &tw1, EXT_DATA)==SUCCESS); if(tmpbuf!=0) FREE(tmpbuf); epg_leave_mutex(); return ret; }
transaction* transaction_new() { transaction* t; t = DB_MALLOC(sizeof(transaction)); t->st = -1; t->seqn = 0; t->remote_count = 0; t->rs = create_hashtable(hashtable_init); t->ws = create_hashtable(hashtable_init); t->get_cb = NULL; t->cb_arg = NULL; t->cb_val = NULL; t->id.client_id = 44444; t->never_set = 55555; return t; }
//add a node to db //node: IN, external node, will be copied to new node of the db static INT32 _add_node(struct DB_NODE *node) { INT32 ret,i; ret = ERR_FAILED; //first add to tail if (db_block.index < db_block.max_count) { struct DB_NODE *dst = &db_block.node[db_block.index]; MEMCPY(dst, node, sizeof(struct DB_NODE)); dst->status = NODE_ACTIVE; for(i=0;i<MAX_EPG_LANGUAGE_COUNT;i++) { dst->lang[i].text_length = 0; dst->lang[i].text_char = NULL; #ifdef EPG_MULTI_TP dst->lang[i].ext_text_length = 0; dst->lang[i].ext_text_char = NULL; #endif } #ifdef DTG_PVR for(i=0;i<MAX_EVENT_CRID_NUM;i++) { dst->eit_cid_desc[i].crid_byte==NULL; dst->eit_cid_desc[i].crid_length = 0; } #endif db_block.index ++; db_block.count ++; ret = SUCCESS; for (i=0; i<MAX_EPG_LANGUAGE_COUNT; i++) { if (node->lang[i].text_length > 0) { dst->lang[i].text_char = (UINT8*)DB_MALLOC(node->lang[i].text_length); if (dst->lang[i].text_char == NULL) { ret = ERR_NO_MEM; break; } else { MEMCPY(dst->lang[i].text_char, node->lang[i].text_char, node->lang[i].text_length); dst->lang[i].text_length = node->lang[i].text_length; } } #ifdef EPG_MULTI_TP if(node->lang[i].ext_text_length>0) { dst->lang[i].ext_text_char = (UINT8*)DB_MALLOC(node->lang[i].ext_text_length); if(dst->lang[i].ext_text_char==NULL) { ret = ERR_NO_MEM; break; } else { MEMCPY(dst->lang[i].ext_text_char, node->lang[i].ext_text_char, node->lang[i].ext_text_length); dst->lang[i].ext_text_length = node->lang[i].ext_text_length; } } #endif } #ifdef DTG_PVR for (i = 0; i < MAX_EVENT_CRID_NUM; i++) { if (node->eit_cid_desc[i].crid_length > 0) { dst->eit_cid_desc[i].crid_byte = (UINT8*)DB_MALLOC(node->eit_cid_desc[i].crid_length); if (dst->eit_cid_desc[i].crid_byte == NULL) { DB_PRINT("%s: alloc failed!\n",__FUNCTION__); dst->eit_cid_desc[i].crid_length = 0; ret = ERR_NO_MEM; break; } else MEMCPY(dst->eit_cid_desc[i].crid_byte, \ node->eit_cid_desc[i].crid_byte, node->eit_cid_desc[i].crid_length); } } #endif if(ret==ERR_NO_MEM) { MTP_PRINT("free\n"); for(i=0;i<MAX_EPG_LANGUAGE_COUNT;i++) { if(dst->lang[i].text_char!=NULL) { DB_FREE(dst->lang[i].text_char); dst->lang[i].text_char = NULL; dst->lang[i].text_length = 0; } #ifdef EPG_MULTI_TP if(dst->lang[i].ext_text_char!=NULL) { DB_FREE(dst->lang[i].ext_text_char); dst->lang[i].ext_text_char = NULL; dst->lang[i].ext_text_length = 0; } #endif } #ifdef DTG_PVR for(i=0;i<MAX_EVENT_CRID_NUM;i++) { if(dst->eit_cid_desc[i].crid_byte!=NULL) { DB_FREE(dst->eit_cid_desc[i].crid_byte); dst->eit_cid_desc[i].crid_byte = NULL; dst->eit_cid_desc[i].crid_length = 0; } } #endif dst->status = NODE_DIRTY; db_block.index --; db_block.count --; MTP_PRINT("done\n"); } else MTP_PRINT("ei=%d,i=%d\n",dst->event_id,db_block.index-1); //add 2 view??? // _add2view(dst, &epg_view); MTP_PRINT("cnt:%d\n", db_block.count); return ret; } else //else copy to some dirty one { //ret = _node_op((node_op_t)_node_cpy, node); for(i=0;i<db_block.index;i++) if(db_block.node[i].status!=NODE_ACTIVE) { ret = _node_cpy(&db_block.node[i],node); if(ret==SUCCESS||ret==ERR_NO_MEM) break; } MTP_PRINT("cnt:%d\n", db_block.count); return ret; } }
//if dst is FREE or DIRTY, copy src to dst static INT32 _node_cpy(struct DB_NODE *dst, struct DB_NODE *src) { UINT8 i; INT32 ret; if (dst->status != NODE_ACTIVE) //free or dirty { MEMCPY(dst, src, sizeof(struct DB_NODE)); for(i=0;i<MAX_EPG_LANGUAGE_COUNT;i++) { dst->lang[i].text_length = 0; dst->lang[i].text_char = NULL; #ifdef EPG_MULTI_TP dst->lang[i].ext_text_length = 0; dst->lang[i].ext_text_char = NULL; #endif } dst->status = NODE_ACTIVE; db_block.count ++; ret = SUCCESS; for (i=0; i<MAX_EPG_LANGUAGE_COUNT; i++) { if (src->lang[i].text_length > 0) { dst->lang[i].text_char = (UINT8*)DB_MALLOC(src->lang[i].text_length); if (dst->lang[i].text_char == NULL) { ret = ERR_NO_MEM; break; } else { MEMCPY(dst->lang[i].text_char, src->lang[i].text_char, src->lang[i].text_length); dst->lang[i].text_length = src->lang[i].text_length; } } #ifdef EPG_MULTI_TP if(src->lang[i].ext_text_length>0) { dst->lang[i].ext_text_char = (UINT8*)DB_MALLOC(src->lang[i].ext_text_length); if(dst->lang[i].ext_text_char==NULL) { ret = ERR_NO_MEM; break; } else { MEMCPY(dst->lang[i].ext_text_char, src->lang[i].ext_text_char, src->lang[i].ext_text_length); dst->lang[i].ext_text_length = src->lang[i].ext_text_length; } } #endif } #ifdef DTG_PVR for (i = 0; i < MAX_EVENT_CRID_NUM; i++) { if (src->eit_cid_desc[i].crid_length > 0) { dst->eit_cid_desc[i].crid_byte = (UINT8*)DB_MALLOC(src->eit_cid_desc[i].crid_length); if (dst->eit_cid_desc[i].crid_byte == NULL) { ret = ERR_NO_MEM; break; } else MEMCPY(dst->eit_cid_desc[i].crid_byte, \ src->eit_cid_desc[i].crid_byte, src->eit_cid_desc[i].crid_length); } } #endif if(ret==ERR_NO_MEM) { for(i=0;i<MAX_EPG_LANGUAGE_COUNT;i++) { if(dst->lang[i].text_char!=NULL) { DB_FREE(dst->lang[i].text_char); dst->lang[i].text_char = NULL; dst->lang[i].text_length = 0; } #ifdef EPG_MULTI_TP if(dst->lang[i].ext_text_char!=NULL) { DB_FREE(dst->lang[i].ext_text_char); dst->lang[i].ext_text_char = NULL; dst->lang[i].ext_text_length = 0; } #endif } #ifdef DTG_PVR for(i=0;i<MAX_EVENT_CRID_NUM;i++) { if(dst->eit_cid_desc[i].crid_byte!=NULL) { DB_FREE(dst->eit_cid_desc[i].crid_byte); dst->eit_cid_desc[i].crid_byte = NULL; dst->eit_cid_desc[i].crid_length = 0; } } #endif dst->status = NODE_DIRTY; db_block.count --; } //add 2 view??? // _add2view(dst, &epg_view); return ret; } return ERR_FAILED; }