From a21f72756654acff0061faab8f48a9446e9744d7 Mon Sep 17 00:00:00 2001 From: marschap Date: Sat, 10 Nov 2007 19:41:46 +0000 Subject: [PATCH] Change Linux-centric clone() to POSIX threads for portability (Daryl Fonseca-Holt) --- acinclude.m4 | 27 +++++++++++++++++++++++++-- server/drivers/Makefile.am | 4 ++-- server/drivers/lis.c | 24 +++++++++++++----------- 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 85c7cb8..2061d6c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -263,9 +263,31 @@ dnl else ]) ;; lis) + AC_CHECK_HEADERS([pthread.h],[ + AC_CHECK_LIB(pthread, pthread_create,[ + LIBPTHREAD_LIBS="-lpthread" + ac_cv_lis_pthread=yes + ],[ +dnl else + ac_cv_lis_pthread=no + AC_MSG_WARN([The lis driver needs the pthread library and pthread_create() from it]) + ]) + ],[ +dnl else + ac_cv_lis_pthread=no + AC_MSG_WARN([The lis driver needs pthread.h]) + ]) if test "$enable_libftdi" = yes ; then - DRIVERS="$DRIVERS lis${SO}" - actdrivers=["$actdrivers lis"] + if test "$enable_libusb" = yes; then + if test "$ac_cv_lis_pthread" = yes; then + DRIVERS="$DRIVERS lis${SO}" + actdrivers=["$actdrivers lis"] + else + AC_MSG_WARN([The lis driver needs the pthread library]) + fi + else + AC_MSG_WARN([The lis driver needs the usb library]) + fi else AC_MSG_WARN([The lis driver needs the ftdi library]) fi @@ -423,6 +445,7 @@ AC_SUBST(LIBG15) AC_SUBST(LIBGLCD) AC_SUBST(LIBFTDI) AC_SUBST(LIBXOSD) +AC_SUBST(LIBPTHREAD_LIBS) ]) diff --git a/server/drivers/Makefile.am b/server/drivers/Makefile.am index c47cfdf..d68f345 100644 --- a/server/drivers/Makefile.am +++ b/server/drivers/Makefile.am @@ -25,7 +25,7 @@ noinst_LIBRARIES = libLCD.a libbignum.a IOWarrior_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) hd44780_CFLAGS = @LIBUSB_CFLAGS@ @LIBFTDI_CFLAGS@ $(AM_CFLAGS) g15_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) -lis_CFLAGS = @LIBFTDI_CFLAGS@ $(AM_CFLAGS) +lis_CFLAGS = @LIBUSB_CFLAGS@ @LIBFTDI_CFLAGS@ $(AM_CFLAGS) picolcd_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) shuttleVFD_CFLAGS = @LIBUSB_CFLAGS@ $(AM_CFLAGS) ula200_CFLAGS = @LIBFTDI_CFLAGS@ $(AM_CFLAGS) @@ -45,7 +45,7 @@ IOWarrior_LDADD = @LIBUSB_LIBS@ libLCD.a libbignum.a irman_LDADD = @LIBIRMAN@ lcterm_LDADD = libLCD.a lirc_LDADD = @LIBLIRC_CLIENT@ -lis_LDADD = libLCD.a @LIBFTDI_LIBS@ libbignum.a +lis_LDADD = libLCD.a @LIBFTDI_LIBS@ @LIBUSB_LIBS@ @LIBPTHREAD_LIBS@ libbignum.a MD8800_LDADD = libLCD.a mtc_s16209x_LDADD = libLCD.a MtxOrb_LDADD = libLCD.a libbignum.a diff --git a/server/drivers/lis.c b/server/drivers/lis.c index c60add8..a058c63 100644 --- a/server/drivers/lis.c +++ b/server/drivers/lis.c @@ -45,6 +45,8 @@ * 2007/05/30 Remove set_custom_chars(). Implement * lis_set_chars(), lis_vbar(), lis_hbar() * and lis_num() using helper functions. + * 2007/11/01 Change Linux-centric clone() to POSIX + * threads for portability. */ #include #include @@ -54,6 +56,7 @@ #include #include #include +#include #include #include @@ -367,8 +370,9 @@ lis_init(Driver *drvthis) PrivateData *p; int err; const char *s; - unsigned char buffer[64], *thread_stack; + unsigned char buffer[64]; int count; + pthread_t read_thread; report(RPT_DEBUG, "%s: Initializing driver", drvthis->name); @@ -502,16 +506,14 @@ lis_init(Driver *drvthis) goto err_ftdi; } - // clone a thread to keep a read up on the device - thread_stack = calloc(4096, 1); - if(! thread_stack) { - report(RPT_ERR, "%s: cannot create thread stack", drvthis->name); - goto err_framebuf; - } - - err = clone(lis_read_thread, thread_stack+4092, CLONE_VM | CLONE_THREAD| CLONE_SIGHAND, drvthis); - if (err == -1) { - report(RPT_ERR, "%s: clone() - %s", drvthis->name, strerror(errno)); + // create a thread to keep a read up on the device + err = pthread_create( &read_thread, + NULL, + (void *) lis_read_thread, + drvthis + ); + if (err) { + report(RPT_ERR, "%s: pthread_create() - %s", drvthis->name, err); goto err_framebuf; } p->parent_flag = 1; // show we're now a happy parent, birth successful.