[Openais] [Corosync] Patches to fix BSD support
Jérôme Flesch
jerome.flesch at netasq.com
Wed Jun 10 00:40:25 PDT 2009
> Jerome,
>
> Thanks for the work. Few comments:
>
> First, NAME_MAX was changed to FILENAME_MAX to match posix. Also these
> are defined in /usr/include/limits.h. Doesn't bsd have this file? (I
> recently fixed this problem for the Solaris port I did) If it does,
> then you shouldn't have to do any defining since this is now fixed in
> current trunk.
>
I confirm, FILENAME_MAX is defined on FreeBSD (in stdio.h), so this part
of my patch is actually not required. Do you want me to prepare a new one ?
> I think the LDL part needs to be in some user defined flag in the
> configure.ac. The #if BSD with defining LDL is a bit hacky. I'm not
> sure where it should go however, so perhaps Jim or Fabio could comment.
> If Jim or Fabio give that part the thumbs up, then this patch should be
> good to go in.
>
> the if defined semun wont work because unions are not defines. That
> entire code segment is wrong. Can you try the attached patch on bsd for
> me?
>
I think you misunderstood my problem: semun *is* already defined on
FreeBSD, but the #if !defined(semun) doesn't work on my system (probably
due to a GCC version difference ?) and the compiler ends up with a
redefinition of semun.
Is there actually any system where semun is not already defined ?
> I have merged the pf_local patch you provided.
>
> I need a day to have a look at your refcounting patch for coroipc.
>
If it looks good to you, you may want to have a look at my patch for
Whitetank. Both are actually the same :)
> Thanks again!
>
> Regards
> -steve
>
> On Tue, 2009-06-09 at 17:01 +0200, Jérôme Flesch wrote:
>> Hello,
>>
>> Here are some patches that I made to fix BSD support in Corosync:
>>
>> - patch-fix-bsd-compilation: Just reuse some flags used for Darwin, and
>> make sure we don't compile with -ldl (included in the libc on FreeBSD)
>>
>> - patch-fix-semun-def-on-local: "#if define(semun)" doesn't seem to work
>> on my system (FreeBSD 7.2 / Gcc 4.2.1). However, I'm not sure if it's
>> the best way to fix this problem :/
>>
>> - patch-fix-refcount-for-bsd: It's an adaptation of my patch for
>> Whitetank: The refcount isn't decremented correctly on FreeBSD at the
>> disconnection of a client. On Whitetank, it created SHM leaks. On
>> Corosync, it seems that it makes the CPU usage goes to 100%.
>>
>> - patch-pf-local: I'm not sure if it really helps fixing the BSD
>> support, but it makes it more compliant with the instructions from the
>> BSD man pages.
>>
>> These patchs make Corosync tests work on my workstation. However I'm not
>> yet able to make it fully work with our programs, so it may not be the
>> last patches for BSD.
>> plain text document attachment (patch-fix-bsd-compilation)
>> diff --git a/configure.ac b/configure.ac
>> index b87413e..7b73315 100644
>> --- configure.ac
>> +++ configure.ac
>> @@ -194,6 +194,7 @@ AC_ARG_WITH([socket-dir],
>> # OS detection
>> # THIS SECTION MUST DIE!
>> CP=cp
>> +SYS_BSD="0"
>> case "$host_os" in
>> *linux*)
>> AC_DEFINE_UNQUOTED([COROSYNC_LINUX], [1],
>> @@ -223,6 +224,12 @@ case "$host_os" in
>> [Number of chars in a file name])
>> ;;
>> *bsd*)
>> + AC_DEFINE_UNQUOTED([MAP_ANONYMOUS], [MAP_ANON],
>> + [Shared memory define for Darwin platform])
>> + AC_DEFINE_UNQUOTED([PATH_MAX], [4096],
>> + [Number of chars in a path name including nul])
>> + AC_DEFINE_UNQUOTED([NAME_MAX], [255],
>> + [Number of chars in a file name])
>> AC_DEFINE_UNQUOTED([COROSYNC_BSD], [1],
>> [Compiling for BSD platform])
>> OS_CFLAGS=""
>> @@ -230,6 +237,7 @@ case "$host_os" in
>> OS_LDFLAGS="-L/usr/local/lib"
>> OS_DYFLAGS="-export-dynamic"
>> DARWIN_OPTS=""
>> + SYS_BSD="1"
>> ;;
>> *solaris*)
>> AC_DEFINE_UNQUOTED([COROSYNC_SOLARIS], [1],
>> @@ -360,6 +368,9 @@ AC_SUBST([NSS_LDFLAGS])
>> AM_CONDITIONAL(BUILD_DARWIN, test -n "${DARWIN_OPTS}")
>> AC_SUBST([DARWIN_OPTS])
>>
>> +AM_CONDITIONAL(BUILD_BSD, test "${SYS_BSD}" -gt 0)
>> +
>> +
>> AM_CONDITIONAL(BUILD_HTML_DOCS, test -n "${GROFF}")
>>
>> AC_SUBST([LINT_FLAGS])
>> diff --git a/lib/Makefile.am b/lib/Makefile.am
>> index af3253d..9830d22 100644
>> --- lib/Makefile.am
>> +++ lib/Makefile.am
>> @@ -62,6 +62,12 @@ noinst_HEADERS = sa-confdb.h util.h \
>> ../lcr/lcr_ifact.o:
>> $(MAKE) -C ../lcr lcr_ifact.o
>>
>> +if BUILD_BSD
>> + LDL = ""
>> +else
>> + LDL = -ldl
>> +endif
>> +
>> if BUILD_DARWIN
>>
>> libcoroipcc.so.$(SONAME): coroipcc.o
>> @@ -71,7 +77,7 @@ libcoroipcc.so.$(SONAME): coroipcc.o
>>
>> libconfdb.so.$(SONAME): confdb.o sa-confdb.o libcoroipcc.so.$(SONAME)
>> $(CC) $(LDFLAGS) $(DARWIN_OPTS) coroipcc.o confdb.o \
>> - sa-confdb.o ../lcr/lcr_ifact.o -o $@ -ldl $(AM_LDFLAGS)
>> + sa-confdb.o ../lcr/lcr_ifact.o -o $@ $(LDL) $(AM_LDFLAGS)
>> ln -sf libconfdb.so.$(SONAME) libconfdb.so
>> ln -sf libconfdb.so.$(SONAME) libconfdb.so.$(SOMAJOR)
>>
>> @@ -94,7 +100,7 @@ libconfdb.so.$(SONAME): confdb.o sa-confdb.o ../lcr/lcr_ifact.o libcoroipcc.so.$
>> $(CC) -shared -o $@ \
>> -Wl,-soname=libconfdb.so.$(SOMAJOR) \
>> -Wl,-version-script=$(srcdir)/libconfdb.versions \
>> - $^ $(LDFLAGS) $(OS_DYFLAGS) -ldl $(AM_LDFLAGS)
>> + $^ $(LDFLAGS) $(OS_DYFLAGS) $(LDL) $(AM_LDFLAGS)
>> ln -sf libconfdb.so.$(SONAME) libconfdb.so
>> ln -sf libconfdb.so.$(SONAME) libconfdb.so.$(SOMAJOR)
>>
>> plain text document attachment (patch-fix-refcount-for-bsd)
>> diff --git a/exec/coroipcs.c b/exec/coroipcs.c
>> index dcb4501..908e26d 100644
>> --- exec/coroipcs.c
>> +++ exec/coroipcs.c
>> @@ -1334,7 +1334,6 @@ int coroipcs_handler_dispatch (
>> res = 0;
>> break;
>> }
>> - coroipcs_refcount_dec (conn_info);
>> }
>> #if defined(COROSYNC_SOLARIS) || defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
>> /* On many OS poll never return POLLHUP or POLLERR.
>> @@ -1342,9 +1341,11 @@ int coroipcs_handler_dispatch (
>> */
>> if (res == 0) {
>> ipc_disconnect (conn_info);
>> + coroipcs_refcount_dec (conn_info);
>> return (0);
>> }
>> #endif
>> + coroipcs_refcount_dec (conn_info);
>> }
>>
>> coroipcs_refcount_inc (conn_info);
>> plain text document attachment (patch-fix-semun-def-on-bsd)
>> diff --git a/exec/coroipcs.c b/exec/coroipcs.c
>> index b50bd5a..1103f08 100644
>> --- exec/coroipcs.c
>> +++ exec/coroipcs.c
>> @@ -99,12 +99,14 @@ struct zcb_mapped {
>> size_t size;
>> };
>>
>> +#if !defined(semun) && !defined(COROSYNC_BSD)
>> union semun {
>> int val;
>> struct semid_ds *buf;
>> unsigned short int *array;
>> struct seminfo *__buf;
>> };
>> +#endif
>>
>> enum conn_state {
>> CONN_STATE_THREAD_INACTIVE = 0,
>> diff --git a/lib/coroipcc.c b/lib/coroipcc.c
>> index 5f898dc..9bbcc52 100644
>> --- lib/coroipcc.c
>> +++ lib/coroipcc.c
>> @@ -251,7 +251,7 @@ priv_change_send (struct ipc_instance *ipc_instance)
>> return (0);
>> }
>>
>> -#if !defined(semun)
>> +#if !defined(semun) && !defined(COROSYNC_BSD)
>> union semun {
>> int val;
>> struct semid_ds *buf;
>> plain text document attachment (patch-pf-local)
>> diff --git a/exec/coroipcs.c b/exec/coroipcs.c
>> index 1103f08..3dca150 100644
>> --- exec/coroipcs.c
>> +++ exec/coroipcs.c
>> @@ -780,7 +780,7 @@ extern void coroipcs_ipc_init (
>> /*
>> * Create socket for IPC clients, name socket, listen for connections
>> */
>> - server_fd = socket (PF_UNIX, SOCK_STREAM, 0);
>> + server_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
>> if (server_fd == -1) {
>> api->log_printf ("Cannot create client connections socket.\n");
>> api->fatal_error ("Can't create library listen socket");
>> @@ -795,7 +795,7 @@ extern void coroipcs_ipc_init (
>> memset (&un_addr, 0, sizeof (struct sockaddr_un));
>> un_addr.sun_family = AF_UNIX;
>> #if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
>> - un_addr.sun_len = sizeof(struct sockaddr_un);
>> + un_addr.sun_len = SUN_LEN(&un_addr);
>> #endif
>>
>> #if defined(COROSYNC_LINUX)
>> @@ -807,7 +807,7 @@ extern void coroipcs_ipc_init (
>>
>> res = bind (server_fd, (struct sockaddr *)&un_addr, COROSYNC_SUN_LEN(&un_addr));
>> if (res) {
>> - api->log_printf ("Could not bind AF_UNIX: %s.\n", strerror (errno));
>> + api->log_printf ("Could not bind AF_UNIX (%s): %s.\n", un_addr.sun_path, strerror (errno));
>> api->fatal_error ("Could not bind to AF_UNIX socket\n");
>> }
>> listen (server_fd, SERVER_BACKLOG);
>> diff --git a/lib/coroipcc.c b/lib/coroipcc.c
>> index 9bbcc52..10fb6e6 100644
>> --- lib/coroipcc.c
>> +++ lib/coroipcc.c
>> @@ -522,16 +522,16 @@ coroipcc_service_connect (
>>
>> res_setup.error = CS_ERR_LIBRARY;
>>
>> - request_fd = socket (PF_UNIX, SOCK_STREAM, 0);
>> + request_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
>> if (request_fd == -1) {
>> return (CS_ERR_LIBRARY);
>> }
>>
>> memset (&address, 0, sizeof (struct sockaddr_un));
>> + address.sun_family = AF_UNIX;
>> #if defined(COROSYNC_BSD) || defined(COROSYNC_DARWIN)
>> - address.sun_len = sizeof(struct sockaddr_un);
>> + address.sun_len = SUN_LEN(&address);
>> #endif
>> - address.sun_family = PF_UNIX;
>>
>> #if defined(COROSYNC_LINUX)
>> sprintf (address.sun_path + 1, "%s", socket_name);
>> @@ -541,6 +541,9 @@ coroipcc_service_connect (
>> sys_res = connect (request_fd, (struct sockaddr *)&address,
>> COROSYNC_SUN_LEN(&address));
>> if (sys_res == -1) {
>> +#ifdef DEBUG
>> + fprintf(stderr, "Coroipcc: Can't connect: %d : %s\n", errno, strerror(errno));
>> +#endif
>> close (request_fd);
>> return (CS_ERR_TRY_AGAIN);
>> }
>> _______________________________________________
>> Openais mailing list
>> Openais at lists.linux-foundation.org
>> https://lists.linux-foundation.org/mailman/listinfo/openais
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4393 bytes
Desc: S/MIME Cryptographic Signature
Url : http://lists.linux-foundation.org/pipermail/openais/attachments/20090610/0154462c/attachment-0001.bin
More information about the Openais
mailing list