File 0009-clean-up-semaphore-array-index-calculation.patch of Package sblim-sfcb

From 441bc5ea7fd160643521e1a4387d229b6914265f Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Klaus=20K=C3=A4mpf?= <kkaempf@suse.de>
Date: Wed, 22 Oct 2008 11:39:11 +0200
Subject: [PATCH] clean up semaphore array index calculation

- make constants recognizable as such
- provide macros for semaphore array index calculations
---
 msgqueue.c    |   14 +++++++-------
 msgqueue.h    |   21 +++++++++++++--------
 providerDrv.c |   44 ++++++++++++++++++++++----------------------
 providerMgr.c |    8 ++++----
 4 files changed, 46 insertions(+), 41 deletions(-)

diff --git a/msgqueue.c b/msgqueue.c
index 8834052..80e3354 100644
--- a/msgqueue.c
+++ b/msgqueue.c
@@ -130,20 +130,20 @@ int initSem(int https, int shttps, int provs)
    }
 
    sun.val=1;
-   semctl(sfcbSem,httpGuardId,SETVAL,sun);
+   semctl(sfcbSem,HTTP_GUARD_ID,SETVAL,sun);
    sun.val=https;
-   semctl(sfcbSem,httpProcsId,SETVAL,sun);
+   semctl(sfcbSem,HTTP_PROCS_ID,SETVAL,sun);
    sun.val=1;
-   semctl(sfcbSem,shttpGuardId,SETVAL,sun);
+   semctl(sfcbSem,SHTTP_GUARD_ID,SETVAL,sun);
    sun.val=shttps;
-   semctl(sfcbSem,shttpProcsId,SETVAL,sun);
+   semctl(sfcbSem,SHTTP_PROCS_ID,SETVAL,sun);
    
    for (i=0; i<provs; i++) {
       sun.val=1;
-      semctl(sfcbSem,(i*3)+provProcGuardId+provProcBaseId,SETVAL,sun);
+      semctl(sfcbSem,PROV_GUARD(i),SETVAL,sun);
       sun.val=0;
-      semctl(sfcbSem,(i*3)+provProcInuseId+provProcBaseId,SETVAL,sun);
-      semctl(sfcbSem,(i*3)+provProcAliveId+provProcBaseId,SETVAL,sun);
+      semctl(sfcbSem,PROV_INUSE(i),SETVAL,sun);
+      semctl(sfcbSem,PROV_ALIVE(i),SETVAL,sun);
    }      
    return 0;   
 }
diff --git a/msgqueue.h b/msgqueue.h
index 612cdb9..41b40c0 100644
--- a/msgqueue.h
+++ b/msgqueue.h
@@ -157,14 +157,19 @@ extern char *provPauseStr;
 extern int noHttpPause;
 extern char *httpPauseStr;
 
-#define httpGuardId 0
-#define httpProcsId 1
-#define shttpGuardId 2
-#define shttpProcsId 3
-#define provProcBaseId 4
-#define provProcGuardId 0
-#define provProcInuseId 1
-#define provProcAliveId 2
+/* relative Ids within the semaphore set */
+#define HTTP_GUARD_ID 0
+#define HTTP_PROCS_ID 1
+#define SHTTP_GUARD_ID 2
+#define SHTTP_PROCS_ID 3
+#define PROV_PROC_BASE_ID 4
+#define PROV_PROC_GUARD_ID 0
+#define PROV_PROC_INUSE_ID 1
+#define PROV_PROC_ALIVE_ID 2
+
+#define PROV_GUARD(id) ((id*3)+PROV_PROC_GUARD_ID+PROV_PROC_BASE_ID)
+#define PROV_INUSE(id) ((id*3)+PROV_PROC_INUSE_ID+PROV_PROC_BASE_ID)
+#define PROV_ALIVE(id) ((id*3)+PROV_PROC_ALIVE_ID+PROV_PROC_BASE_ID)
 
 extern ComSockets *sPairs;
 extern int ptBase,htBase,stBase,htMax,stMax;
diff --git a/providerDrv.c b/providerDrv.c
index 4299b4e..62aca9d 100644
--- a/providerDrv.c
+++ b/providerDrv.c
@@ -380,8 +380,8 @@ void* providerIdleThread()
          if (pInfo) {
             proc=curProvProc;
             if (proc) {
-               semAcquireUnDo(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId);
-               if ((val=semGetValue(sfcbSem,(proc->id*3)+provProcInuseId+provProcBaseId))==0) {            
+               semAcquireUnDo(sfcbSem,PROV_GUARD(proc->id));
+               if ((val=semGetValue(sfcbSem,PROV_INUSE(proc->id)))==0) {            
                   if ((now-proc->lastActivity)>provTimeoutInterval) {
                      ctx = native_new_CMPIContext(MEM_TRACKED,NULL);
                      noBreak=0;
@@ -416,7 +416,7 @@ void* providerIdleThread()
                      }
                   }
                }
-               semRelease(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId);
+               semRelease(sfcbSem,PROV_GUARD(proc->id));
             }      
          }
       }
@@ -536,9 +536,9 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc)
      for (i = 0; i < provProcMax; i++) {
        if ((provProc+i) && provProc[i].pid &&
            provProc[i].group && strcmp(provProc[i].group,info->group)==0) {
-         semAcquire(sfcbSem,(provProc[i].id*3)+provProcGuardId+provProcBaseId);
-         semRelease(sfcbSem,(provProc[i].id*3)+provProcInuseId+provProcBaseId);
-         semRelease(sfcbSem,(provProc[i].id*3)+provProcGuardId+provProcBaseId);
+         semAcquire(sfcbSem,PROV_GUARD(provProc[i].id));
+         semRelease(sfcbSem,PROV_INUSE(provProc[i].id));
+         semRelease(sfcbSem,PROV_GUARD(provProc[i].id));
          info->pid=provProc[i].pid;
          info->providerSockets=provProc[i].providerSockets;
          _SFCB_TRACE(1,("--- Process %d shared by %s and %s",provProc[i].pid,info->providerName,
@@ -593,12 +593,12 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc)
             info->proc=*proc;
             info->pid=currentProc; 
                          
-            semSetValue(sfcbSem,((*proc)->id*3)+provProcGuardId+provProcBaseId,0);
-            semSetValue(sfcbSem,((*proc)->id*3)+provProcInuseId+provProcBaseId,0);
-            semSetValue(sfcbSem,((*proc)->id*3)+provProcAliveId+provProcBaseId,0);
-            semReleaseUnDo(sfcbSem,((*proc)->id*3)+provProcAliveId+provProcBaseId);
-            semReleaseUnDo(sfcbSem,((*proc)->id*3)+provProcInuseId+provProcBaseId);
-            semRelease(sfcbSem,((*proc)->id*3)+provProcGuardId+provProcBaseId);
+            semSetValue(sfcbSem,PROV_GUARD((*proc)->id),0);
+            semSetValue(sfcbSem,PROV_INUSE((*proc)->id),0);
+            semSetValue(sfcbSem,PROV_ALIVE((*proc)->id),0);
+            semReleaseUnDo(sfcbSem,PROV_ALIVE((*proc)->id));
+            semReleaseUnDo(sfcbSem,PROV_INUSE((*proc)->id));
+            semRelease(sfcbSem,PROV_GUARD((*proc)->id));
             
             processProviderInvocationRequests(info->providerName);
             _SFCB_RETURN(0);
@@ -628,15 +628,15 @@ int forkProvider(ProviderInfo * info, OperationHdr * req, char **msg)
 
    if (info->pid ) {
       proc=info->proc;
-      semAcquire(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId);
-      if ((val=semGetValue(sfcbSem,(proc->id*3)+provProcAliveId+provProcBaseId))) {
-         semRelease(sfcbSem,(proc->id*3)+provProcInuseId+provProcBaseId);
-         semRelease(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId);
+      semAcquire(sfcbSem,PROV_GUARD(proc->id));
+      if ((val=semGetValue(sfcbSem,PROV_ALIVE(proc->id)))) {
+         semRelease(sfcbSem,PROV_INUSE(proc->id));
+         semRelease(sfcbSem,PROV_GUARD(proc->id));
          _SFCB_TRACE(1, ("--- Provider %s still loaded",info->providerName));
          _SFCB_RETURN(CMPI_RC_OK)
       }
 
-      semRelease(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId);
+      semRelease(sfcbSem,PROV_GUARD(proc->id));
       _SFCB_TRACE(1, ("--- Provider has been unloaded prevously, will reload"));
       
       info->pid=0;
@@ -2377,7 +2377,7 @@ static BinResponseHdr *loadProvider(BinRequestHdr * hdr, ProviderInfo * info, in
    BinResponseHdr *resp;
    char dlName[512];
 
-   _SFCB_TRACE(1, ("--- Loading Provide %s %s %s", (char *) req->className.data,
+   _SFCB_TRACE(1, ("--- Loading provider %s %s %s", (char *) req->className.data,
                 (char *) req->provName.data, (char *) req->libName.data));
 
    info = (ProviderInfo *) calloc(1, sizeof(*info));
@@ -2518,7 +2518,7 @@ static void *processProviderInvocationRequestsThread(void *prms)
    int i,requestor=0,initRc=0;
 
    _SFCB_ENTER(TRACE_PROVIDERDRV, "processProviderInvocationRequestsThread");
- 
+
    for (i = 0; i < req->count; i++)
       if (req->object[i].length)
          req->object[i].data=(void*)((long)req->object[i].data+(char*)req);
@@ -2567,7 +2567,7 @@ static void *processProviderInvocationRequestsThread(void *prms)
    }
    
    else {
-      _SFCB_TRACE(1, ("--- Provider request for %s %p %x",
+      _SFCB_TRACE(1, ("--- Provider request for op:%s pInfo:%p prov:%x",
         opsName[req->operation],pInfo,req->provId));
 
       if (req->flags & FL_chunked) requestor=parms->requestor;
@@ -2673,7 +2673,7 @@ void processProviderInvocationRequests(char *name)
 
    debugMode=pauseProvider(name);
    for (;;) {
-      _SFCB_TRACE(1, ("--- Waiting for provider request to %d-%lu",
+      _SFCB_TRACE(1, ("--- Waiting for provider request to R%d-%lu",
                    providerSockets.receive,getInode(providerSockets.receive)));
       parms = (Parms *) malloc(sizeof(*parms));
       
@@ -2683,7 +2683,7 @@ void processProviderInvocationRequests(char *name)
 	int debug_break = 0;
          if (rc!=0)mlogf(M_ERROR,M_SHOW,"oops\n");               
 
-         _SFCB_TRACE(1, ("--- Got something %d-%p on %d-%lu", 
+         _SFCB_TRACE(1, ("--- Got something op:%d-prov:%p on R%d-%lu", 
             parms->req->operation,parms->req->provId,
             providerSockets.receive,getInode(providerSockets.receive)));
 
diff --git a/providerMgr.c b/providerMgr.c
index 595c8e7..99e0292 100644
--- a/providerMgr.c
+++ b/providerMgr.c
@@ -922,10 +922,10 @@ static void setInuseSem(void *id)
 
    ids.ids=id;
 
-   semAcquire(sfcbSem,(ids.procId*3)+provProcGuardId+provProcBaseId);
-   semAcquire(sfcbSem,(ids.procId*3)+provProcInuseId+provProcBaseId);
-   semReleaseUnDo(sfcbSem,(ids.procId*3)+provProcInuseId+provProcBaseId);
-   semRelease(sfcbSem,(ids.procId*3)+provProcGuardId+provProcBaseId);
+   semAcquire(sfcbSem,PROV_GUARD(ids.procId));
+   semAcquire(sfcbSem,PROV_INUSE(ids.procId));
+   semReleaseUnDo(sfcbSem,PROV_INUSE(ids.procId));
+   semRelease(sfcbSem,PROV_GUARD(ids.procId));
    _SFCB_EXIT();
 }
 
-- 
1.6.0.2

openSUSE Build Service is sponsored by