GCC 3.4.3, __sync_fetch_and_add on SunOS 5.10 sparc

a b <[email protected]>
Newsgroups gmane.network.dns.powerdns.devel
Message-ID <[email protected]>
GCC 3.4.3 is the default compiler which ships with Solaris 10 (SunOS 5.10).This compiler compiles pdns-3.1 with a couple of patches here and there more or less fine on the i86pc platform (32- and 64-bit x86).
However, on sparc, the compilation fails because GCC 3.4.3 does not include the __sync_fetch_and_add() function (macro?).
On i86pc, the compilation passes because of this bit of code:
    // the below is necessary because __sync_fetch_and_add is not universally available on i386.. I 3> RHEL5.    #if defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )    static int atomic_exchange_and_add( unsigned int * pw, int dv )    {        // int r = *pw;        // *pw += dv;        // return r;
        int r;
        __asm__ __volatile__        (            "lock\n\t"            "xadd %1, %0":            "+m"( *pw ), "=r"( r ): // outputs (%0, %1)            "1"( dv ): // inputs (%2 == %1)            "memory", "cc" // clobbers        );
        return r;    }
Obviously, the x86 assembler bit cannot work on sparc, and since the __sync_fetch_and_add() is unavailable, it fails.
My "fix" for that was this:
    #else    static int atomic_exchange_and_add( unsigned int * pw, int dv )    {      #if(((__GNUC__ == 3) && (__GNUC_MINOR__ == 4) && (__GNUC_PATCHLEVEL__ == 3)) && defined(__sparc__))      int r = *pw;      *pw += dv;      return(r);      #else      return __sync_fetch_and_add(pw, dv);      #endif    }    #endif
But I do not trust myself to have fully understood the code and the intent. Can someone who has worked on this code confirm or deny that this is a sane fix?

_______________________________________________
Pdns-dev mailing list
[email protected]
http://mailman.powerdns.com/mailman/listinfo/pdns-dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.