mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-01-11 23:53:34 +00:00
57 lines
1.9 KiB
Plaintext
57 lines
1.9 KiB
Plaintext
bne 3f / no
|
|
asr r2 / yes, it is a parent
|
|
cmpb p.stat-1(r2),$3 / is the child of this dying process a
|
|
/ zombie
|
|
bne 2f / no
|
|
clrb p.stat-1(r2) / yes, free the child process
|
|
2:
|
|
asl r2
|
|
3: / search the process name table for the dying process's parent
|
|
cmp p.pid-2(r2),r4 / found it?
|
|
bne 3f / no
|
|
mov r2,r5 / yes, put index to p.pid table (parents
|
|
/ process # x2) in r5
|
|
3:
|
|
cmp r2,$nproc+nproc / has whole table been searched?
|
|
blt 1b / no, go back
|
|
mov r5,r1 / yes, r1 now has parents process # x2
|
|
beq 2f / no parent has been found. The process just dies
|
|
asr r1 / set up index to p.stat
|
|
movb p.stat-1(r1),r2 / move status of parent to r2
|
|
beq 2f / if its been freed, 2f
|
|
cmp r2,$3 / is parent a zombie?
|
|
beq 2f / yes, 2f
|
|
movb u.uno,r3 / move dying process's number to r3
|
|
movb $3,p.stat-1(r3) / make the process a zombie
|
|
cmp r2,$2 / is the parent waiting for this child to die
|
|
bne 2f / yes, notify parent not to wait any more
|
|
decb p.stat-1(r1) / awaken it by putting it (parent)
|
|
mov $runq+4,r2 / on the runq
|
|
jsr r0, putlu
|
|
2: / the process dies
|
|
clrb u.uno / put zero as the process number, so "swap" will
|
|
jsr r0,swap / overwrite process with another process
|
|
0 / and thereby kill it; halt?
|
|
|
|
intract: / interrupt action
|
|
cmp *(sp),$rti / are you in a clock interrupt?
|
|
bne 1f / no, 1f
|
|
cmp (sp)+,(sp)+ / pop clock pointer
|
|
1: / now in user area
|
|
mov r1,-(sp) / save r1
|
|
mov u.ttyp,r1 / pointer to tty buffer in control-to r1
|
|
cmpb 6(r1),$177 / is the interrupt char equal to "del"
|
|
beq 1f / yes, 1f
|
|
clrb 6(r1) / no, clear the byte (must be a quit character)
|
|
mov (sp)+,r1 / restore r1
|
|
clr u.quit / clear quit flag
|
|
bis $20,2(sp) / set trace for quit (sets t bit of ps-trace trap)
|
|
rti / return from interrupt
|
|
1: / interrupt char = del
|
|
clrb 6(r1) / clear the interrupt byte in the buffer
|
|
mov (sp)+,r1 / restore r1
|
|
cmp u.intr,$core / should control be transferred to loc core?
|
|
blo 1f
|
|
jmp *u.intr / user to do rti yes, transfer to loc core
|
|
1:
|