Annotation of researchv9/jtools/src/pads/host/libC.c, revision 1.1

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() {}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.