----- Original Message -----
> From: [email protected]
> To: "Jan Stancek" <[email protected]>
> Cc: [email protected]
> Sent: Monday, 24 June, 2013 3:22:49 PM
> Subject: Re: [LTP] [PATCH v2] new testcase: kmsg01
>
> Hi!
> > +static int timed_read_kmsg(int fd, int timeout_sec)
> > +{
> > + int child, status, ret = 0;
> > + int pipefd[2];
> > + char msg[MAX_MSGSIZE];
> > +
> > + if (pipe(pipefd) != 0)
> > + tst_brkm(TBROK|TERRNO, cleanup, "pipe failed");
> > +
> > + child = fork();
> > + switch (child) {
> > + case -1:
> > + tst_brkm(TBROK|TERRNO, cleanup, "failed to fork");
> > + case 0:
> > + /* child does all the reading and keeps writing to
> > + * pipe to let parent know that it didn't block */
> > + SAFE_CLOSE(NULL, pipefd[0]);
>
> There is a problem with calling the SAFE_ macros from child processes.
> The SAFE_ macros use tst_brkm() interface to halt program execution (in
> case of failure) which is not supposed to be used from child and may
> lead to unexpected results.
Agreed, I'll remove it.
>
> > +static void test_seek(void)
> > +{
> > + int k, j = NUM_READ_RETRY, fd;
> > + char msg[MAX_MSGSIZE];
> > + unsigned long seqno[2];
> > +
> > + /* 1. read() after SEEK_SET 0 returns same (first) message */
> > + tst_resm(TINFO, "TEST: seek SEEK_SET 0");
> > +
> > + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
> > + if (fd < 0)
> > + tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg");
> > +
> > + while (j) {
> > + for (k = 0; k < 2; k++) {
> > + TEST(read(fd, msg, sizeof(msg)));
> > + if (TEST_RETURN == -1) {
> > + if (errno == EPIPE)
> > + break;
> > + else
> > + tst_brkm(TBROK|TTERRNO, cleanup,
> > + "failed to read /dev/kmsg");
> > + }
> > + if (get_msg_fields(msg, NULL, &seqno[k]) != 0)
> > + tst_resm(TFAIL, "failed to parse seqid: %s",
> > + msg);
> > + if (k == 0)
> > + if (lseek(fd, 0, SEEK_SET) == -1)
> > + tst_resm(TFAIL|TERRNO,
> > + "SEEK_SET 0 failed");
> > + }
> > +
> > + if (TEST_RETURN != -1)
> > + break;
> > +
> > + /* give a second to whoever overwrote first message to finish */
> > + sleep(1);
> > + j--;
> > +
> > + /* read returned EPIPE, reopen fd and try again */
> > + SAFE_CLOSE(cleanup, fd);
> > + fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
> > + if (fd < 0)
> > + tst_brkm(TBROK|TERRNO, cleanup,
> > + "failed to open /dev/kmsg");
>
> I guess that the comment says something different than the code, there
> is no read involved here.
Read mentioned here is the one at the beginning of for loop. This line can only
be reached if that read returned EPIPE. Other failures will end with TBROK.
If read succeeded this line is never reached, "if (TEST_RETURN != -1)" above
will break the while loop.
Regards,
Jan
>
>
> Acked with change from SAFE_CLOSE() to close() in the child process.
>
> --
> Cyril Hrubis
> [email protected]
>
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list