Changeset 23272
- Timestamp:
- 06/04/07 11:26:07 (18 months ago)
- Files:
-
- 1 modified
-
trunk/launchd/src/launchd_core_logic.c (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/launchd/src/launchd_core_logic.c
r23271 r23272 341 341 currently_ignored:1, forced_peers_to_demand_mode:1, setnice:1, hopefully_exits_last:1, removal_pending:1, 342 342 wait4pipe_eof:1, sent_sigkill:1, debug_before_kill:1, weird_bootstrap:1, start_on_mount:1, 343 per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1 ;343 per_user:1, hopefully_exits_first:1, deny_unknown_mslookups:1, unload_at_mig_return:1; 344 344 const char label[0]; 345 345 }; … … 940 940 struct kinfo_proc kp; 941 941 size_t len = sizeof(kp); 942 const char *zombie = NULL; 942 943 bool shutdown_state; 943 944 job_t jp = NULL, jr = NULL; 944 945 946 if (!jobmgr_assumes(jm, anonpid != 0)) { 947 return NULL; 948 } 949 945 950 if (!jobmgr_assumes(jm, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) { 946 951 return NULL; 952 } 953 954 if (kp.kp_proc.p_stat == SZOMB) { 955 jobmgr_log(jm, LOG_DEBUG, "Tried to create an anonymous job for zombie PID: %u", anonpid); 956 zombie = "zombie"; 947 957 } 948 958 … … 967 977 } 968 978 969 if (jobmgr_assumes(jm, (jr = job_new(jm, AUTO_PICK_LEGACY_LABEL, kp.kp_proc.p_comm, NULL)) != NULL)) {979 if (jobmgr_assumes(jm, (jr = job_new(jm, AUTO_PICK_LEGACY_LABEL, zombie ? zombie : kp.kp_proc.p_comm, NULL)) != NULL)) { 970 980 u_int proc_fflags = NOTE_EXEC|NOTE_EXIT|NOTE_REAP; 971 981 … … 976 986 /* anonymous process reaping is messy */ 977 987 LIST_INSERT_HEAD(&jm->active_jobs[ACTIVE_JOB_HASH(jr->p)], jr, pid_hash_sle); 978 job_assumes(jr, kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1); 988 989 if (kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) == -1 && job_assumes(jr, errno == ESRCH)) { 990 /* zombies are weird */ 991 jr->unload_at_mig_return = true; 992 } 979 993 980 994 if (jp) { … … 986 1000 } 987 1001 988 job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u%s%s", kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : "");1002 job_log(jr, LOG_DEBUG, "Created PID %u anonymously by PPID %u%s%s", anonpid, kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : ""); 989 1003 } 990 1004 … … 1771 1785 1772 1786 void 1773 job_mig_destructor(job_t j __attribute__((unused))) 1774 { 1787 job_mig_destructor(job_t j) 1788 { 1789 if (j->unload_at_mig_return) { 1790 job_remove(j); 1791 } 1775 1792 } 1776 1793

