Mercurial > repos > rhope
diff structs.h @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children | 94c885692eb5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/structs.h Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,457 @@ +#ifndef _STRUCTS_H_ +#define _STRUCTS_H_ + +#ifdef WIN32 + #include <windows.h> +#endif + +#ifndef BOOL + #define BOOL short + #define TRUE 1 + #define FALSE 0 +#endif + +#ifndef DWORD + #define DWORD unsigned long +#endif + +#ifndef WINAPI + #define WINAPI +#endif + +#ifndef LPVOID + #define LPVOID void * +#endif +#ifndef NULL + #define NULL 0 +#endif + +//#include "interp.h" +#include "vis_threading.h" +#include "datum.h" +#define QUEUE_SIZE 512 +#include <stdio.h> + +#ifdef CPLUSPLUS +extern "C" { +#endif + +typedef struct +{ + int type; + int num_outputs; + int num_inputs; + char name[256]; + int wire_up_lookup; + int wire_down_lookup; + void * value_index;//used to associate with a def + int io_num; + unsigned short magic_cache_type; + struct worker_def * magic_cache_implement; + VIS_CRITICAL_SECTION(lock) + BOOL null_input; +} worker; + +typedef struct +{ + int start_worker; + int end_worker; + int output_num; + int input_num; +} wire; + + +typedef struct +{ + datum * value; + VIS_CRITICAL_SECTION(worker_lock) + int ready_count; + datum * params[32]; +} worker_instance_data; + + +typedef struct +{ + datum * data; +} wire_instance_data; + +/* +Moved to datum.h for stupid reasons +typedef struct +{ + char filename[512]; + struct worker_def * deflist; + int num_defs; + int defs_storage; + struct company * companylist; + int num_companies; + int companies_storage; +} program; + +*/ + +/*typedef struct worker_def +{ + worker_impl implement_func; + char name[256]; + int num_outputs; + int num_inputs; + unsigned short input_types[32]; +// unsigned short output_types[32]; +// int parent_out_wires[32]; + worker * workerlist; + int num_workers; + wire * wirelist; + int num_wires; + int * workers_to_wires_down; + int * workers_to_wires_up; +// struct worker_def * parent; +// int parent_attached_worker; +// int parent_attached_workerout; +// struct worker_def ** children; +// int num_children; + BOOL magic; + program program; +} worker_def;*/ +/* +typedef struct worker_def_file +{ + worker_impl implement_func; + char name[256]; + int num_outputs; + int num_inputs; + unsigned short input_types[32]; +// unsigned short output_types[32]; +// int parent_out_wires[32]; + worker * workerlist; + int num_workers; + wire * wirelist; + int num_wires; + int * workers_to_wires_down; + int * workers_to_wires_up; +// struct worker_def * parent; +// int parent_attached_worker; +// int parent_attached_workerout; +// struct worker_def ** children; +// int num_children; + BOOL magic; +} worker_def;*/ + +typedef struct +{ + worker * workerlist; + int num_workers; + int worker_storage; + wire * wirelist; + int num_wires; + int wire_storage; + int * workers_to_wires_down; + int * workers_to_wires_up; + VIS_CRITICAL_SECTION(lock) + BOOL dirty; +} custom_worker; + +#define TRANSACTION_WRITE 0x8000 +#define TRANSACTION_TYPE_MASK 0xFF +#define TRANSACTION_RETRY 0 +#define TRANSACTION_FORCE 1 + +typedef struct worker_def +{ + custom_worker * implement_func; //points to either C function or "custom function struct" + char * name; + struct opt_entry * optimized; + int opt_count; + int num_stores; + char ** uses_stores; + unsigned short num_outputs; + unsigned short num_inputs; + unsigned short *input_types; + unsigned short *output_types; + unsigned short type; //Magic, Builtin, Custom + unsigned short transaction_flags; +#ifdef CPLUSPLUS +//ugly hack alert! + program * prog; +#else + program * program; +#endif +#ifdef USER_PROFILE + int count; + LARGE_INTEGER total; + LARGE_INTEGER worst; + VIS_CRITICAL_SECTION(lock) +#endif +} worker_def; + +typedef struct defchunk +{ + int num_defs; + int defs_storage; + struct defchunk * next; + worker_def deflist[1]; +} defchunk; + +typedef struct +{ + datum * name; + datum * data; + //short inuse; +} global_store; + +typedef struct +{ + global_store * store; + datum * begin_data; + datum * instance_data; + VIS_CRITICAL_SECTION(lock) +} global_store_use; + +typedef struct +{ + int num_stores; + datum * params[32]; + global_store_use stores[1]; +} transaction; + +typedef struct worker_instance +{ + worker_def * def; + worker_instance_data * workerlist; + datum ** opt_results; + int num_workers; + wire_instance_data * wirelist; + int num_wires; + void (*callback)(struct worker_instance *, int, struct worker_instance *, void * data); + void * callback_data; + struct worker_instance * caller_instance; + int worker_in_caller; + int in_queue_count; + int in_progress_count; + int child_count; + transaction * trans; +#ifdef USER_PROFILE + LARGE_INTEGER start; +#endif // USER_PROFILE + VIS_CRITICAL_SECTION(counter_lock) +} worker_instance; + +typedef void (*instance_callback)(worker_instance *, int, worker_instance *, void * data); + +typedef struct +{ + int worker_num; + worker_instance * instance; +} queue_entry; + +typedef struct queue_section +{ + queue_entry entries[QUEUE_SIZE]; + struct queue_section * last; + struct queue_section * next; +} queue_section; + +#define ROOM_NO_ACCESS 0 +#define ROOM_BYTE 1 +#define ROOM_SHORT 2 +#define ROOM_LONG 3 +#define ROOM_SINGLE 4 +#define ROOM_DOUBLE 5 +//The param must be set to the max string length for these +#define ROOM_CSTRING_STRUCT 6 +#define ROOM_PSTRING_STRUCT 7 +//Pointer types: For the following it's assumed that it's safe to free the current string +#define ROOM_CSTRING 8 +#define ROOM_PSTRING 9 +//Will copy the contents of a complex value to the destination offset, or the union contents otherwise +#define ROOM_VIS_OBJECT 10 +//Pointer to datum +#define ROOM_VIS_REF 11 +//Use a worker to set/get the room +#define ROOM_WORKER 12 + +#define PRIVATE_FLAG 0x8000 +#define ROOM_TYPE_MASK 0xFF + +typedef struct +{ + char * name; + void * set_func; + void * get_func; + int param; + unsigned short set_func_type; + unsigned short get_func_type; +} company_room; + +typedef struct company +{ + char name[256]; + worker_def ** methodlist; + int num_methods; + int method_storage; + company_room * room_list; + int num_rooms; + int room_storage; + int build_size; + unsigned short type_id; + VIS_CRITICAL_SECTION(lock) +} company; + +typedef struct +{ + int num_entries; + datum * entries[1]; +} list_data; +/* +typedef struct ternary_node +{ + struct ternary_node * left; + struct ternary_node * right; + struct ternary_node * next; + datum * payload; + char letter; +} ternary_node; +*/ + +typedef struct ternary_node +{ + int left; + int right; + int next; + datum * payload; + char letter; +} ternary_node; + +typedef struct +{ + int num_entries; //Number of entries currently in the dict + int num_nodes; //Number of ternary nodes in the dict + int node_storage; //Max number of nodes we can store in the dict + ternary_node nodes[1]; +} dict_data; + +typedef enum {FILE_NOSIZE, FILE_CLOSED, FILE_WRITE, FILE_READ, FILE_CANT_OPEN} file_status; +typedef struct +{ + unsigned int size; +#ifndef SEGA + FILE * file; +#endif + VIS_CRITICAL_SECTION(lock) + int ref_count; + file_status status; + char name[1]; +} shared_file; +typedef struct +{ + unsigned int offset; + shared_file * shared; +} file_data; + +typedef struct +{ + datum * title; + double width; + double height; + datum * widget_dict; + datum * widget_xpos; + datum * widget_ypos; + datum * id_list; +} vis_window; + +typedef struct +{ + datum * label; + datum * value; + double width; + double height; + int flags; + datum * handler_dict; + int selected_index; +} vis_widget; + +typedef struct +{ + VIS_CRITICAL_SECTION(lock) + datum ** params; + BOOL done_flag; +} def_done; + +typedef struct opt_entry +{ + worker_def * def; + int original_pos; + int * input_data; + int null_inputs; + int branch1; + int branch2; + int * output_refs; +} opt_entry; + +typedef struct +{ + worker_def * def; + datum * params[32]; +} worker_datum; +#define MIN_STACK_SIZE 512 //minimum stack size in longwords +typedef struct stack_segment +{ + int size; + struct stack_segment *parent; + struct stack_segment *child; + unsigned long current_stack;//only used when stack is in the queue + unsigned int data[MIN_STACK_SIZE]; +} stack_segment; + +#define QUEUE_FUNC 0 +#define QUEUE_BUILTIN 1 +#define QUEUE_BLOCK 2 +#define QUEUE_BLOCK_WAIT 3 + +typedef struct +{ + unsigned long * address; + void * params; + stack_segment * stack; + char type; +} virt_queue_entry; + +typedef struct virt_queue_segment +{ + struct virt_queue_segment * next; + struct virt_queue_segment * last; + virt_queue_entry entries[QUEUE_SIZE]; +} virt_queue_segment; + +typedef int (*worker_impl)(datum **, queue_entry *); + +//extern worker_def deflist[100]; +//extern int num_defs; + +//extern datum data[4096]; +//extern int num_datum; + +extern wire wirelist[2048]; +extern int num_wires; + +extern worker workerlist[1024]; +extern int num_workers; + +extern int workers_to_wires_down[2048]; +extern int workers_to_wires_up[2048]; + +#ifdef CPLUSPLUS +} +#endif + + +#endif //_STRUCTS_H_ + + + + + + + + +