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