This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Use "|" instead of "+" when combine the _IO_LINE_BUF and _IO_UNBUFFERED flags


Hi Siddhesh,

Firstly, sorry about that I forget fixing the last space issue. Maybe
I was very tried when it was very late in the night.

Now the attachment "file_flags.diff" is the latest change which fix
the issue you mentioned.
The "test_flag.c" is the test codes to check the flag value.
The "test_buf.c" is the test codes to test if the setbuf of libc works well.

The following are the tests I did:
1. Run the test_flag.c on 32-bits and 64-bits platform, the output is "Equal".
    It means (_IO_UNBUFFERED | _IO_LINE_BUF) has the same value of
(_IO_UNBUFFERED + _IO_LINE_BUF);
2. After update the glibc, gdb the test_buf.c to check if the setbuf
works well like before.
    Because i am using the glibc-2.19 on my linux, so I apply my patch
to glibc-2.19, build and replace the original one. ( I am afraid my
computer become brick:))
    Then gdb the binary of test_buf.c to check if the setbuf works
well like before.
Breakpoint 1, main () at test_buf.c:23
23      {
(gdb) n
26              printf("Before no-buffer.");
(gdb)
27              printf("Output now.\n");
(gdb)
Before no-buffer.Output now.
29              setbuf(stdout, NULL);
(gdb)
30              printf("No buffer now.");
(gdb)
No buffer now.32                setvbuf(stdout, buffer, _IOLBF, sizeof(buffer));
(gdb)
33              printf("Restore linebuf.");
(gdb)
34              printf("Output now.\n");
(gdb)
Restore linebuf.Output now.
36              return 0;

The output is the right behavior we expect.

3. I doesn't execute the "make check". Because it will hang without my
patch. So I could not do "make check" with my patch.
I don't know if there already is one bug in the current glibc codes.

It stop the following step for about 2 hours, so I have to cancel it.

        scripts/evaluate-test.sh c++-types-check $? false false >
/home/fgao/works/my_git_codes/glibc-build/c++-types-check.test-result
AWK='gawk' scripts/check-local-headers.sh \
          "/usr/include" "/home/fgao/works/my_git_codes/glibc-build/"
> /home/fgao/works/my_git_codes/glibc-build/check-local-headers.out; \
        scripts/evaluate-test.sh check-local-headers $? false false >
/home/fgao/works/my_git_codes/glibc-build/check-local-headers.test-result

That's why I did not execute the "make check" with my change.



















On Wed, Jul 8, 2015 at 12:28 AM, Siddhesh Poyarekar <siddhesh@redhat.com> wrote:
> On Wed, Jul 08, 2015 at 12:02:38AM +0800, Feng Gao wrote:
>> About the tests, I did the following cases:
>> 1. Write test codes to check if the (_IO_LINE_BUF|_IO_UNBUFFERED)
>> equals  (_IO_LINE_BUF+_IO_UNBUFFERED);
>> 2. Update the glibc to check if it works like before.
>
> Thanks, it looks like you missed fixing spacing in the last instance
> (quoted below).  Also, run 'make check' before and after the patch to
> make sure that there are no regressions due to this change.  Updating
> glibc is a brave thing to do - if it breaks, your box is a brick that
> only a rescue disk can get back :)
>
> Please post an updated patch and also let me know the results of your
> test.
>
> Thanks,
> Siddhesh
>
>> @@ -477,7 +477,7 @@ _IO_wfile_overflow (_IO_FILE *f, wint_t wch)
>>        f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end;
>>
>>        f->_flags |= _IO_CURRENTLY_PUTTING;
>> -      if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED))
>> +      if (f->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED))
>>       f->_wide_data->_IO_write_end = f->_wide_data->_IO_write_ptr;
>>      }
>>    if (wch == WEOF)
>

Attachment: file_flags.diff
Description: Text document

/*
 * =====================================================================================
 *
 *       Filename:  test.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  07/07/2015 11:14:49 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *        Company:  
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <stdio.h>

#define _IO_UNBUFFERED 2
#define _IO_LINE_BUF 0x200

int main(void)
{
	if ((_IO_UNBUFFERED + _IO_LINE_BUF) == (_IO_UNBUFFERED | _IO_LINE_BUF)) {
		printf("Equal\n");
	} else {
		printf("Not equal\n");
	}

	return 0;
}
/*
 * =====================================================================================
 *
 *       Filename:  test_buf.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  07/08/2015 10:43:01 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *        Company:  
 *
 * =====================================================================================
 */
#include <stdlib.h>
#include <stdio.h>


int main(void)
{
	char buffer[256];

	printf("Before no-buffer.");
	printf("Output now.\n");

	setbuf(stdout, NULL);
	printf("No buffer now.");

	setvbuf(stdout, buffer, _IOLBF, sizeof(buffer));
	printf("Restore linebuf.");
	printf("Output now.\n");

	return 0;
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]