viced: Abstract out hpr thread context code
authorSimon Wilkinson <sxw@your-file-system.com>
Thu, 10 May 2012 23:34:24 +0000 (00:34 +0100)
committerDerrick Brashear <shadow@dementix.org>
Thu, 14 Jun 2012 12:36:08 +0000 (05:36 -0700)
Every hpr lookup function had a copy of the same code to pull a thread
specific ubik context out of the pthread library, and to create one if
one wasn't already there.

Instead of endlessly repeating this code, create a small inline function
to do the job.

Change-Id: I7eac0eaebbd42978e40c90f0ce59b26f2e67d96d
Reviewed-on: http://gerrit.openafs.org/7558
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Alistair Ferguson <alistair.ferguson@mac.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>

src/viced/host.c

index 7a0afb2..21a27f1 100644 (file)
@@ -330,21 +330,34 @@ hpr_End(struct ubik_client *uclient)
     return code;
 }
 
+static_inline int
+getThreadClient(struct ubik_client **client)
+{
+    int code;
+
+    *client = pthread_getspecific(viced_uclient_key);
+    if (*client != NULL)
+       return 0;
+
+    code = hpr_Initialize(client);
+    if (code)
+       return code;
+
+    osi_Assert(pthread_setspecific(viced_uclient_key, *client) == 0);
+
+    return 0;
+}
+
 int
 hpr_GetHostCPS(afs_int32 host, prlist *CPS)
 {
     afs_int32 code;
     afs_int32 over;
-    struct ubik_client *uclient =
-       (struct ubik_client *)pthread_getspecific(viced_uclient_key);
+    struct ubik_client *uclient;
 
-    if (!uclient) {
-        code = hpr_Initialize(&uclient);
-       if (!code)
-           osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
-       else
-           return code;
-    }
+    code = getThreadClient(&uclient);
+    if (code)
+       return code;
 
     over = 0;
     code = ubik_PR_GetHostCPS(uclient, 0, host, CPS, &over);
@@ -365,16 +378,11 @@ hpr_NameToId(namelist *names, idlist *ids)
 {
     afs_int32 code;
     afs_int32 i;
-    struct ubik_client *uclient =
-       (struct ubik_client *)pthread_getspecific(viced_uclient_key);
+    struct ubik_client *uclient;
 
-    if (!uclient) {
-        code = hpr_Initialize(&uclient);
-       if (!code)
-           osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
-       else
-           return code;
-    }
+    code = getThreadClient(&uclient);
+    if (code)
+       return code;
 
     for (i = 0; i < names->namelist_len; i++)
         stolower(names->namelist_val[i]);
@@ -386,16 +394,11 @@ int
 hpr_IdToName(idlist *ids, namelist *names)
 {
     afs_int32 code;
-    struct ubik_client *uclient =
-       (struct ubik_client *)pthread_getspecific(viced_uclient_key);
+    struct ubik_client *uclient;
 
-    if (!uclient) {
-        code = hpr_Initialize(&uclient);
-       if (!code)
-           osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
-       else
-           return code;
-    }
+    code = getThreadClient(&uclient);
+    if (code)
+       return code;
 
     code = ubik_PR_IDToName(uclient, 0, ids, names);
     return code;
@@ -406,16 +409,11 @@ hpr_GetCPS(afs_int32 id, prlist *CPS)
 {
     afs_int32 code;
     afs_int32 over;
-    struct ubik_client *uclient =
-       (struct ubik_client *)pthread_getspecific(viced_uclient_key);
+    struct ubik_client *uclient;
 
-    if (!uclient) {
-        code = hpr_Initialize(&uclient);
-       if (!code)
-           osi_Assert(pthread_setspecific(viced_uclient_key, (void *)uclient) == 0);
-       else
-           return code;
-    }
+    code = getThreadClient(&uclient);
+    if (code)
+       return code;
 
     over = 0;
     code = ubik_PR_GetCPS(uclient, 0, id, CPS, &over);