Causing a process switch to test a theory.
Stephan Uphoff
ups at tree.com
Mon Mar 21 07:16:31 PST 2005
On Mon, 2005-03-21 at 09:16, Matthew Hagerty wrote:
> Zera William Holladay wrote:
>
> >If you post the section(s) of code in question, then you'll probably
> >elicit some responses. PIPE_BUF is a POSIX defined minimum, so you might
> >grep for sections of code that contain fpathconf(*, _PC_PIPE_BUF) to
> >determine if the programmers took this into consideration. At least
> >you'll be able to follow the logical flow of the program from fpathconf()
> >forward.
> >
> >Further, if you do some fancy programming (like preempting a process
> >unnaturally) to determine if there is an error in this particular aspect
> >of Apache, then you'll also have to show that you have not inflicted the
> >error too, which will probably be harder than what you set out to solve or
> >figure out.
> >
> >Good luck, Zera Holladay
> >_______________________________________________
> >freebsd-hackers at freebsd.org mailing list
> >http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> >To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> >
> >
>
> I was not wanting to preempt any of the processes unnaturally, I was
> looking more for suggestions as to how I can reliably cause preemption
> for testing. Without knowing the details of how FreeBSD's scheduler
> works, I could only assume that making a heavy load might cause such
> preemption to happen, but that is just an under educated guess.
>
> I'm not familiar with fpathconf(), I'll go look that up for sure and
> check Apache's code for it's use. Thanks!
>
> As for code, below is the portion that does to actual writing to the log
> file, opened as either a normal file or a pipe depending on the config
> file. Also note that BUFFERED_LOGS is not normally defined (must be
> passed to make at compile time), and even then it only makes sure there
> is *at least* LOG_BUFSIZE bytes to write before writing. It does not
> prevent longer than LOG_BUFSIZE bytes from being written.
>
> Matthew
>
> < SNIP -- CODE DELETED >
Why not just replace the write() call with a small test function?
There is really no need to modify the kernel for your experiments.
size_t test_pipe_write(int d, const void *buf, size_t nbytes)
{
size_t n;
size_t done=0;
while (nbytes > ATOMIC_WRITE_MAX) {
n = write(d,buf,ATOMIC_WRITE_MAX);
if (n <= 0)
return done;
buf = (char *) buf + n;
nbytes -= n;
usleep(NAP_TIME);
}
n = write(d,buf,nbytes);
if (n <= 0)
return done;
else
return n + done;
}
Stephan
More information about the freebsd-hackers
mailing list