Annotation of researchv9/jtools/src/pi/v9proc.c, revision 1.1

1.1     ! root        1: #include "univ.h"
        !             2: #include "process.pri"
        !             3: #include "sigmask.h"
        !             4: #include "hostcore.h"
        !             5: #include "expr.pub"
        !             6: #include "master.pub"
        !             7: #include "bpts.pri"
        !             8: #include "frame.pri"
        !             9: #include "memory.pub"
        !            10: #include "symtab.pub"
        !            11: #include "symbol.h"
        !            12: #include "srcdir.h"
        !            13: #include "asm.pub"
        !            14: #include <CC/stdio.h>
        !            15: SRCFILE("hostproc.c")
        !            16: 
        !            17: void HostProcess::takeover()
        !            18: {
        !            19:        trace("%d.takeover()", this);                   VOK;
        !            20:        if( pad ){
        !            21:                open();
        !            22:                insert(ERRORKEY, "take over: already open");
        !            23:                return;
        !            24:        }
        !            25:        Pick( "take over", (Action)&HostProcess::substitute, (long) this );
        !            26: }
        !            27: 
        !            28: void HostProcess::reopendump()
        !            29: {
        !            30:        char *error;
        !            31: 
        !            32:        trace( "%d.reopendump(%d)", this );             VOK;
        !            33:        insert(ERRORKEY, 0);
        !            34:        if( error = core->reopen(procpath, stabpath) ){
        !            35:                insert(ERRORKEY, error);
        !            36:                return;
        !            37:        }
        !            38:        docycle();
        !            39: }
        !            40: 
        !            41: void HostProcess::substitute(HostProcess *t)
        !            42: {
        !            43:        char *error, *oldprocpath, *oldstabpath, *oldcomment;
        !            44: 
        !            45:        trace( "%d.substitute(%d)", this, t );          VOK;
        !            46:        insert(ERRORKEY, 0);
        !            47:        if( !core ){
        !            48:                insert(ERRORKEY, "that ought to work - but it doesn't");
        !            49:                return;
        !            50:        }
        !            51:        if( !core->online() ){
        !            52:                insert(ERRORKEY, "cannot take over a coredump");
        !            53:                return;
        !            54:        }
        !            55:        _bpts->lift();
        !            56:        if( error = core->reopen(t->procpath, t->stabpath) ){
        !            57:                _bpts->lay();
        !            58:                insert(ERRORKEY, error);
        !            59:                return;
        !            60:        }
        !            61:                                        /*      t->kill();      */
        !            62:        oldprocpath = procpath;
        !            63:        oldstabpath = stabpath;
        !            64:        oldcomment = comment;
        !            65:        procpath = t->procpath;
        !            66:        stabpath = t->stabpath;
        !            67:        comment = t->comment;
        !            68:        master->makeproc( oldprocpath, oldstabpath, oldcomment );
        !            69:        master->insert(t);
        !            70:        master->insert(this);
        !            71:        banner();
        !            72:        if( _asm ) _asm->banner();
        !            73:        if( _bpts ) _bpts->banner();
        !            74:        if( memory ) memory->banner();
        !            75:        if( globals ) globals->banner();
        !            76:        if( sigmsk ){
        !            77:                sigmsk->banner();
        !            78:                sigmsk->updatecore();
        !            79:        }
        !            80:        if( srcdir ) srcdir->banner();
        !            81:        core->symtab()->banner();
        !            82:        pad->clear();
        !            83:        _bpts->lay();
        !            84:        docycle();
        !            85: }
        !            86: 
        !            87: int HostProcess::accept( Action a )
        !            88: {
        !            89:        trace( "%d.accept(%d)", this, a );              OK(0);
        !            90:        return a == (Action)&HostProcess::substitute;
        !            91: }
        !            92: 
        !            93: void HostProcess::imprint()
        !            94: {
        !            95:        trace( "%d.imprint()", this ); VOK;
        !            96:        char *parentpath = sf("%s%d", slashname(procpath), hostcore()->ppid() );
        !            97:        insert(ERRORKEY, "parent=%s", parentpath);
        !            98:        Process *p = master->search(parentpath);
        !            99:        if( !p ){
        !           100:                insert(ERRORKEY, "parent (%d) not opened", hostcore()->ppid());
        !           101:                return;
        !           102:        }
        !           103:        _bpts->liftparents(p->_bpts);
        !           104: }
        !           105: 
        !           106: void HostProcess::userclose()
        !           107: {
        !           108:        trace( "%d.userclose()", this );        VOK;
        !           109:        if( sigmsk ){
        !           110:                sigmsk->hostclose();
        !           111:                delete sigmsk;
        !           112:                sigmsk = 0;
        !           113:        }
        !           114:        Process::userclose();
        !           115:        Wait3();
        !           116: }
        !           117: 
        !           118: void HostProcess::open(long ischild)
        !           119: {
        !           120:        Menu m, s;
        !           121:        char *error;
        !           122: 
        !           123:        trace( "%d.open(%d)", this, ischild );  VOK;
        !           124:        Process::openpad();
        !           125:        if( core ) return;
        !           126:        insert(ERRORKEY, "Checking process and symbol table...");
        !           127:        core = (Core*) new HostCore(this, master);
        !           128:        if( error = core->open() ){
        !           129:                delete core;
        !           130:                core = 0;
        !           131:                if( ischild )
        !           132:                        m.last( "open child", (Action)&HostProcess::open, 1 );
        !           133:                else
        !           134:                        m.last( "open process", (Action)&HostProcess::open, 0 );
        !           135:                pad->menu( m );
        !           136:                insert(ERRORKEY, error);
        !           137:                return;
        !           138:        }
        !           139:        insert(ERRORKEY, core->symtab()->warn());
        !           140:        globals = new Globals(core);
        !           141:        _asm = core->newAsm();
        !           142:        if( core->online() ){
        !           143:                m.last( "stop", (Action)&HostProcess::stop );
        !           144:                m.last( "run",  (Action)&Process::go  );
        !           145:        }
        !           146:        m.last( "src text",  (Action)&Process::srcfiles    );   /* should check */
        !           147:        m.last( "Globals",   (Action)&Process::openglobals );
        !           148:        m.last( "RawMemory", (Action)&Process::openmemory  );
        !           149:        s.last( "Assembler", (Action)&Process::openasm     );
        !           150:        s.last( "User Types",(Action)&Process::opentypes   );
        !           151:        if( core->online() ){
        !           152:                s.last("Journal", (Action)&Process::openjournal);
        !           153:                s.last("Signals", (Action)&HostProcess::opensigmask);
        !           154:                s.last("Bpt List", (Action)&HostProcess::openbpts);
        !           155:                _bpts = new Bpts(core);
        !           156:                _bpts->lay();
        !           157:                if( ischild ) imprint();
        !           158:                sigmsk = new SigMask(hostcore());
        !           159:                m.last("kill?",   (Action)&HostProcess::destroy     );
        !           160:        }
        !           161:        m.last(s.index("more"));
        !           162:        pad->menu(m);
        !           163:        pad->makecurrent();
        !           164:        docycle();
        !           165: }
        !           166: 
        !           167: char *UnixStateName(int s)
        !           168: {
        !           169:        switch( s ){
        !           170:                case 0:         return "process access error";
        !           171:                case SSLEEP:    return "sleeping";
        !           172:                case SWAIT:     return "p_stat=SWAIT";
        !           173:                case SRUN:      return "running";
        !           174:                case SIDL:      return "p_stat=SIDL";
        !           175:                case SZOMB:     return "p_stat=SZOMB";
        !           176:                case SSTOP:     return "stopped";
        !           177:                default:        return  Name( "p_stat=%d", s );
        !           178:        }
        !           179: }
        !           180: 
        !           181: void HostProcess::opensigmask()
        !           182: {
        !           183:        trace( "%d.opensigmask()", this );      VOK;
        !           184:        if( sigmsk ) sigmsk->open();
        !           185: }
        !           186: 
        !           187: void HostProcess::destroy()
        !           188: {
        !           189:        trace( "%d.destroy()", this );          VOK;
        !           190: 
        !           191:        IF_LIVE( !core->online() ) return;
        !           192:        insert(ERRORKEY, core->destroy());
        !           193:        docycle();
        !           194: }
        !           195: 
        !           196: void HostProcess::stop()
        !           197: {
        !           198:        trace( "%d.stop()", this );             VOK;
        !           199: 
        !           200:        IF_LIVE( !core->online() ) return;
        !           201:        if( !(sigmsk->mask&sigmsk->bit(SIGSTOP)) ) sigmsk->setsig(SIGSTOP);
        !           202:        Process::stop();
        !           203: }
        !           204: 
        !           205: Index HostProcess::carte()
        !           206: {
        !           207:        Menu m;
        !           208:        trace( "%d.carte(%d)", this ); OK(ZIndex);
        !           209:        if( !strcmp(procpath,"!") ){
        !           210:                m.last( "hang & open proc", (Action)&HostProcess::hangopen );
        !           211:                m.last( "hang & take over", (Action)&HostProcess::hangtakeover );
        !           212:        } else if( !strcmp(basename(procpath), "core") )
        !           213:                m.last( "open coredump",(Action)&HostProcess::open );
        !           214:        else {
        !           215:                m.last( "open process",  (Action)&HostProcess::open, 0 );
        !           216:                m.last( "take over",    (Action)&HostProcess::takeover );
        !           217:                m.last( "open child", (Action)&HostProcess::open, 1 );
        !           218:        }
        !           219:        return m.index();
        !           220: }
        !           221: 
        !           222: void HostProcess::hang()
        !           223: {
        !           224:        trace( "%d.hang(%s)", this ); VOK;
        !           225:        int pid = ::fork();
        !           226:        if( !pid ){
        !           227:                int fd;
        !           228:                for( fd = 0; fd < _NFILE; ++fd ) ::close(fd);
        !           229:                ::open("/dev/null", 2);
        !           230:                ::dup2(0, 1);
        !           231:                ::dup2(0, 2);
        !           232:                ::setpgrp(::getpid(), ::getpid());
        !           233:                ::execl("/bin/sh","sh","-c",sf("exec hang %s",stabpath),0);
        !           234:                ::exit(0);
        !           235:        }               
        !           236:        procpath = sf("/proc/%05d", pid);
        !           237:        master->makeproc("!", stabpath);
        !           238:        master->insert(this);
        !           239:        comment = stabpath;
        !           240:        stabpath = 0;
        !           241:        WaitForExecHang(procpath);
        !           242: }
        !           243: 
        !           244: void HostProcess::hangopen()
        !           245: {
        !           246:        trace( "%d.hangopen()", this ); VOK;
        !           247:        hang();
        !           248:        open();
        !           249: }
        !           250: 
        !           251: void HostProcess::hangtakeover()
        !           252: {
        !           253:        trace( "%d.hangtakeover()", this ); VOK;
        !           254:        hang();
        !           255:        takeover();
        !           256: }

unix.superglobalmegacorp.com

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