Threading libsmbclient - a proposal.

Howard Chu hyc at
Sat Apr 4 17:53:12 GMT 2009

Volker Lendecke wrote:
> On Sat, Apr 04, 2009 at 10:23:26AM -0700, Howard Chu wrote:
>> If you're looking at it from a really low-level view (which I guess you
>> are, since you tried cachegrind) then you have to remember that compiler
>> hints like "unlikely" can't help you all that much. The compiler tries to
>> arrange static branch prediction to keep the most-likely path inline, and
>> branch to the less-likely path. But in this case, it still has to branch
>> around the not-taken path, so the compiler hint doesn't help the code
>> density at all.
> We'll have to test all this, for sure.

Stepping back a bit, in the context of the mutex functions, there's another 
consideration. Jeremy was talking about allocating an array of global locks, 
which makes good sense. But if the caller hasn't initialized the mutex 
methods, then that array will most likely be NULL, and calling a dummy mutex 
function unconditionally will still mean dereferencing a NULL pointer to give 
it the expected mutex.

So for sanity's sake, this route is better...

+#define        MUTEX_LOCK(x)   (_tdb_mutex_methods ? 
_tdb_mutex_methods->tmm_lock(x) : 0 )
+#define        MUTEX_UNLOCK(x) (_tdb_mutex_methods ? 
_tdb_mutex_methods->tmm_unlock(x) : 0 )
+#define        MUTEX_TRYLOCK(x)        (_tdb_mutex_methods ? 
_tdb_mutex_methods->tmm_trylock(x) : 0 )

+/* Callbacks that must be set for mutex/thread safety */
+typedef int (tdb_mutex_op)(void * mutex);
+typedef void *(tdb_mutex_create)(int num);
+typedef void (tdb_mutex_destroy)(void *mutex, int num);
+struct tdb_mutex_methods {
+       tdb_mutex_create *tmm_create;
+	tdb_mutex_destroy *tmm_destroy;
+       tdb_mutex_op *tmm_lock;
+       tdb_mutex_op *tmm_unlock;
+       tdb_mutex_op *tmm_trylock;
+int tdb_set_mutex(struct tdb_mutex_methods *methods);
+struct tdb_mutex_methods *tdb_get_mutex(void);

+struct tdb_mutex_methods *_tdb_mutex_methods = NULL;
+int tdb_set_mutex(struct tdb_mutex_methods *methods)
+       if (!methods)
+               return TDB_ERR_EINVAL;
+       if (_tdb_mutex_methods)
+               return TDB_ERR_EXISTS;
+       if (!methods->tmm_create ||
+               !methods->tmm_lock ||
+               !methods->tmm_unlock ||
+               !methods->tmm_trylock ||
+               !methods->tmm_destroy)
+               return TDB_ERR_EINVAL;
+       tdbs_mutex = methods->tmm_create(1);
+       if (!tdbs_mutex)
+               return TDB_ERR_OOM;
+       _tdb_mutex_methods = methods;
+       return TDB_SUCCESS;

   -- Howard Chu
   CTO, Symas Corp. 
   Director, Highland Sun
   Chief Architect, OpenLDAP

More information about the samba-technical mailing list