On Mon, Jan 26, 2015 at 6:13 PM, Tim Hentenaar <t...@hentenaar.com> wrote:
> Hi Denys,
>
> On Sun, Jan 25, 2015 at 09:58:50PM +0100, Denys Vlasenko wrote:
>> I don't understand why current code does not reach write_leases().
>> If tv.tv_sec is negative, we should not reach select() here -
>>
>>                 retval = 0;
>>                 if (!server_config.auto_time || tv.tv_sec > 0) {
>>                         retval = select(max_sock + 1, &rfds, NULL, NULL,
>>                                         server_config.auto_time ? &tv : 
>> NULL);
>>                 }
>>                 if (retval == 0) {
>>                         write_leases();
>>                         goto continue_with_autotime;
>>                 }
>>
>> and therefore, retval == 0 and we should reach write_leases().
>>
>> What am I missing?
>
> I wondered the same thing at first. Here's the relevent code as
> generated by GCC. Interestingly, the "tv_sec > 0" check seems to get
> optimized out (I'm compiling with -O2), and select() gets called as long
> as tv_sec is non-zero. Looks almost as if it's treating tv_sec as
> unsigned...

Can't be, "v > 0" is a valid test even for unsigned types.

>
> In my .config, I've got:
>
>   CONFIG_EXTRA_CFLAGS="-O2 -fPIE -pie"
>
> Code generated with -O2:
>         ; bb_common_bufsiz1+0x34 = server_config.auto_time -> %r15d
>    177d7:       44 8b 3d 96 ec 26 00    mov    0x26ec96(%rip),%r15d
>    177de:       89 c3                   mov    %eax,%ebx
>    177e0:       45 85 ff                test   %r15d,%r15d
>    177e3:       75 26                   jne    1780b <udhcpd_main+0x30b>
>
>    ; if (!server_config.auto_time) { select(...); }
>    177e5:       45 31 c0                xor    %r8d,%r8d
>    177e8:       48 8b b5 60 fc ff ff    mov    -0x3a0(%rbp),%rsi
>    177ef:       8d 7b 01                lea    0x1(%rbx),%edi
>    177f2:       31 c9                   xor    %ecx,%ecx
>    177f4:       31 d2                   xor    %edx,%edx
>    177f6:       e8 b5 08 ff ff          callq  80b0 <select@plt>


Can you run "make networking/udhcp/dhcpd.s" and post the resulting file?
I'm seeing this code with gcc 4.3.1:

        call    udhcp_sp_fd_set #
        movl    %eax, %ebx      #, max_sock
        cmpl    $0, bb_common_bufsiz1+44        #, <variable>.auto_time
        je      .L61    #,
        call    monotonic_sec   #
        movl    12(%esp), %edx  # timeout_end,
        subl    %eax, %edx      # D.7265,
        movl    %edx, 816(%esp) # tmp124, tv.tv_sec
        movl    $0, 820(%esp)   #, tv.tv_usec
.L61:
        xorl    %eax, %eax      # iftmp.50
        cmpl    $0, bb_common_bufsiz1+44        #, <variable>.auto_time
        je      .L63    #,
        cmpl    $0, 816(%esp)   #, tv.tv_sec
        jle     .L64    #,
        leal    816(%esp), %eax #, iftmp.50
.L63:
        pushl   %eax    # iftmp.50
        pushl   $0      #
        pushl   $0      #
        leal    664(%esp), %eax #, tmp125
        pushl   %eax    # tmp125
        leal    1(%ebx), %eax   #, tmp126
        pushl   %eax    # tmp126
        call    select  #
        addl    $20, %esp       #,
        cmpl    $0, %eax        #, retval.323
        jne     .L65    #,
.L64:
        call    write_leases    #
        jmp     .L102   #
.L65:
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to