• K
    Portable alloca for Git · 61f76a36
    Kirill Smelkov 提交于
    In the next patch we'll have to use alloca() for performance reasons,
    but since alloca is non-standardized and is not portable, let's have a
    trick with compatibility wrappers:
    
    1. at configure time, determine, do we have working alloca() through
       alloca.h, and define
    
        #define HAVE_ALLOCA_H
    
       if yes.
    
    2. in code
    
        #ifdef HAVE_ALLOCA_H
        # include <alloca.h>
        # define xalloca(size)      (alloca(size))
        # define xalloca_free(p)    do {} while(0)
        #else
        # define xalloca(size)      (xmalloc(size))
        # define xalloca_free(p)    (free(p))
        #endif
    
       and use it like
    
       func() {
           p = xalloca(size);
           ...
    
           xalloca_free(p);
       }
    
    This way, for systems, where alloca is available, we'll have optimal
    on-stack allocations with fast executions. On the other hand, on
    systems, where alloca is not available, this gracefully fallbacks to
    xmalloc/free.
    
    Both autoconf and config.mak.uname configurations were updated. For
    autoconf, we are not bothering considering cases, when no alloca.h is
    available, but alloca() works some other way - its simply alloca.h is
    available and works or not, everything else is deep legacy.
    
    For config.mak.uname, I've tried to make my almost-sure guess for where
    alloca() is available, but since I only have access to Linux it is the
    only change I can be sure about myself, with relevant to other changed
    systems people Cc'ed.
    
    NOTE
    
    SunOS and Windows had explicit -DHAVE_ALLOCA_H in their configurations.
    I've changed that to now-common HAVE_ALLOCA_H=YesPlease which should be
    correct.
    
    Cc: Brandon Casey <drafnel@gmail.com>
    Cc: Marius Storm-Olsen <mstormo@gmail.com>
    Cc: Johannes Sixt <j6t@kdbg.org>
    Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>
    Cc: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
    Cc: Gerrit Pape <pape@smarden.org>
    Cc: Petr Salinger <Petr.Salinger@seznam.cz>
    Cc: Jonathan Nieder <jrnieder@gmail.com>
    Acked-by: Thomas Schwinge <thomas@codesourcery.com> (GNU Hurd changes)
    Signed-off-by: NKirill Smelkov <kirr@mns.spb.ru>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    61f76a36
Makefile 74.9 KB