According to the submitter, POSIX mandates that all interval timers are
reset in a child process after a fork(). Currently, however, only the real timer is cleared while the virtual and profiling timers are inherited. The realtimer is cleared because it lives directly in struct proc in p_realtimer. It is in the zero'd section of struct proc. The other timers live in the p_timer[] array in struct pstats. These timers are copied on fork() rather than zero'd. The fix is to move p_timer[] to the zero'd part of struct pstats so that they are zero'd instead of copied on fork(). Note: Since at least FreeBSD 2.0 (and possibly earlier) we've had storage for two real interval timers. Now that the uarea is less important, perhaps we could move all of p_timer[] over to struct proc and drop the p_realtimer special case to fix that. PR: kern/58647 Reported by: Dan Nelson <dnelson@allantgroup.com> MFC after: 1 week
This commit is contained in:
parent
ba29587a94
commit
6ed78687ed
@ -52,11 +52,10 @@ struct pstats {
|
||||
#define pstat_startzero p_ru
|
||||
struct rusage p_ru; /* stats for this proc */
|
||||
struct rusage p_cru; /* sum of stats for reaped children */
|
||||
struct itimerval p_timer[3]; /* virtual-time timers */
|
||||
#define pstat_endzero pstat_startcopy
|
||||
|
||||
#define pstat_startcopy p_timer
|
||||
struct itimerval p_timer[3]; /* virtual-time timers */
|
||||
|
||||
#define pstat_startcopy p_prof
|
||||
struct uprof { /* profile arguments */
|
||||
caddr_t pr_base; /* buffer base */
|
||||
u_long pr_size; /* buffer size */
|
||||
|
Loading…
x
Reference in New Issue
Block a user