From e01898bcd368cc7e96158286579d8dd419e59352 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 15 Apr 2010 14:38:10 +0200 Subject: [PATCH] Bug #608766 - Replace pthread with GLib's GThread --- calendar/libecal/e-cal.c | 1 - camel/camel-block-file.c | 53 +++++++++++++-------------- camel/camel-certdb.c | 11 +++--- camel/camel-data-wrapper.c | 4 +- camel/camel-debug.c | 13 +++---- camel/camel-exception.c | 1 - camel/camel-folder-summary.c | 7 ++-- camel/camel-lock-client.c | 7 ++-- camel/camel-mime-utils.c | 18 ++++----- camel/camel-object.c | 27 ++++++-------- camel/camel-object.h | 1 - camel/camel-operation.c | 29 +++++---------- camel/camel-partition-table.c | 20 +++++----- camel/camel-private.h | 7 ++-- camel/camel-provider.c | 12 +++--- camel/camel-sasl-popb4smtp.c | 7 ++-- camel/camel-service.c | 1 - camel/camel-string-utils.c | 15 ++++---- camel/providers/imapx/camel-imapx-exception.c | 19 +++++----- camel/providers/local/camel-local-private.h | 1 - camel/providers/nntp/camel-nntp-newsrc.c | 1 - camel/tests/folder/test10.c | 19 +++++++--- camel/tests/folder/test11.c | 1 - camel/tests/folder/test8.c | 24 ++++++++---- camel/tests/lib/camel-test.c | 21 ++++------- configure.ac | 25 ++----------- libedataserver/e-data-server-util.c | 44 ++++------------------ libedataserver/e-data-server-util.h | 3 +- m4/evo_pthread_check.m4 | 16 -------- 29 files changed, 163 insertions(+), 245 deletions(-) delete mode 100644 m4/evo_pthread_check.m4 diff --git a/calendar/libecal/e-cal.c b/calendar/libecal/e-cal.c index d1dfdac..c8299d5 100644 --- a/calendar/libecal/e-cal.c +++ b/calendar/libecal/e-cal.c @@ -27,7 +27,6 @@ #endif #include -#include #include #include diff --git a/camel/camel-block-file.c b/camel/camel-block-file.c index 15dbab1..8b4cda0 100644 --- a/camel/camel-block-file.c +++ b/camel/camel-block-file.c @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -51,21 +50,21 @@ struct _CamelBlockFilePrivate { struct _CamelBlockFile *base; - pthread_mutex_t root_lock; /* for modifying the root block */ - pthread_mutex_t cache_lock; /* for refcounting, flag manip, cache manip */ - pthread_mutex_t io_lock; /* for all io ops */ + GStaticMutex root_lock; /* for modifying the root block */ + GStaticMutex cache_lock; /* for refcounting, flag manip, cache manip */ + GStaticMutex io_lock; /* for all io ops */ guint deleted:1; }; -#define CAMEL_BLOCK_FILE_LOCK(kf, lock) (pthread_mutex_lock(&(kf)->priv->lock)) -#define CAMEL_BLOCK_FILE_TRYLOCK(kf, lock) (pthread_mutex_trylock(&(kf)->priv->lock)) -#define CAMEL_BLOCK_FILE_UNLOCK(kf, lock) (pthread_mutex_unlock(&(kf)->priv->lock)) +#define CAMEL_BLOCK_FILE_LOCK(kf, lock) (g_static_mutex_lock(&(kf)->priv->lock)) +#define CAMEL_BLOCK_FILE_TRYLOCK(kf, lock) (g_static_mutex_trylock(&(kf)->priv->lock)) +#define CAMEL_BLOCK_FILE_UNLOCK(kf, lock) (g_static_mutex_unlock(&(kf)->priv->lock)) -#define LOCK(x) pthread_mutex_lock(&x) -#define UNLOCK(x) pthread_mutex_unlock(&x) +#define LOCK(x) g_static_mutex_lock(&x) +#define UNLOCK(x) g_static_mutex_unlock(&x) -static pthread_mutex_t block_file_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex block_file_lock = G_STATIC_MUTEX_INIT; /* lru cache of block files */ static CamelDList block_file_list = CAMEL_DLIST_INITIALISER(block_file_list); @@ -180,9 +179,9 @@ camel_block_file_finalize(CamelBlockFile *bs) if (bs->fd != -1) close(bs->fd); - pthread_mutex_destroy(&p->io_lock); - pthread_mutex_destroy(&p->cache_lock); - pthread_mutex_destroy(&p->root_lock); + g_static_mutex_free (&p->io_lock); + g_static_mutex_free (&p->cache_lock); + g_static_mutex_free (&p->root_lock); g_free(p); } @@ -216,9 +215,9 @@ camel_block_file_init(CamelBlockFile *bs) p = bs->priv = g_malloc0(sizeof(*bs->priv)); p->base = bs; - pthread_mutex_init(&p->root_lock, NULL); - pthread_mutex_init(&p->cache_lock, NULL); - pthread_mutex_init(&p->io_lock, NULL); + g_static_mutex_init (&p->root_lock); + g_static_mutex_init (&p->cache_lock); + g_static_mutex_init (&p->io_lock); /* link into lru list */ LOCK(block_file_lock); @@ -307,9 +306,9 @@ block_file_use(CamelBlockFile *bs) if (bf->fd != -1) { /* Need to trylock, as any of these lock levels might be trying to lock the block_file_lock, so we need to check and abort if so */ - if (CAMEL_BLOCK_FILE_TRYLOCK(bf, root_lock) == 0) { - if (CAMEL_BLOCK_FILE_TRYLOCK(bf, cache_lock) == 0) { - if (CAMEL_BLOCK_FILE_TRYLOCK(bf, io_lock) == 0) { + if (CAMEL_BLOCK_FILE_TRYLOCK (bf, root_lock)) { + if (CAMEL_BLOCK_FILE_TRYLOCK (bf, cache_lock)) { + if (CAMEL_BLOCK_FILE_TRYLOCK (bf, io_lock)) { d(printf("[%d] Turning block file offline: %s\n", block_file_count-1, bf->path)); sync_nolock(bf); close(bf->fd); @@ -812,15 +811,15 @@ struct _CamelKeyFilePrivate { struct _CamelKeyFilePrivate *prev; struct _CamelKeyFile *base; - pthread_mutex_t lock; + GStaticMutex lock; guint deleted:1; }; -#define CAMEL_KEY_FILE_LOCK(kf, lock) (pthread_mutex_lock(&(kf)->priv->lock)) -#define CAMEL_KEY_FILE_TRYLOCK(kf, lock) (pthread_mutex_trylock(&(kf)->priv->lock)) -#define CAMEL_KEY_FILE_UNLOCK(kf, lock) (pthread_mutex_unlock(&(kf)->priv->lock)) +#define CAMEL_KEY_FILE_LOCK(kf, lock) (g_static_mutex_lock(&(kf)->priv->lock)) +#define CAMEL_KEY_FILE_TRYLOCK(kf, lock) (g_static_mutex_trylock(&(kf)->priv->lock)) +#define CAMEL_KEY_FILE_UNLOCK(kf, lock) (g_static_mutex_unlock(&(kf)->priv->lock)) -static pthread_mutex_t key_file_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex key_file_lock = G_STATIC_MUTEX_INIT; /* lru cache of block files */ static CamelDList key_file_list = CAMEL_DLIST_INITIALISER(key_file_list); @@ -845,7 +844,7 @@ camel_key_file_finalize(CamelKeyFile *bs) g_free(bs->path); - pthread_mutex_destroy(&p->lock); + g_static_mutex_free (&p->lock); g_free(p); } @@ -863,7 +862,7 @@ camel_key_file_init(CamelKeyFile *bs) p = bs->priv = g_malloc0(sizeof(*bs->priv)); p->base = bs; - pthread_mutex_init(&p->lock, NULL); + g_static_mutex_init (&p->lock); LOCK(key_file_lock); camel_dlist_addhead(&key_file_list, (CamelDListNode *)p); @@ -949,7 +948,7 @@ key_file_use(CamelKeyFile *bs) if (bf->fp != NULL) { /* Need to trylock, as any of these lock levels might be trying to lock the key_file_lock, so we need to check and abort if so */ - if (CAMEL_BLOCK_FILE_TRYLOCK(bf, lock) == 0) { + if (CAMEL_BLOCK_FILE_TRYLOCK (bf, lock)) { d(printf("Turning key file offline: %s\n", bf->path)); fclose(bf->fp); bf->fp = NULL; diff --git a/camel/camel-certdb.c b/camel/camel-certdb.c index 5b5ab6a..4d0cda1 100644 --- a/camel/camel-certdb.c +++ b/camel/camel-certdb.c @@ -26,7 +26,6 @@ #include #include -#include #include #include #include @@ -147,12 +146,12 @@ camel_certdb_new (void) } static CamelCertDB *default_certdb = NULL; -static pthread_mutex_t default_certdb_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex default_certdb_lock = G_STATIC_MUTEX_INIT; void camel_certdb_set_default (CamelCertDB *certdb) { - pthread_mutex_lock (&default_certdb_lock); + g_static_mutex_lock (&default_certdb_lock); if (default_certdb) camel_object_unref (default_certdb); @@ -162,7 +161,7 @@ camel_certdb_set_default (CamelCertDB *certdb) default_certdb = certdb; - pthread_mutex_unlock (&default_certdb_lock); + g_static_mutex_unlock (&default_certdb_lock); } CamelCertDB * @@ -170,14 +169,14 @@ camel_certdb_get_default (void) { CamelCertDB *certdb; - pthread_mutex_lock (&default_certdb_lock); + g_static_mutex_lock (&default_certdb_lock); if (default_certdb) camel_object_ref (default_certdb); certdb = default_certdb; - pthread_mutex_unlock (&default_certdb_lock); + g_static_mutex_unlock (&default_certdb_lock); return certdb; } diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c index c739375..f13ff9c 100644 --- a/camel/camel-data-wrapper.c +++ b/camel/camel-data-wrapper.c @@ -42,7 +42,7 @@ camel_data_wrapper_finalize (CamelObject *object) { CamelDataWrapper *camel_data_wrapper = CAMEL_DATA_WRAPPER (object); - pthread_mutex_destroy (&camel_data_wrapper->priv->stream_lock); + g_static_mutex_free (&camel_data_wrapper->priv->stream_lock); g_free (camel_data_wrapper->priv); @@ -190,7 +190,7 @@ camel_data_wrapper_init (CamelDataWrapper *data_wrapper) { data_wrapper->priv = g_malloc (sizeof (struct _CamelDataWrapperPrivate)); - pthread_mutex_init (&data_wrapper->priv->stream_lock, NULL); + g_static_mutex_init (&data_wrapper->priv->stream_lock); data_wrapper->mime_type = camel_content_type_new ( "application", "octet-stream"); diff --git a/camel/camel-debug.c b/camel/camel-debug.c index 3aa01ce..3b25db1 100644 --- a/camel/camel-debug.c +++ b/camel/camel-debug.c @@ -19,13 +19,10 @@ * USA */ -#include #include #include #include -#include - #include "camel-debug.h" gint camel_verbose_debug; @@ -112,7 +109,7 @@ gboolean camel_debug(const gchar *mode) return FALSE; } -static pthread_mutex_t debug_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex debug_lock = G_STATIC_MUTEX_INIT; /** * camel_debug_start: * @mode: @@ -127,8 +124,8 @@ gboolean camel_debug_start(const gchar *mode) { if (camel_debug(mode)) { - pthread_mutex_lock(&debug_lock); - printf("Thread %" G_GINT64_MODIFIER "x >\n", e_util_pthread_id(pthread_self())); + g_static_mutex_lock (&debug_lock); + printf ("Thread %p >\n", g_thread_self()); return TRUE; } @@ -144,8 +141,8 @@ camel_debug_start(const gchar *mode) void camel_debug_end(void) { - printf("< %" G_GINT64_MODIFIER "x >\n", e_util_pthread_id(pthread_self())); - pthread_mutex_unlock(&debug_lock); + printf ("< %p >\n", g_thread_self()); + g_static_mutex_unlock (&debug_lock); } #if 0 diff --git a/camel/camel-exception.c b/camel/camel-exception.c index d8c2980..22db7f5 100644 --- a/camel/camel-exception.c +++ b/camel/camel-exception.c @@ -26,7 +26,6 @@ #endif #include -#include #include #include diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c index ac3b2c5..e91304b 100644 --- a/camel/camel-folder-summary.c +++ b/camel/camel-folder-summary.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -64,11 +63,11 @@ #define SUMMARY_CACHE_DROP 300 #define dd(x) if (camel_debug("sync")) x -static pthread_mutex_t info_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex info_lock = G_STATIC_MUTEX_INIT; /* this lock is ONLY for the standalone messageinfo stuff */ -#define GLOBAL_INFO_LOCK(i) pthread_mutex_lock(&info_lock) -#define GLOBAL_INFO_UNLOCK(i) pthread_mutex_unlock(&info_lock) +#define GLOBAL_INFO_LOCK(i) g_static_mutex_lock(&info_lock) +#define GLOBAL_INFO_UNLOCK(i) g_static_mutex_unlock(&info_lock) /* this should probably be conditional on it existing */ #define USE_BSEARCH diff --git a/camel/camel-lock-client.c b/camel/camel-lock-client.c index 34cdfe9..52a4f39 100644 --- a/camel/camel-lock-client.c +++ b/camel/camel-lock-client.c @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -44,9 +43,9 @@ /* see also camel-lock.c */ #define _(x) (x) -static pthread_mutex_t lock_lock = PTHREAD_MUTEX_INITIALIZER; -#define LOCK() pthread_mutex_lock(&lock_lock) -#define UNLOCK() pthread_mutex_unlock(&lock_lock) +static GStaticMutex lock_lock = G_STATIC_MUTEX_INIT; +#define LOCK() g_static_mutex_lock(&lock_lock) +#define UNLOCK() g_static_mutex_unlock(&lock_lock) static gint lock_sequence; static gint lock_helper_pid = -1; diff --git a/camel/camel-mime-utils.c b/camel/camel-mime-utils.c index d5d2093..48ac641 100644 --- a/camel/camel-mime-utils.c +++ b/camel/camel-mime-utils.c @@ -30,7 +30,6 @@ #include #include /* for MAXHOSTNAMELEN */ #include -#include #include #include #include @@ -4313,9 +4312,9 @@ camel_header_raw_clear(struct _camel_header_raw **list) gchar * camel_header_msgid_generate (void) { - static pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER; -#define COUNT_LOCK() pthread_mutex_lock (&count_lock) -#define COUNT_UNLOCK() pthread_mutex_unlock (&count_lock) + static GStaticMutex count_lock = G_STATIC_MUTEX_INIT; +#define COUNT_LOCK() g_static_mutex_lock (&count_lock) +#define COUNT_UNLOCK() g_static_mutex_unlock (&count_lock) gchar host[MAXHOSTNAMELEN]; const gchar *name; static gint count = 0; @@ -4397,10 +4396,8 @@ static struct { { "List-Unsubscribe", "]*)" }, }; -static pthread_once_t mailing_list_init_once = PTHREAD_ONCE_INIT; - -static void -mailing_list_init(void) +static gpointer +mailing_list_init (gpointer param) { gint i, errcode, failed=0; @@ -4422,16 +4419,19 @@ mailing_list_init(void) } g_assert(failed == 0); + + return NULL; } gchar * camel_header_raw_check_mailing_list(struct _camel_header_raw **list) { + static GOnce once = G_ONCE_INIT; const gchar *v; regmatch_t match[3]; gint i, j; - pthread_once(&mailing_list_init_once, mailing_list_init); + g_once (&once, mailing_list_init, NULL); for (i = 0; i < G_N_ELEMENTS (mail_list_magic); i++) { v = camel_header_raw_find (list, mail_list_magic[i].name, NULL); diff --git a/camel/camel-object.c b/camel/camel-object.c index a45dfa0..64d83d2 100644 --- a/camel/camel-object.c +++ b/camel/camel-object.c @@ -25,7 +25,6 @@ #endif #include -#include #include #include @@ -90,7 +89,7 @@ struct _CamelObjectBagKey { gpointer key; /* the key reserved */ gint waiters; /* count of threads waiting for key */ - pthread_t owner; /* the thread that has reserved the bag for a new entry */ + GThread *owner; /* the thread that has reserved the bag for a new entry */ gint have_owner; GCond *cond; }; @@ -139,8 +138,6 @@ static GHashTable *type_table; CamelType camel_object_type = CAMEL_INVALID_TYPE; CamelType camel_interface_type = CAMEL_INVALID_TYPE; -#define P_LOCK(l) (pthread_mutex_lock(&l)) -#define P_UNLOCK(l) (pthread_mutex_unlock(&l)) #define CLASS_LOCK(k) (g_mutex_lock((((CamelObjectClass *)k)->lock))) #define CLASS_UNLOCK(k) (g_mutex_unlock((((CamelObjectClass *)k)->lock))) #define REF_LOCK() (g_mutex_lock(ref_lock)) @@ -675,7 +672,7 @@ camel_object_ref (gpointer vo) { register CamelObject *o = vo; - g_return_if_fail(CAMEL_IS_OBJECT(o)); + g_return_val_if_fail (CAMEL_IS_OBJECT (o), NULL); REF_LOCK(); @@ -988,13 +985,13 @@ camel_object_free_hooks(CamelObject *o) static CamelHookList * camel_object_get_hooks(CamelObject *o) { - static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + static GStaticMutex lock = G_STATIC_MUTEX_INIT; CamelHookList *hooks; /* if we have it, we dont have to do any other locking, otherwise use a global lock to setup the object's hook data */ if (o->hooks == NULL) { - pthread_mutex_lock(&lock); + g_static_mutex_lock(&lock); if (o->hooks == NULL) { hooks = hooks_alloc(); g_static_rec_mutex_init(&hooks->lock); @@ -1004,7 +1001,7 @@ camel_object_get_hooks(CamelObject *o) hooks->list = NULL; o->hooks = hooks; } - pthread_mutex_unlock(&lock); + g_static_mutex_unlock(&lock); } g_static_rec_mutex_lock(&o->hooks->lock); @@ -1572,7 +1569,7 @@ co_bag_unreserve(CamelObjectBag *bag, gconstpointer key) } g_assert(res != NULL); - g_assert(res->have_owner && pthread_equal(res->owner, pthread_self())); + g_assert(res->have_owner && res->owner == g_thread_self ()); if (res->waiters > 0) { b(printf("unreserve bag '%s', waking waiters\n", (gchar *)key)); @@ -1676,7 +1673,7 @@ camel_object_bag_get(CamelObjectBag *bag, gconstpointer key) b(printf("object bag get '%s', reserved, waiting\n", (gchar *)key)); res->waiters++; - g_assert(!res->have_owner || !pthread_equal(res->owner, pthread_self())); + g_assert(!res->have_owner || res->owner != g_thread_self ()); g_cond_wait(res->cond, ref_lock); res->waiters--; @@ -1688,7 +1685,7 @@ camel_object_bag_get(CamelObjectBag *bag, gconstpointer key) b(printf("object bag get '%s', finished waiting, got %p\n", (gchar *)key, o)); /* we don't actually reserve it */ - res->owner = pthread_self(); + res->owner = g_thread_self (); res->have_owner = TRUE; co_bag_unreserve(bag, key); } @@ -1771,7 +1768,7 @@ camel_object_bag_reserve(CamelObjectBag *bag, gconstpointer key) if (res) { b(printf("bag reserve %s, already reserved, waiting\n", (gchar *)key)); - g_assert(!res->have_owner || !pthread_equal(res->owner, pthread_self())); + g_assert(!res->have_owner || res->owner != g_thread_self ()); res->waiters++; g_cond_wait(res->cond, ref_lock); res->waiters--; @@ -1781,12 +1778,12 @@ camel_object_bag_reserve(CamelObjectBag *bag, gconstpointer key) b(printf("finished wait, someone else created '%s' = %p\n", (gchar *)key, o)); o->ref_count++; /* in which case we dont need to reserve the bag either */ - res->owner = pthread_self(); + res->owner = g_thread_self (); res->have_owner = TRUE; co_bag_unreserve(bag, key); } else { b(printf("finished wait, now owner of '%s'\n", (gchar *)key)); - res->owner = pthread_self(); + res->owner = g_thread_self (); res->have_owner = TRUE; } } else { @@ -1795,7 +1792,7 @@ camel_object_bag_reserve(CamelObjectBag *bag, gconstpointer key) res->waiters = 0; res->key = bag->copy_key(key); res->cond = g_cond_new(); - res->owner = pthread_self(); + res->owner = g_thread_self (); res->have_owner = TRUE; res->next = bag->reserved; bag->reserved = res; diff --git a/camel/camel-object.h b/camel/camel-object.h index 8b8ed08..e2e3f83 100644 --- a/camel/camel-object.h +++ b/camel/camel-object.h @@ -33,7 +33,6 @@ #include /* FILE */ #include /* gsize */ #include -#include #include #include diff --git a/camel/camel-operation.c b/camel/camel-operation.c index e185ccb..8731ccb 100644 --- a/camel/camel-operation.c +++ b/camel/camel-operation.c @@ -24,7 +24,6 @@ #include #endif -#include #include #include #include @@ -52,7 +51,7 @@ struct _CamelOperation { struct _CamelOperation *next; struct _CamelOperation *prev; - pthread_t id; /* id of running thread */ + GThread *thread; /* running thread */ guint32 flags; /* cancelled ? */ gint blocked; /* cancellation blocked depth */ gint refcount; @@ -78,31 +77,22 @@ struct _CamelOperation { /* Delay before a transient operation has any effect on the status */ #define CAMEL_OPERATION_TRANSIENT_DELAY (5) -static pthread_mutex_t operation_lock = PTHREAD_MUTEX_INITIALIZER; -#define LOCK() pthread_mutex_lock(&operation_lock) -#define UNLOCK() pthread_mutex_unlock(&operation_lock) +static GStaticMutex operation_lock = G_STATIC_MUTEX_INIT; +#define LOCK() g_static_mutex_lock(&operation_lock) +#define UNLOCK() g_static_mutex_unlock(&operation_lock) static guint stamp (void); static CamelDList operation_list = CAMEL_DLIST_INITIALISER(operation_list); -static pthread_key_t operation_key; -static pthread_once_t operation_once = PTHREAD_ONCE_INIT; +static GStaticPrivate operation_key = G_STATIC_PRIVATE_INIT; typedef struct _CamelOperationMsg { CamelMsg msg; } CamelOperationMsg; -static void -co_createspecific(void) -{ - pthread_key_create(&operation_key, NULL); -} - static CamelOperation * co_getcc(void) { - pthread_once(&operation_once, co_createspecific); - - return (CamelOperation *)pthread_getspecific(operation_key); + return (CamelOperation *)g_static_private_get (&operation_key); } /** @@ -313,7 +303,7 @@ camel_operation_register (CamelOperation *cc) { CamelOperation *oldcc = co_getcc(); - pthread_setspecific(operation_key, cc); + g_static_private_set (&operation_key, cc, NULL); return oldcc; } @@ -327,8 +317,7 @@ camel_operation_register (CamelOperation *cc) void camel_operation_unregister (CamelOperation *cc) { - pthread_once(&operation_once, co_createspecific); - pthread_setspecific(operation_key, NULL); + g_static_private_set (&operation_key, NULL, NULL); } /** @@ -346,7 +335,7 @@ camel_operation_cancel_check (CamelOperation *cc) CamelOperationMsg *msg; gint cancelled; - d(printf("checking for cancel in thread %d\n", pthread_self())); + d(printf("checking for cancel in thread %p\n", g_thread_self())); if (cc == NULL) cc = co_getcc(); diff --git a/camel/camel-partition-table.c b/camel/camel-partition-table.c index 9ea4bf3..62444df 100644 --- a/camel/camel-partition-table.c +++ b/camel/camel-partition-table.c @@ -44,11 +44,11 @@ #define k(x) /*(printf("%s(%d):%s: ", __FILE__, __LINE__, __PRETTY_FUNCTION__),(x))*/ struct _CamelPartitionTablePrivate { - pthread_mutex_t lock; /* for locking partition */ + GStaticMutex lock; /* for locking partition */ }; -#define CAMEL_PARTITION_TABLE_LOCK(kf, lock) (pthread_mutex_lock(&(kf)->priv->lock)) -#define CAMEL_PARTITION_TABLE_UNLOCK(kf, lock) (pthread_mutex_unlock(&(kf)->priv->lock)) +#define CAMEL_PARTITION_TABLE_LOCK(kf, lock) (g_static_mutex_lock(&(kf)->priv->lock)) +#define CAMEL_PARTITION_TABLE_UNLOCK(kf, lock) (g_static_mutex_unlock(&(kf)->priv->lock)) static void camel_partition_table_class_init(CamelPartitionTableClass *klass) @@ -63,7 +63,7 @@ camel_partition_table_init(CamelPartitionTable *cpi) camel_dlist_init(&cpi->partition); p = cpi->priv = g_malloc0(sizeof(*cpi->priv)); - pthread_mutex_init(&p->lock, NULL); + g_static_mutex_init (&p->lock); } static void @@ -84,7 +84,7 @@ camel_partition_table_finalize(CamelPartitionTable *cpi) camel_object_unref (cpi->blocks); } - pthread_mutex_destroy(&p->lock); + g_static_mutex_free (&p->lock); g_free(p); @@ -582,11 +582,11 @@ fail: /* ********************************************************************** */ struct _CamelKeyTablePrivate { - pthread_mutex_t lock; /* for locking key */ + GStaticMutex lock; /* for locking key */ }; -#define CAMEL_KEY_TABLE_LOCK(kf, lock) (pthread_mutex_lock(&(kf)->priv->lock)) -#define CAMEL_KEY_TABLE_UNLOCK(kf, lock) (pthread_mutex_unlock(&(kf)->priv->lock)) +#define CAMEL_KEY_TABLE_LOCK(kf, lock) (g_static_mutex_lock(&(kf)->priv->lock)) +#define CAMEL_KEY_TABLE_UNLOCK(kf, lock) (g_static_mutex_unlock(&(kf)->priv->lock)) static void camel_key_table_class_init(CamelKeyTableClass *klass) @@ -599,7 +599,7 @@ camel_key_table_init(CamelKeyTable *ki) struct _CamelKeyTablePrivate *p; p = ki->priv = g_malloc0(sizeof(*ki->priv)); - pthread_mutex_init(&p->lock, NULL); + g_static_mutex_init (&p->lock); } static void @@ -618,7 +618,7 @@ camel_key_table_finalize(CamelKeyTable *ki) camel_object_unref (ki->blocks); } - pthread_mutex_destroy(&p->lock); + g_static_mutex_free (&p->lock); g_free(p); diff --git a/camel/camel-private.h b/camel/camel-private.h index 9c1740b..4a5f8b6 100644 --- a/camel/camel-private.h +++ b/camel/camel-private.h @@ -31,7 +31,6 @@ #endif #include -#include G_BEGIN_DECLS @@ -167,13 +166,13 @@ struct _CamelVeeFolderPrivate { (g_mutex_unlock(((CamelVeeFolder *) (f))->priv->l)) struct _CamelDataWrapperPrivate { - pthread_mutex_t stream_lock; + GStaticMutex stream_lock; }; #define CAMEL_DATA_WRAPPER_LOCK(dw, l) \ - (pthread_mutex_lock(&((CamelDataWrapper *) (dw))->priv->l)) + (g_static_mutex_lock(&((CamelDataWrapper *) (dw))->priv->l)) #define CAMEL_DATA_WRAPPER_UNLOCK(dw, l) \ - (pthread_mutex_unlock(&((CamelDataWrapper *) (dw))->priv->l)) + (g_static_mutex_unlock(&((CamelDataWrapper *) (dw))->priv->l)) /* most of this stuff really is private, but the lock can be used by subordinate classes */ struct _CamelCertDBPrivate { diff --git a/camel/camel-provider.c b/camel/camel-provider.c index 49d270e..02fa28b 100644 --- a/camel/camel-provider.c +++ b/camel/camel-provider.c @@ -68,10 +68,10 @@ static CamelProvider vee_provider = { /* ... */ }; -static pthread_once_t setup_once = PTHREAD_ONCE_INIT; +static GOnce setup_once = G_ONCE_INIT; -static void -provider_setup(void) +static gpointer +provider_setup (gpointer param) { module_table = g_hash_table_new(camel_strcase_hash, camel_strcase_equal); provider_table = g_hash_table_new(camel_strcase_hash, camel_strcase_equal); @@ -80,6 +80,8 @@ provider_setup(void) vee_provider.url_hash = camel_url_hash; vee_provider.url_equal = camel_url_equal; camel_provider_register(&vee_provider); + + return NULL; } /** @@ -105,7 +107,7 @@ camel_provider_init (void) CamelProviderModule *m; static gint loaded = 0; - pthread_once(&setup_once, provider_setup); + g_once (&setup_once, provider_setup, NULL); if (loaded) return; @@ -177,7 +179,7 @@ camel_provider_load (const gchar *path, GModule *module; CamelProvider *(*provider_module_init) (void); - pthread_once(&setup_once, provider_setup); + g_once (&setup_once, provider_setup, NULL); if (!g_module_supported ()) { camel_exception_setv ( diff --git a/camel/camel-sasl-popb4smtp.c b/camel/camel-sasl-popb4smtp.c index c0d0b18..442a430 100644 --- a/camel/camel-sasl-popb4smtp.c +++ b/camel/camel-sasl-popb4smtp.c @@ -24,7 +24,6 @@ #include #endif -#include #include #include @@ -54,9 +53,9 @@ static GHashTable *poplast; /* use 1 hour as our pop timeout */ #define POPB4SMTP_TIMEOUT (60*60) -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -#define POPB4SMTP_LOCK(l) pthread_mutex_lock(&l) -#define POPB4SMTP_UNLOCK(l) pthread_mutex_unlock(&l) +static GStaticMutex lock = G_STATIC_MUTEX_INIT; +#define POPB4SMTP_LOCK(l) g_static_mutex_lock(&l) +#define POPB4SMTP_UNLOCK(l) g_static_mutex_unlock(&l) static CamelSaslClass *parent_class = NULL; diff --git a/camel/camel-service.c b/camel/camel-service.c index 6b620f5..abbec77 100644 --- a/camel/camel-service.c +++ b/camel/camel-service.c @@ -29,7 +29,6 @@ #include #include -#include #include #include diff --git a/camel/camel-string-utils.c b/camel/camel-string-utils.c index 6efe85c..0f0f11e 100644 --- a/camel/camel-string-utils.c +++ b/camel/camel-string-utils.c @@ -25,7 +25,6 @@ #endif #include -#include #include "camel-string-utils.h" @@ -139,7 +138,7 @@ gchar camel_toupper(gchar c) } /* working stuff for pstrings */ -static pthread_mutex_t pstring_lock = PTHREAD_MUTEX_INITIALIZER; +static GStaticMutex pstring_lock = G_STATIC_MUTEX_INIT; static GHashTable *pstring_table = NULL; /** @@ -170,7 +169,7 @@ camel_pstring_add (gchar *str, gboolean own) return ""; } - pthread_mutex_lock (&pstring_lock); + g_static_mutex_lock (&pstring_lock); if (pstring_table == NULL) pstring_table = g_hash_table_new (g_str_hash, g_str_equal); @@ -184,7 +183,7 @@ camel_pstring_add (gchar *str, gboolean own) g_hash_table_insert (pstring_table, pstr, GINT_TO_POINTER (1)); } - pthread_mutex_unlock (&pstring_lock); + g_static_mutex_unlock (&pstring_lock); return pstr; } @@ -215,7 +214,7 @@ camel_pstring_peek (const gchar *str) return ""; } - pthread_mutex_lock (&pstring_lock); + g_static_mutex_lock (&pstring_lock); if (pstring_table == NULL) pstring_table = g_hash_table_new (g_str_hash, g_str_equal); @@ -224,7 +223,7 @@ camel_pstring_peek (const gchar *str) g_hash_table_insert (pstring_table, pstr, GINT_TO_POINTER (1)); } - pthread_mutex_unlock (&pstring_lock); + g_static_mutex_unlock (&pstring_lock); return pstr; } @@ -268,7 +267,7 @@ camel_pstring_free(const gchar *s) if (s == NULL || s[0] == 0) return; - pthread_mutex_lock(&pstring_lock); + g_static_mutex_lock (&pstring_lock); if (g_hash_table_lookup_extended(pstring_table, s, (gpointer *)&p, &pcount)) { count = GPOINTER_TO_INT(pcount)-1; if (count == 0) { @@ -288,5 +287,5 @@ camel_pstring_free(const gchar *s) g_assert (0); } } - pthread_mutex_unlock(&pstring_lock); + g_static_mutex_unlock (&pstring_lock); } diff --git a/camel/providers/imapx/camel-imapx-exception.c b/camel/providers/imapx/camel-imapx-exception.c index e031baf..b13e8bf 100644 --- a/camel/providers/imapx/camel-imapx-exception.c +++ b/camel/providers/imapx/camel-imapx-exception.c @@ -7,13 +7,12 @@ #include "camel-imapx-exception.h" -#include - -static pthread_key_t handler_key = 0; +static GStaticPrivate handler_key = G_STATIC_PRIVATE_INIT; void camel_exception_setup(void) { - pthread_key_create(&handler_key, NULL); + /* No need for 'new' with GStaticPrivate */ + /* g_static_private_new (&handler_key); */ } void @@ -21,12 +20,12 @@ camel_exception_try(struct _CamelExceptionEnv *env) { struct _CamelExceptionEnv *handler; - handler = pthread_getspecific(handler_key); + handler = g_static_private_get (&handler_key); env->parent = handler; handler = env; env->ex = NULL; - pthread_setspecific(handler_key, handler); + g_static_private_set (&handler_key, handler, NULL); } void @@ -36,10 +35,10 @@ camel_exception_throw_ex(CamelException *ex) printf("throwing exception '%s'\n", ex->desc); - env = pthread_getspecific(handler_key); + env = g_static_private_get (&handler_key); if (env != NULL) { env->ex = ex; - pthread_setspecific(handler_key, env->parent); + g_static_private_set (&handler_key, env->parent, NULL); longjmp(env->env, ex->id); } else { fprintf(stderr, "\nUncaught exception: %s\n", ex->desc); @@ -67,13 +66,13 @@ camel_exception_throw(gint id, gchar *fmt, ...) void camel_exception_drop(struct _CamelExceptionEnv *env) { - pthread_setspecific(handler_key, env->parent); + g_static_private_set (&handler_key, env->parent, NULL); } void camel_exception_done(struct _CamelExceptionEnv *env) { - pthread_setspecific(handler_key, env->parent); + g_static_private_set (&handler_key, env->parent, NULL); if (env->ex != NULL) { camel_exception_free(env->ex); } diff --git a/camel/providers/local/camel-local-private.h b/camel/providers/local/camel-local-private.h index c958e92..2b3f7db 100644 --- a/camel/providers/local/camel-local-private.h +++ b/camel/providers/local/camel-local-private.h @@ -31,7 +31,6 @@ #endif #include -#include G_BEGIN_DECLS diff --git a/camel/providers/nntp/camel-nntp-newsrc.c b/camel/providers/nntp/camel-nntp-newsrc.c index 0167ea4..3be4004 100644 --- a/camel/providers/nntp/camel-nntp-newsrc.c +++ b/camel/providers/nntp/camel-nntp-newsrc.c @@ -26,7 +26,6 @@ #include #include -#include #include #include #include diff --git a/camel/tests/folder/test10.c b/camel/tests/folder/test10.c index 1cc00e1..ad41cad 100644 --- a/camel/tests/folder/test10.c +++ b/camel/tests/folder/test10.c @@ -1,7 +1,6 @@ /* threaded folder testing */ #include -#include #include "camel-test.h" #include "camel-test-provider.h" @@ -56,7 +55,7 @@ gint main(gint argc, gchar **argv) { CamelException *ex; gint i, j; - pthread_t threads[MAX_THREADS]; + GThread *threads[MAX_THREADS]; camel_test_init(argc, argv); camel_test_provider_init(1, local_drivers); @@ -79,11 +78,19 @@ gint main(gint argc, gchar **argv) camel_test_push("provider %s", local_providers[j]); path = g_strdup_printf("%s:///tmp/camel-test/%s", local_providers[j], local_providers[j]); - for (i=0;imessage); + g_error_free (error); + } + } + + for (i = 0; i < MAX_THREADS; i++) { + if (threads[i]) + g_thread_join (threads[i]); test_free(path); diff --git a/camel/tests/folder/test11.c b/camel/tests/folder/test11.c index 8ef40f9..9875667 100644 --- a/camel/tests/folder/test11.c +++ b/camel/tests/folder/test11.c @@ -2,7 +2,6 @@ /* threaded folder testing */ #include -#include #include "camel-test.h" #include "camel-test-provider.h" diff --git a/camel/tests/folder/test8.c b/camel/tests/folder/test8.c index 1368d18..e50ae24 100644 --- a/camel/tests/folder/test8.c +++ b/camel/tests/folder/test8.c @@ -1,7 +1,6 @@ /* threaded folder testing */ #include -#include #include "camel-test.h" #include "camel-test-provider.h" @@ -68,7 +67,7 @@ worker(gpointer d) /* we add a message, search for it, twiddle some flags, delete it */ /* and flat out */ for (i=0;ifolder, id+i); sub = g_strdup_printf("(match-all (header-contains \"subject\" \"message %08x subject\"))", id+i); @@ -126,7 +125,7 @@ gint main(gint argc, gchar **argv) gint i, j, index; gchar *path; CamelStore *store; - pthread_t threads[MAX_THREADS]; + GThread *threads[MAX_THREADS]; struct _threadinfo *info; CamelFolder *folder; GPtrArray *uids; @@ -160,16 +159,25 @@ gint main(gint argc, gchar **argv) CAMEL_STORE_FOLDER_CREATE|CAMEL_STORE_FOLDER_BODY_INDEX, ex); check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex)); - for (i=0;iid = i*MAX_MESSAGES; info->folder = folder; - pthread_create(&threads[i], 0, worker, info); + + threads[i] = g_thread_create (worker, info, TRUE, &error); + if (error) { + fprintf (stderr, "%s: Failed to create a thread: %s\n", G_STRFUNC, error->message); + g_error_free (error); + } } - for (i=0;i #include #include -#include #include #include #include @@ -13,14 +12,10 @@ /* well i dunno, doesn't seem to be in the headers but hte manpage mentions it */ /* a nonportable checking mutex for glibc, not really needed, just validates the test harness really */ -# ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP -static pthread_mutex_t lock = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; -# else -static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; -# endif -#define CAMEL_TEST_LOCK pthread_mutex_lock(&lock) -#define CAMEL_TEST_UNLOCK pthread_mutex_unlock(&lock) -#define CAMEL_TEST_ID (pthread_self()) +static GStaticMutex lock = G_STATIC_MUTEX_INIT; +#define CAMEL_TEST_LOCK g_static_mutex_lock(&lock) +#define CAMEL_TEST_UNLOCK g_static_mutex_unlock(&lock) +#define CAMEL_TEST_ID (g_thread_self()) static gint setup; static gint ok; @@ -43,11 +38,11 @@ static GHashTable *info_table; gint camel_test_verbose; static void -dump_action(gint id, struct _state *s, gpointer d) +dump_action (GThread *thread, struct _state *s, gpointer d) { struct _stack *node; - printf("\nThread %d:\n", id); + printf("\nThread %p:\n", thread); node = s->state; if (node) { @@ -86,10 +81,10 @@ current_state(void) if (info_table == NULL) info_table = g_hash_table_new(0, 0); - info = g_hash_table_lookup(info_table, (gpointer)CAMEL_TEST_ID); + info = g_hash_table_lookup(info_table, CAMEL_TEST_ID); if (info == NULL) { info = g_malloc0(sizeof(*info)); - g_hash_table_insert(info_table, (gpointer)CAMEL_TEST_ID, info); + g_hash_table_insert(info_table, CAMEL_TEST_ID, info); } return info; } diff --git a/configure.ac b/configure.ac index cf26184..898c0f4 100644 --- a/configure.ac +++ b/configure.ac @@ -597,7 +597,7 @@ dnl check if pkg-config files exist (which are only shipped by distributions, no CFLAGS_save="$CFLAGS" LDFLAGS_save="$LDFLAGS" LIBS_save="$LIBS" - nsprlibs="$DL_LIB -lplc4 -lplds4 -lnspr4 $PTHREAD_LIB" + nsprlibs="$DL_LIB -lplc4 -lplds4 -lnspr4" CFLAGS="$CFLAGS $MANUAL_NSPR_CFLAGS" LIBS="$nsprlibs" @@ -1119,23 +1119,6 @@ dnl ****************************** dnl Posix thread support dnl ****************************** -dnl GLIB_CONFIG=${GLIB_CONFIG-glib-config} -dnl GNOME_PTHREAD_CHECK - -dnl if test "x$PTHREAD_LIB" = "x" ; then -dnl AC_MSG_ERROR([POSIX threads are currently required for Evolution]) -dnl fi - -dnl Notice that this is a hack, and we wont be able to use this forever, but -dnl at least for some time - -EVO_PTHREAD_CHECK - -THREADS_LIBS="$PTHREAD_LIB" -THREADS_CFLAGS="$PTHREAD_CFLAGS" - -AC_SUBST(THREADS_LIBS) -AC_SUBST(THREADS_CFLAGS) AC_DEFINE(ENABLE_THREADS,1,[Required]) dnl ****************************** @@ -1183,7 +1166,7 @@ dnl libedataserver flags dnl ****************************** E_DATA_SERVER_DEPS="libxml-2.0 gthread-2.0 libsoup-2.4 gconf-2.0 $mozilla_nspr" -EVO_SET_COMPILE_FLAGS(E_DATA_SERVER, $E_DATA_SERVER_DEPS, $THREADS_CFLAGS $MANUAL_NSPR_CFLAGS, $THREADS_LIBS $MANUAL_NSPR_LIBS) +EVO_SET_COMPILE_FLAGS(E_DATA_SERVER, $E_DATA_SERVER_DEPS, $MANUAL_NSPR_CFLAGS, $MANUAL_NSPR_LIBS) AC_SUBST(E_DATA_SERVER_CFLAGS) AC_SUBST(E_DATA_SERVER_LIBS) @@ -1192,7 +1175,7 @@ dnl libedataserverui dnl ****************************** E_DATA_SERVER_UI_DEPS="gtk+-2.0 libxml-2.0 gobject-2.0 gthread-2.0 gconf-2.0 $GNOME_KEYRING_REQUIREMENT" -EVO_SET_COMPILE_FLAGS(E_DATA_SERVER_UI, $E_DATA_SERVER_UI_DEPS, $THREADS_CFLAGS, $THREADS_LIBS) +EVO_SET_COMPILE_FLAGS(E_DATA_SERVER_UI, $E_DATA_SERVER_UI_DEPS, , ) AC_SUBST(E_DATA_SERVER_UI_CFLAGS) AC_SUBST(E_DATA_SERVER_UI_LIBS) @@ -1322,7 +1305,7 @@ fi AM_CONDITIONAL(ENABLE_LARGEFILE, [test "x$enable_largefile" = "xyes"]) -EVO_SET_COMPILE_FLAGS(CAMEL, $mozilla_nss gio-2.0 sqlite3 >= sqlite_minimum_version gthread-2.0, $THREADS_CFLAGS $KRB5_CFLAGS $MANUAL_NSS_CFLAGS $LARGEFILE_CFLAGS, -lz $THREADS_LIBS $KRB5_LIBS $MANUAL_NSS_LIBS) +EVO_SET_COMPILE_FLAGS(CAMEL, $mozilla_nss gio-2.0 sqlite3 >= sqlite_minimum_version gthread-2.0, $KRB5_CFLAGS $MANUAL_NSS_CFLAGS $LARGEFILE_CFLAGS, -lz $KRB5_LIBS $MANUAL_NSS_LIBS) AC_SUBST(CAMEL_CFLAGS) AC_SUBST(CAMEL_LIBS) AC_SUBST(CAMEL_GROUPWISE_CFLAGS) diff --git a/libedataserver/e-data-server-util.c b/libedataserver/e-data-server-util.c index cb2f780..f4a95f1 100644 --- a/libedataserver/e-data-server-util.c +++ b/libedataserver/e-data-server-util.c @@ -398,23 +398,17 @@ e_utf8_strftime(gchar *s, gsize max, const gchar *fmt, const struct tm *tm) } /** - * e_util_pthread_id: - * @t: A pthread_t value + * e_util_gthread_id: + * @thread: A #GThread pointer * * Returns a 64-bit integer hopefully uniquely identifying the - * thread. To be used in debugging output and logging only. To test - * whether two pthread_t values refer to the same thread, use - * pthread_equal(). + * thread. To be used in debugging output and logging only. + * The returned value is just a cast of a pointer to the 64-bit integer. * - * There is no guarantee that calling e_util_pthread_id() on one + * There is no guarantee that calling e_util_gthread_id() on one * thread first and later after that thread has dies on another won't * return the same integer. * - * On some platforms it might even be that when called two times on - * the same thread's pthread_t (with some pthread API calls inbetween) - * we will return different values (this of course makes this function - * rather useless on such platforms). - * * On Linux and Win32, known to really return a unique id for each * thread existing at a certain time. No guarantee that ids won't be * reused after a thread has terminated, though. @@ -422,35 +416,13 @@ e_utf8_strftime(gchar *s, gsize max, const gchar *fmt, const struct tm *tm) * Returns: A 64-bit integer. */ guint64 -e_util_pthread_id (pthread_t t) +e_util_gthread_id (GThread *thread) { -#ifdef HAVE_GUINT64_CASTABLE_PTHREAD_T - /* We know that pthread_t is an integral type, or at least - * castable to such without loss of precision. - */ - return (guint64) t; -#elif defined (PTW32_VERSION) - /* pthreads-win32 implementation on Windows: Return the - * pointer to the "actual object" (see pthread.h) - */ #if GLIB_SIZEOF_VOID_P == 8 /* 64-bit Windows */ - return (guint64) t.p; -#else - return (gint) t.p; -#endif + return (guint64) thread; #else - /* Just return a checksum of the contents of the pthread_t */ - { - guint64 retval = 0; - guchar *const tend = (guchar *) ((&t)+1); - guchar *tp = (guchar *) &t; - - while (tp < tend) - retval = (retval << 5) - retval * *tp++; - - return retval; - } + return (gint) thread; #endif } diff --git a/libedataserver/e-data-server-util.h b/libedataserver/e-data-server-util.h index 45eed67..8c1139f 100644 --- a/libedataserver/e-data-server-util.h +++ b/libedataserver/e-data-server-util.h @@ -22,7 +22,6 @@ #ifndef __E_DATA_SERVER_UTIL_H__ #define __E_DATA_SERVER_UTIL_H__ -#include #include #include @@ -36,7 +35,7 @@ const gchar *e_util_utf8_strstrcase (const gchar *haystack, const gchar *needle) const gchar *e_util_utf8_strstrcasedecomp (const gchar *haystack, const gchar *needle); gint e_util_utf8_strcasecmp (const gchar *s1, const gchar *s2); gchar *e_util_utf8_remove_accents (const gchar *str); -guint64 e_util_pthread_id (pthread_t t); +guint64 e_util_gthread_id (GThread *thread); void e_filename_make_safe (gchar *string); gsize e_utf8_strftime(gchar *s, gsize max, const gchar *fmt, const struct tm *tm); diff --git a/m4/evo_pthread_check.m4 b/m4/evo_pthread_check.m4 deleted file mode 100644 index 5a96fc5..0000000 --- a/m4/evo_pthread_check.m4 +++ /dev/null @@ -1,16 +0,0 @@ -dnl EVO_PTHREAD_CHECK -#serial 0.1 -AC_DEFUN([EVO_PTHREAD_CHECK],[ - PTHREAD_LIB="" - AC_CHECK_LIB(pthread, pthread_create, [PTHREAD_LIB="-lpthread"], - [AC_CHECK_LIB(pthreads, pthread_create, [PTHREAD_LIB="-lpthreads"], - [AC_CHECK_LIB(c_r, pthread_create, [PTHREAD_LIB="-lc_r"], - [AC_CHECK_LIB(pthread, __pthread_attr_init_system, [PTHREAD_LIB="-lpthread"], - [AC_CHECK_FUNC(pthread_create)] - )] - )] - )] - ) - AC_SUBST(PTHREAD_LIB) - AC_PROVIDE([EVO_PTHREAD_CHECK]) -]) -- 2.7.4