blob: 0560a59134e88dc757eae5fa86188eceebd45844 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include "types.h"
extern conf_list_t *list;
extern int first;
extern def_list_t **def_table;
extern int def_table_size;
extern hard_raw_t *hard_raw_list;
void hard_raw_mod(uint32 address, int w_epoch, int w_place, uint32 w_issue, int r_epoch, int r_place, uint32 r_issue)
{
static hard_raw_t *last;
static int hr_empty=1;
if (hr_empty) {
hard_raw_list=(hard_raw_t *)malloc(sizeof(hard_raw_t));
if (!hard_raw_list) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
hard_raw_list->next=NULL;
hard_raw_list->prev=NULL;
hard_raw_list->address=address;
hard_raw_list->w_epoch=w_epoch;
hard_raw_list->w_place=w_place;
hard_raw_list->w_issue=w_issue;
hard_raw_list->r_epoch=r_epoch;
hard_raw_list->r_place=r_place;
hard_raw_list->r_issue=r_issue;
hr_empty=0;
last=hard_raw_list;
return;
}
last->next=(hard_raw_t *)malloc(sizeof(hard_raw_t));
last->next->prev=last;
last=last->next;
if (!last) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
last->next=NULL;
last->address=address;
last->w_epoch=w_epoch;
last->w_place=w_place;
last->w_issue=w_issue;
last->r_epoch=r_epoch;
last->r_place=r_place;
last->r_issue=r_issue;
}
uint32 def_hash (uint32 address)
{
return address%def_table_size;
}
def_list_t *def_list_lookup(uint32 address)
{
uint32 place;
def_list_t *counter;
place = def_hash(address);
counter=def_table[place];
while (counter!=NULL) {
if (address==counter->address) {
return counter;
}
counter=(def_list_t *)counter->next;
}
return NULL;
}
void def_list_mod(uint32 address, int epoch, int place_in_epoch)
{
def_list_t *temp=NULL;
def_list_t *counter;
uint32 place;
place = def_hash(address);
if (def_table[place]==NULL) {
temp=(def_list_t *)malloc(sizeof(def_list_t));
if (!temp) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
temp->next=NULL;
temp->address=address;
temp->epoch=epoch;
temp->place_in_epoch=place_in_epoch;
def_table[place]=temp;
} else {
for (counter=def_table[place];counter!=NULL;counter=(def_list_t *)counter->next) {
temp=counter;
if (address==counter->address) {
counter->epoch=epoch;
counter->place_in_epoch=place_in_epoch;
return;
}
}
counter=(def_list_t *)malloc(sizeof(def_list_t));
if (!counter) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
counter->next=NULL;
counter->address=address;
counter->epoch=epoch;
counter->place_in_epoch=place_in_epoch;
temp->next=counter;
}
}
void conflict_list(uint32 address)
{
static conf_list_t *next=NULL;
conf_list_t *temp=NULL;
conf_list_t *counter;
int make_new=1;
if (first) {
list=(conf_list_t *)malloc(sizeof(conf_list_t));
if (!list) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
list->next=NULL;
list->address=address;
list->accesser=1;
first=0;
next=(conf_list_t *)list;
return;
}
for (counter=list;counter!=NULL;counter=(conf_list_t *)counter->next) {
temp=counter;
if (address==counter->address) {
counter->accesser++;
make_new=0;
break;
}
}
if (make_new) {
next=(conf_list_t *)malloc(sizeof(conf_list_t));
if (!next) {
fprintf(stderr,"ALERT: \tOut of memory, aborting...\n");
exit(1);
}
next->next=NULL;
next->address=address;
next->accesser=1;
temp->next=next;
}
}