home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum16.lzh / SOFTWARE / ASSEMBLER / EXIT_HANDLER / pmlib.a < prev    next >
Text File  |  1991-01-09  |  3KB  |  186 lines

  1. ******************************************************************
  2. **
  3. **   POST-MORTEM LIBRARY
  4. **   Links to UAcct trap to perform actions on process exit
  5. **
  6. **---
  7. ** Edition history
  8. **  #   Date    Changes made                                    by
  9. ** -- -------- ------------------------------------------------ --
  10. ** 00 89-06-01 first edition                                    am 
  11. ** 01 89-08-02 adding pm_munlink                                am 
  12. ** 02 89-08-28 adding pm_install and pm_remove                  am 
  13. **---
  14.  
  15.     psect    pmlib_a,0,0,0,0,0
  16.     ttl    Post Mortem library
  17.  
  18.     use    condor.m
  19.     use    uacct.d
  20.  
  21. *---
  22. * POST MORTEM KILL
  23. * pm_kill (int pid, short signal)
  24. *
  25. * Send signal to a process on exit
  26. *
  27. pm_kill:    equ    *
  28.     regsave    d1,d2
  29. *
  30.     link    a5,#0
  31.     movem.l    d1-d2,-(sp)
  32.     swap    d1
  33.     move.w    d0,d1            save pid
  34.     bsr.s    get_time_forked
  35.     bmi.s    pk99            exit on error
  36.     pea    exh_kill(pc)
  37.     bsr    exh_link
  38. pk99    movem.l    reglist(a5),d1-d2
  39.     unlk    a5
  40.     rts
  41.  
  42. exh_kill    equ    *
  43.     regsave    d1,d2
  44. *
  45.     link    a5,#0
  46.     movem.l    d1-d2,-(sp)
  47.     move.l    d0,d2            save time forked
  48.     bsr.s    get_time_forked
  49.     bmi.s    ek99            exit on error
  50.     cmp.l    d0,d2            compare time forked
  51.     bne.s    ek99            exit if different
  52.     move.w    d1,d0            get pid
  53.     swap    d1            get signal
  54.     os9    F$Send
  55. ek99    movem.l    reglist(a5),d1-d2
  56.     unlk    a5
  57.     rts
  58.  
  59. get_time_forked    equ    *
  60.     movem.l    d1-d3/a0,-(a7)
  61.     clr.l    d3
  62.     move.w    d1,d3
  63.     move.w    #D_PrcDBT,d0        process descriptor table pointer
  64.     moveq    #4,d1            select longword
  65.     bset    #31,d1            examine
  66.     os9    F$SetSys
  67.     move.l    d2,a0
  68.     lsl.l    #2,d3            pid * 4
  69.     move.l    (a0,d3),d2        get process descriptor pointer
  70.     bne.s    gtf90            does not exist
  71.     move.w    #E$IPrcID,errno(a6)
  72.     moveq    #-1,d0            exit with error
  73.     bra.s    gtf99
  74. gtf90    move.l    d2,a0
  75.     move.l    P$TimBeg(a0),d0
  76. gtf99    movem.l    (sp)+,d1-d3/a0
  77.     rts
  78.  
  79. *---
  80. * POST MORTEM MODULE UNLINK
  81. * pm_munlink (mod_exec *module)
  82. *
  83. * Unlink from a module on exit
  84. *
  85. pm_munlink:    equ    *
  86. *
  87.     link    a5,#0
  88.     pea    exh_munlink(pc)
  89.     bsr.s    exh_link
  90.     unlk    a5
  91.     rts
  92.  
  93. exh_munlink    equ    *
  94.     regsave    a2
  95. *
  96.     link    a5,#0
  97.     movem.l    a2,-(sp)
  98.     move.l    d0,a2            address of module header
  99.     os9    F$UnLink
  100.     movem.l    reglist(a5),a2
  101.     unlk    a5
  102.     rts
  103.  
  104. *---
  105. * POST MORTEM INSTALL HANDLER
  106. * exh_qentry *pm_install ((*void)() routine, int par1, int par2)
  107. *
  108. * Install handler
  109. *
  110. pm_install:    equ    *
  111.     regsave    d1
  112.     param    par2
  113. *
  114.     link    a5,#0
  115.     movem.l    d1,-(a7)
  116.     move.l    d0,-(a7)
  117.     move.l    d1,d0
  118.     move.l    par2(a5),d1
  119.     bsr.s    exh_link
  120.     movem.l    reglist(a5),d1
  121.     unlk    a5
  122.     rts     
  123.  
  124. *---
  125. * POST MORTEM DEINSTALL HANDLER
  126. * pm_remove (exh_qentry *entry)
  127. *
  128. * Deinstall handler
  129. *
  130. pm_remove:    equ    *
  131. *
  132.     link    a5,#0
  133.     bsr.s    exh_unlink
  134.     unlk    a5
  135.     rts     
  136.  
  137. *---
  138. * LINK TO EXIT HANDLER
  139. * exh_link (arg1, arg2, routine);
  140. *
  141. exh_link    equ    *
  142.     regsave    d1,a1            d0 is saved but not restored
  143.     param    routine
  144. *
  145.     link    a5,#0
  146.     movem.l    d0/d1/a1,-(a7)
  147.     moveq    #Exh_QEntry,d0
  148.     move.w    #E$NoRAM,d1        preset error
  149.     bsr    malloc            allocate memory
  150.     tst.l    d0
  151.     beq.s    el99
  152.     move.l    d0,a1
  153.     move.l    a6,Exh_a6(a1)
  154.     move.l    (a7),Exh_d0(a1)
  155.     move.l    4(a7),Exh_d1(a1)
  156.     move.l    routine(a5),Exh_Entry(a1)
  157.     os9    F$ExhLnk
  158.     bcc.s    el99
  159. el90    moveq    #-1,d0
  160.     move.l    d1,errno(a6)
  161. el99    movem.l    reglist(a5),d1/a1
  162.     unlk    a5
  163.     rts     
  164.  
  165. *---
  166. * UNLINK FROM EXIT HANDLER
  167. * exh_unlink (entry);
  168. *
  169. exh_unlink    equ    *
  170.     regsave    d1,a1
  171. *
  172.     link    a5,#0
  173.     movem.l    d1/a1,-(a7)
  174.     move.l    d0,a1
  175.     os9    F$ExhUlk
  176.     bcs.s    eu90
  177.     bsr    free            free memory
  178.     bra.s    eu99
  179. eu90    moveq    #-1,d0
  180.     move.l    d1,errno(a6)
  181. eu99    movem.l    reglist(a5),d1/a1
  182.     unlk    a5
  183.     rts     
  184.  
  185.     ends
  186.