Mercurial > repos > rhope
view datum.h @ 121:1af91ceaaf49
Fixed memory leak when an output is only attached to a single null input
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 28 Oct 2010 21:04:12 -0400 |
parents | 23dd9c766699 |
children |
line wrap: on
line source
#ifndef _DATUM_H_ #define _DATUM_H_ #include "vis_threading.h" #include "debugmacros.h" /* Old Datum structure typedef struct { unsigned char type;//0=String,1=Bool,2=Int32,3=UInt32,4=Float, bit 7 = dynamically allocated (i.e. call free when datum is freed) int len; void * contents; } datum; */ //Support structs for new datum structure #ifdef CPLUSPLUS extern "C" { #endif #ifndef PROGRAM_STRUCT_DECLARED_ #define PROGRAM_STRUCT_DECLARED_ //icky hack until I figure out a better one //defined in both datum.h and structs.h ugh typedef struct { char filename[512]; struct defchunk * defs; struct defchunk * current; //struct worker_def * deflist; //int num_defs; //int defs_storage; struct company * companylist; int num_companies; int companies_storage; int refcount; VIS_CRITICAL_SECTION(lock) } program; #endif typedef struct { unsigned int len; void * data; } generic_data; typedef struct { int num_a; int num_b; } two_ints; //New datum structure typedef struct { //unsigned short type; struct company * company; unsigned char union_type; union { generic_data generic; two_ints integers; double real; } c; int ref_count; VIS_CRITICAL_SECTION(lock) } datum; #define DATUMS_PER_STORAGE 512 typedef struct datum_storage { datum datums[DATUMS_PER_STORAGE]; unsigned short available; unsigned char inuse[DATUMS_PER_STORAGE/8]; int num; struct datum_storage * next; } datum_storage; #define CHECK_INUSE(storage, index, subindex) ((storage->inuse[index]) & (1 << (subindex))) #define SET_INUSE(storage, index) (storage->inuse[index >> 3] |= (1 << (index & 7))) #define CLEAR_INUSE(storage, index) (storage->inuse[index >> 3] &= ~(1 << (index & 7))) datum * new_datum(unsigned short type, unsigned char union_type, int generic_len, program * prog); datum * add_ref(datum * adatum); void release_ref(datum * adatum); void datum_set_yesno(datum * adatum, int val); void init_datum_storage(); datum * copy_datum(datum * adatum, int newsize); #ifdef CPLUSPLUS } #endif #define DATUM_YES 1 #define DATUM_NO 0 #ifdef GUI_LIB #define BUILTIN_TYPE_SCREEN_CUSTOM 17 #define BUILTIN_TYPE_CUSTOM_WIDGET 16 #define BUILTIN_TYPE_CHECKBOX 20 #define BUILTIN_TYPE_DROPDOWN 21 #ifdef SYLLABLE #define USER_DEFINED_TYPES 22 #define BUILTIN_TYPE_BLUEPRINT 19 #define BUILTIN_TYPE_BUFFER 18 #else #define USER_DEFINED_TYPES 18 #define BUILTIN_TYPE_BLUEPRINT 17 #define BUILTIN_TYPE_BUFFER 16 #endif #define BUILTIN_TYPE_PROGRAM 15 #define BUILTIN_TYPE_GLOBAL_STORE 14 #define BUILTIN_TYPE_NETCLIENT 13 #else #ifdef SEGA #define USER_DEFINED_TYPES 12 #define BUILTIN_TYPE_BLUEPRINT 11 #define BUILTIN_TYPE_BUFFER 10 #define BUILTIN_TYPE_PROGRAM 9 #define BUILTIN_TYPE_GLOBAL_STORE 8 #else #ifdef NO_NET #define USER_DEFINED_TYPES 13 #define BUILTIN_TYPE_BLUEPRINT 12 #define BUILTIN_TYPE_BUFFER 11 #define BUILTIN_TYPE_PROGRAM 10 #define BUILTIN_TYPE_GLOBAL_STORE 9 #else #define USER_DEFINED_TYPES 14 #define BUILTIN_TYPE_BLUEPRINT 13 #define BUILTIN_TYPE_BUFFER 12 #define BUILTIN_TYPE_PROGRAM 11 #define BUILTIN_TYPE_GLOBAL_STORE 10 #endif #endif #define BUILTIN_TYPE_NETCLIENT 9 #endif #define BUILTIN_TYPE_INPUTBOX 12 #define BUILTIN_TYPE_BUTTON 11 #define BUILTIN_TYPE_WINDOW_SHOWN 10 #define BUILTIN_TYPE_WINDOW 9 #ifdef SEGA #define BUILTIN_TYPE_WORKER 7 #else #define BUILTIN_TYPE_WORKER 8 #endif //SEGA #define BUILTIN_TYPE_FILE 7 #define BUILTIN_TYPE_DICT 6 #define BUILTIN_TYPE_LIST 5 #define BUILTIN_TYPE_REAL 4 #define BUILTIN_TYPE_WHOLE 3 #define BUILTIN_TYPE_STRING 2 #define BUILTIN_TYPE_YESNO 1 #define ANY_TYPE 0 #endif //_DATUM_H_