Excellent, many thanks for this very useful contribution! I'll see that I
merge it in as quickly as possible, but it may take until early next week.
I'll probably try to merge it into v4 as well, as this is definitely useful!

Thanks again,
Rainer

> -----Original Message-----
> From: [email protected] [mailto:rsyslog-
> [email protected]] On Behalf Of Steffen Sledz
> Sent: Friday, March 19, 2010 8:01 AM
> To: rsyslog-users
> Subject: Re: [rsyslog] patch for architectures without atomic builtins
> 
> [email protected] wrote:
> > the list strips off attachments.
> >
> > can you re-send with the patch inline?
> 
> Here it is...
> 
> diff -Nurd rsyslog-5.4.0.orig/configure.ac rsyslog-5.4.0/configure.ac
> --- rsyslog-5.4.0.orig/configure.ac     2010-03-08 13:28:35.000000000
> +0000
> +++ rsyslog-5.4.0/configure.ac  2010-03-16 11:30:44.000000000 +0000
> @@ -87,6 +87,7 @@
>  AC_HEADER_TIME
>  AC_STRUCT_TM
>  AC_C_VOLATILE
> +AC_C_TYPEOF
> 
>  sa_includes="\
>  $ac_includes_default
> @@ -129,7 +130,8 @@
>  # check for availability of atomic operations
>  RS_ATOMIC_OPERATIONS
>  RS_ATOMIC_OPERATIONS_64BIT
> -
> +# fall back to POSIX sems for atomic operations (cpu expensive)
> +AC_CHECK_HEADERS([semaphore.h])
> 
>  # Additional module directories
>  AC_ARG_WITH(moddirs,
> diff -Nurd rsyslog-5.4.0.orig/runtime/Makefile.am rsyslog-
> 5.4.0/runtime/Makefile.am
> --- rsyslog-5.4.0.orig/runtime/Makefile.am      2010-03-08
> 13:27:47.000000000 +0000
> +++ rsyslog-5.4.0/runtime/Makefile.am   2010-03-15 16:43:12.000000000
> +0000
> @@ -9,6 +9,7 @@
>         rsyslog.h \
>         unicode-helper.h \
>         atomic.h \
> +       atomic-posix-sem.c \
>         batch.h \
>         syslogd-types.h \
>         module-template.h \
> diff -Nurd rsyslog-5.4.0.orig/runtime/atomic-posix-sem.c rsyslog-
> 5.4.0/runtime/atomic-posix-sem.c
> --- rsyslog-5.4.0.orig/runtime/atomic-posix-sem.c       1970-01-01
> 00:00:00.000000000 +0000
> +++ rsyslog-5.4.0/runtime/atomic-posix-sem.c    2010-03-16
> 13:22:27.000000000 +0000
> @@ -0,0 +1,70 @@
> +/* atomic_posix_sem.c: This file supplies an emulation for atomic
> operations using
> + * POSIX semaphores.
> + *
> + * Copyright 2010 DResearch Digital Media Systems GmbH
> + *
> + * This file is part of the rsyslog runtime library.
> + *
> + * The rsyslog runtime library is free software: you can redistribute
> it and/or modify
> + * it under the terms of the GNU Lesser General Public License as
> published by
> + * the Free Software Foundation, either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * The rsyslog runtime library is distributed in the hope that it will
> be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> License
> + * along with the rsyslog runtime library.  If not, see
> <http://www.gnu.org/licenses/>.
> + *
> + * A copy of the GPL can be found in the file "COPYING" in this
> distribution.
> + * A copy of the LGPL can be found in the file "COPYING.LESSER" in
> this distribution.
> + */
> +
> +#include "config.h"
> +#ifndef HAVE_ATOMIC_BUILTINS
> +#ifdef HAVE_SEMAPHORE_H
> +#include <semaphore.h>
> +#include <errno.h>
> +
> +#include "atomic.h"
> +#include "rsyslog.h"
> +#include "srUtils.h"
> +
> +sem_t atomicSem;
> +
> +rsRetVal
> +atomicSemInit(void)
> +{
> +       DEFiRet;
> +
> +       dbgprintf("init posix semaphore for atomics emulation\n");
> +       if(sem_init(&atomicSem, 0, 1) == -1)
> +       {
> +               char errStr[1024];
> +               rs_strerror_r(errno, errStr, sizeof(errStr));
> +               dbgprintf("init posix semaphore for atomics emulation
> failed: %s\n", errStr);
> +               iRet = RS_RET_SYS_ERR; /* the right error code ??? */
> +       }
> +
> +       RETiRet;
> +}
> +
> +void
> +atomicSemExit(void)
> +{
> +       dbgprintf("destroy posix semaphore for atomics emulation\n");
> +       if(sem_destroy(&atomicSem) == -1)
> +       {
> +               char errStr[1024];
> +               rs_strerror_r(errno, errStr, sizeof(errStr));
> +               dbgprintf("destroy posix semaphore for atomics
> emulation failed: %s\n", errStr);
> +       }
> +}
> +
> +#endif /* HAVE_SEMAPHORE_H */
> +#endif /* !defined(HAVE_ATOMIC_BUILTINS) */
> +
> +/* vim:set ai:
> + */
> diff -Nurd rsyslog-5.4.0.orig/runtime/atomic.h rsyslog-
> 5.4.0/runtime/atomic.h
> --- rsyslog-5.4.0.orig/runtime/atomic.h 2010-03-05 07:20:36.000000000
> +0000
> +++ rsyslog-5.4.0/runtime/atomic.h      2010-03-16 13:23:57.000000000
> +0000
> @@ -54,6 +54,122 @@
>  #      define ATOMIC_CAS(data, oldVal, newVal)
> __sync_bool_compare_and_swap(&(data), (oldVal), (newVal));
>  #      define ATOMIC_CAS_VAL(data, oldVal, newVal)
> __sync_val_compare_and_swap(&(data), (oldVal), (newVal));
>  #else
> +#ifdef HAVE_SEMAPHORE_H
> +       /* we use POSIX semaphores instead */
> +
> +#include "rsyslog.h"
> +#include <semaphore.h>
> +
> +extern sem_t atomicSem;
> +rsRetVal atomicSemInit(void);
> +void atomicSemExit(void);
> +
> +#if HAVE_TYPEOF
> +#define my_typeof(x) typeof(x)
> +#else /* sorry, can't determine types, using 'int' */
> +#define my_typeof(x) int
> +#endif
> +
> +#      define ATOMIC_SUB(data, val) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data -= val; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_ADD(data, val) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data += val; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_INC_AND_FETCH(data) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data += 1; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_INC(data) ((void) ATOMIC_INC_AND_FETCH(data))
> +
> +#      define ATOMIC_DEC_AND_FETCH(data) \
> +({ \
> +       sem_wait(&atomicSem); \
> +       data -= 1; \
> +       sem_post(&atomicSem); \
> +       data; \
> +})
> +
> +#      define ATOMIC_DEC(data) ((void) ATOMIC_DEC_AND_FETCH(data))
> +
> +#      define ATOMIC_FETCH_32BIT(data) ((unsigned) ATOMIC_ADD((data),
> 0xffffffff))
> +
> +#      define ATOMIC_STORE_1_TO_32BIT(data) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data = 1; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_STORE_0_TO_INT(data) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data = 0; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_STORE_1_TO_INT(data) \
> +({ \
> +       my_typeof(data) tmp; \
> +       sem_wait(&atomicSem); \
> +       tmp = data; \
> +       data = 1; \
> +       sem_post(&atomicSem); \
> +       tmp; \
> +})
> +
> +#      define ATOMIC_CAS(data, oldVal, newVal) \
> +({ \
> +       int ret; \
> +       sem_wait(&atomicSem); \
> +       if(data != oldVal) ret = 0; \
> +       else \
> +       { \
> +               data = newVal; \
> +               ret = 1; \
> +       } \
> +       sem_post(&atomicSem); \
> +       ret; \
> +})
> +
> +#      define ATOMIC_CAS_VAL(data, oldVal, newVal) \
> +({ \
> +       sem_wait(&atomicSem); \
> +       if(data == oldVal) \
> +       { \
> +               data = newVal; \
> +       } \
> +       sem_post(&atomicSem); \
> +       data; \
> +})
> +
> +#else /* not HAVE_SEMAPHORE_H */
>         /* note that we gained parctical proof that theoretical
> problems DO occur
>          * if we do not properly address them. See this blog post for
> details:
>          * http://blog.gerhards.net/2009/01/rsyslog-data-race-
> analysis.html
> @@ -68,5 +184,6 @@
>  #      define ATOMIC_FETCH_32BIT(data) (data)
>  #      define ATOMIC_STORE_1_TO_32BIT(data) (data) = 1
>  #endif
> +#endif
> 
>  #endif /* #ifndef INCLUDED_ATOMIC_H */
> diff -Nurd rsyslog-5.4.0.orig/runtime/rsyslog.c rsyslog-
> 5.4.0/runtime/rsyslog.c
> --- rsyslog-5.4.0.orig/runtime/rsyslog.c        2010-03-05
> 07:20:36.000000000 +0000
> +++ rsyslog-5.4.0/runtime/rsyslog.c     2010-03-16 08:30:51.000000000
> +0000
> @@ -81,6 +81,7 @@
>  #include "rule.h"
>  #include "ruleset.h"
>  #include "parser.h"
> +#include "atomic.h"
> 
>  /* forward definitions */
>  static rsRetVal dfltErrLogger(int, uchar *errMsg);
> @@ -140,6 +141,12 @@
>                 CHKiRet(objClassInit(NULL)); /* *THIS* *MUST* always be
> the first class initilizer being called! */
>                 CHKiRet(objGetObjInterface(pObjIF)); /* this provides
> the root pointer for all other queries */
> 
> +#ifndef HAVE_ATOMIC_BUILTINS
> +#ifdef HAVE_SEMAPHORE_H
> +               CHKiRet(atomicSemInit());
> +#endif /* HAVE_SEMAPHORE_H */
> +#endif /* !defined(HAVE_ATOMIC_BUILTINS) */
> +
>                 /* initialize core classes. We must be very careful
> with the order of events. Some
>                  * classes use others and if we do not initialize them
> in the right order, we may end
>                  * up with an invalid call. The most important thing
> that can happen is that an error
> @@ -216,6 +223,13 @@
>                 glblClassExit();
>                 rulesetClassExit();
>                 ruleClassExit();
> +
> +#ifndef HAVE_ATOMIC_BUILTINS
> +#ifdef HAVE_SEMAPHORE_H
> +               atomicSemExit();
> +#endif /* HAVE_SEMAPHORE_H */
> +#endif /* !defined(HAVE_ATOMIC_BUILTINS) */
> +
>                 objClassExit(); /* *THIS* *MUST/SHOULD?* always be the
> first class initilizer being called (except debug)! */
>         }
> 
> 
> _______________________________________________
> rsyslog mailing list
> http://lists.adiscon.net/mailman/listinfo/rsyslog
> http://www.rsyslog.com
_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com

Reply via email to