|
|
1.1 ! root 1: //#define A_LARGE 64 ! 2: //#define A_USER 0x55000000 ! 3: // ! 4: //void PadsError(char* ...); ! 5: // ! 6: //enum Event { POOL=0, ALLOC=1, FREE=2, EVENT=3 }; ! 7: // ! 8: //#define log(e, u, d) { event[u][e] += d; } ! 9: // ! 10: //class Allocator { ! 11: // union M { ! 12: // long size; ! 13: // M *link; ! 14: // }; ! 15: // M *freelist[A_LARGE]; ! 16: // long req[A_LARGE]; ! 17: // long event[A_LARGE][EVENT]; ! 18: //public: ! 19: // void *alloc(long); ! 20: // void free(void*); ! 21: // char *profile(long); ! 22: // ! 23: //}; ! 24: // ! 25: //Allocator NewDel; ! 26: // ! 27: //char *Allocator.profile(long u) ! 28: //{ ! 29: // static char report[64]; ! 30: // long p = event[u][POOL], a = event[u][ALLOC], f = event[u][FREE]; ! 31: // ! 32: // if( u >= A_LARGE ) return 0; ! 33: // if( !(p|a|f) ) return ""; ! 34: // u = u ? (u-1)*sizeof(M) : 0; ! 35: // sprintf(report, "size=%3d: pool=%4d new=%4d del=%4d tot=%8d", ! 36: // u, p, a, f, (u+4)*p); ! 37: // return report; ! 38: //} ! 39: // ! 40: //void *Allocator.alloc(register long u) ! 41: //{ ! 42: // M *malloc(long); ! 43: // register M *m; ! 44: // register r; ! 45: // ! 46: // if( u <= 0 ) PadsError( "Allocator.alloc(%d)", u ); ! 47: // u = ((u-1)/sizeof(M)) + 2; ! 48: // if( u >= A_LARGE ){ ! 49: // log(ALLOC,0,u*sizeof(M)); ! 50: // m = malloc(u*sizeof(M)); ! 51: // if( !m ) PadsError("host out of memory"); ! 52: // } else { ! 53: // if( !freelist[u] ){ ! 54: // if( req[u] == 0 ) req[u] = 1; ! 55: // r = req[u]; ! 56: // if( req[u] < 256 ) req[u] *= 2; ! 57: // log(POOL,u,r); ! 58: // freelist[u] = malloc(r*u*sizeof(M)); ! 59: // if( !freelist[u] ) PadsError("host out of memory"); ! 60: // for( m = freelist[u]; --r > 0; m = m->link = m+u ); ! 61: // m->link = 0; ! 62: // } ! 63: // log(ALLOC,u,1); ! 64: // m = freelist[u]; ! 65: // freelist[u] = m->link; ! 66: // } ! 67: // m->size = u|A_USER; ! 68: // for( r = 1; r < u; ) ! 69: // (&m->size)[r++] = 0; ! 70: // return m+1; ! 71: //} ! 72: // ! 73: //void Allocator.free(void *v) ! 74: //{ ! 75: // void free(M*); ! 76: // register M* m = (M*) v; ! 77: // register long u; ! 78: // ! 79: // --m; ! 80: // if( (m->size&0xFF000000) != A_USER ) PadsError( "delete error" ); ! 81: // u = (m->size &= 0xFFFFFF); ! 82: // if( u >= A_LARGE ){ ! 83: // log(FREE,0,u*sizeof(M)); ! 84: // ::free(m); ! 85: // } ! 86: // else { ! 87: // log(FREE,u,1); ! 88: // m->link = freelist[u]; ! 89: // freelist[u] = m; ! 90: // } ! 91: //} ! 92: ! 93: typedef void* PV; ! 94: typedef void (*PF)(PV); ! 95: ! 96: void *operator new(long size) ! 97: { ! 98: void *calloc(unsigned, unsigned); ! 99: if( size<= 0 ) PadsError("new(%d)", size); ! 100: return calloc(size, 1); // NewDel.alloc(size); ! 101: } ! 102: ! 103: void operator delete(PV p) ! 104: { ! 105: void free(void*); ! 106: if(p) free(p); // NewDel.free(p); ! 107: } ! 108: ! 109: PV _vec_new(PV op, int n, int sz, PV f) ! 110: { ! 111: register int i; ! 112: register char* p; ! 113: if (op == 0) op = PV( new char[n*sz] ); ! 114: p = (char*) op; ! 115: for (i=0; i<n; i++) ( *PF(f) )( PV(p+i*sz) ); ! 116: return PV(p); ! 117: } ! 118: ! 119: void _vec_delete(PV op, int n, int sz, PV f, int) // what is that last int? ! 120: { ! 121: register int i; ! 122: register char* p = (char*) op; ! 123: for (i=0; i<n; i++) ( *(PF)f )( (PV)(p+i*sz) ); ! 124: } ! 125: ! 126: extern void _main() {}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.