diff options
Diffstat (limited to 'src/backend/storage/ipc/shmqueue.c')
-rw-r--r-- | src/backend/storage/ipc/shmqueue.c | 154 |
1 files changed, 37 insertions, 117 deletions
diff --git a/src/backend/storage/ipc/shmqueue.c b/src/backend/storage/ipc/shmqueue.c index 3e3b3a73b6b..24542e7b63a 100644 --- a/src/backend/storage/ipc/shmqueue.c +++ b/src/backend/storage/ipc/shmqueue.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/storage/ipc/shmqueue.c,v 1.31 2008/01/01 19:45:51 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/storage/ipc/shmqueue.c,v 1.32 2008/11/02 21:24:52 tgl Exp $ * * NOTES * @@ -27,12 +27,6 @@ #include "storage/shmem.h" -/*#define SHMQUEUE_DEBUG*/ - -#ifdef SHMQUEUE_DEBUG -static void dumpQ(SHM_QUEUE *q, char *s); -#endif - /* * ShmemQueueInit -- make the head of a new queue point @@ -41,8 +35,8 @@ static void dumpQ(SHM_QUEUE *q, char *s); void SHMQueueInit(SHM_QUEUE *queue) { - Assert(SHM_PTR_VALID(queue)); - (queue)->prev = (queue)->next = MAKE_OFFSET(queue); + Assert(ShmemAddrIsValid(queue)); + queue->prev = queue->next = queue; } /* @@ -53,8 +47,8 @@ SHMQueueInit(SHM_QUEUE *queue) bool SHMQueueIsDetached(SHM_QUEUE *queue) { - Assert(SHM_PTR_VALID(queue)); - return (queue)->prev == INVALID_OFFSET; + Assert(ShmemAddrIsValid(queue)); + return (queue->prev == NULL); } #endif @@ -64,8 +58,8 @@ SHMQueueIsDetached(SHM_QUEUE *queue) void SHMQueueElemInit(SHM_QUEUE *queue) { - Assert(SHM_PTR_VALID(queue)); - (queue)->prev = (queue)->next = INVALID_OFFSET; + Assert(ShmemAddrIsValid(queue)); + queue->prev = queue->next = NULL; } /* @@ -75,21 +69,17 @@ SHMQueueElemInit(SHM_QUEUE *queue) void SHMQueueDelete(SHM_QUEUE *queue) { - SHM_QUEUE *nextElem = (SHM_QUEUE *) MAKE_PTR((queue)->next); - SHM_QUEUE *prevElem = (SHM_QUEUE *) MAKE_PTR((queue)->prev); + SHM_QUEUE *nextElem = queue->next; + SHM_QUEUE *prevElem = queue->prev; - Assert(SHM_PTR_VALID(queue)); - Assert(SHM_PTR_VALID(nextElem)); - Assert(SHM_PTR_VALID(prevElem)); + Assert(ShmemAddrIsValid(queue)); + Assert(ShmemAddrIsValid(nextElem)); + Assert(ShmemAddrIsValid(prevElem)); -#ifdef SHMQUEUE_DEBUG - dumpQ(queue, "in SHMQueueDelete: begin"); -#endif - - prevElem->next = (queue)->next; - nextElem->prev = (queue)->prev; + prevElem->next = queue->next; + nextElem->prev = queue->prev; - (queue)->prev = (queue)->next = INVALID_OFFSET; + queue->prev = queue->next = NULL; } /* @@ -100,24 +90,15 @@ SHMQueueDelete(SHM_QUEUE *queue) void SHMQueueInsertBefore(SHM_QUEUE *queue, SHM_QUEUE *elem) { - SHM_QUEUE *prevPtr = (SHM_QUEUE *) MAKE_PTR((queue)->prev); - SHMEM_OFFSET elemOffset = MAKE_OFFSET(elem); - - Assert(SHM_PTR_VALID(queue)); - Assert(SHM_PTR_VALID(elem)); + SHM_QUEUE *prevPtr = queue->prev; -#ifdef SHMQUEUE_DEBUG - dumpQ(queue, "in SHMQueueInsertBefore: begin"); -#endif - - (elem)->next = prevPtr->next; - (elem)->prev = queue->prev; - (queue)->prev = elemOffset; - prevPtr->next = elemOffset; + Assert(ShmemAddrIsValid(queue)); + Assert(ShmemAddrIsValid(elem)); -#ifdef SHMQUEUE_DEBUG - dumpQ(queue, "in SHMQueueInsertBefore: end"); -#endif + elem->next = prevPtr->next; + elem->prev = queue->prev; + queue->prev = elem; + prevPtr->next = elem; } /* @@ -129,24 +110,15 @@ SHMQueueInsertBefore(SHM_QUEUE *queue, SHM_QUEUE *elem) void SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem) { - SHM_QUEUE *nextPtr = (SHM_QUEUE *) MAKE_PTR((queue)->next); - SHMEM_OFFSET elemOffset = MAKE_OFFSET(elem); - - Assert(SHM_PTR_VALID(queue)); - Assert(SHM_PTR_VALID(elem)); - -#ifdef SHMQUEUE_DEBUG - dumpQ(queue, "in SHMQueueInsertAfter: begin"); -#endif + SHM_QUEUE *nextPtr = queue->next; - (elem)->prev = nextPtr->prev; - (elem)->next = queue->next; - (queue)->next = elemOffset; - nextPtr->prev = elemOffset; + Assert(ShmemAddrIsValid(queue)); + Assert(ShmemAddrIsValid(elem)); -#ifdef SHMQUEUE_DEBUG - dumpQ(queue, "in SHMQueueInsertAfter: end"); -#endif + elem->prev = nextPtr->prev; + elem->next = queue->next; + queue->next = elem; + nextPtr->prev = elem; } #endif /* NOT_USED */ @@ -159,15 +131,15 @@ SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem) * Next element is at curElem->next. If SHMQueue is part of * a larger structure, we want to return a pointer to the * whole structure rather than a pointer to its SHMQueue field. - * I.E. struct { + * For example, + * struct { * int stuff; * SHMQueue elem; * } ELEMType; - * When this element is in a queue, (prevElem->next) is struct.elem. + * When this element is in a queue, prevElem->next points at struct.elem. * We subtract linkOffset to get the correct start address of the structure. * * calls to SHMQueueNext should take these parameters: - * * &(queueHead), &(queueHead), offsetof(ELEMType, elem) * or * &(queueHead), &(curElem->elem), offsetof(ELEMType, elem) @@ -176,9 +148,9 @@ SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem) Pointer SHMQueueNext(SHM_QUEUE *queue, SHM_QUEUE *curElem, Size linkOffset) { - SHM_QUEUE *elemPtr = (SHM_QUEUE *) MAKE_PTR((curElem)->next); + SHM_QUEUE *elemPtr = curElem->next; - Assert(SHM_PTR_VALID(curElem)); + Assert(ShmemAddrIsValid(curElem)); if (elemPtr == queue) /* back to the queue head? */ return NULL; @@ -192,64 +164,12 @@ SHMQueueNext(SHM_QUEUE *queue, SHM_QUEUE *curElem, Size linkOffset) bool SHMQueueEmpty(SHM_QUEUE *queue) { - Assert(SHM_PTR_VALID(queue)); + Assert(ShmemAddrIsValid(queue)); - if (queue->prev == MAKE_OFFSET(queue)) + if (queue->prev == queue) { - Assert(queue->next = MAKE_OFFSET(queue)); + Assert(queue->next == queue); return TRUE; } return FALSE; } - -#ifdef SHMQUEUE_DEBUG - -static void -dumpQ(SHM_QUEUE *q, char *s) -{ - char elem[NAMEDATALEN]; - char buf[1024]; - SHM_QUEUE *start = q; - int count = 0; - - snprintf(buf, sizeof(buf), "q prevs: %lx", MAKE_OFFSET(q)); - q = (SHM_QUEUE *) MAKE_PTR(q->prev); - while (q != start) - { - snprintf(elem, sizeof(elem), "--->%lx", MAKE_OFFSET(q)); - strcat(buf, elem); - q = (SHM_QUEUE *) MAKE_PTR(q->prev); - if (q->prev == MAKE_OFFSET(q)) - break; - if (count++ > 40) - { - strcat(buf, "BAD PREV QUEUE!!"); - break; - } - } - snprintf(elem, sizeof(elem), "--->%lx", MAKE_OFFSET(q)); - strcat(buf, elem); - elog(DEBUG2, "%s: %s", s, buf); - - snprintf(buf, sizeof(buf), "q nexts: %lx", MAKE_OFFSET(q)); - count = 0; - q = (SHM_QUEUE *) MAKE_PTR(q->next); - while (q != start) - { - snprintf(elem, sizeof(elem), "--->%lx", MAKE_OFFSET(q)); - strcat(buf, elem); - q = (SHM_QUEUE *) MAKE_PTR(q->next); - if (q->next == MAKE_OFFSET(q)) - break; - if (count++ > 10) - { - strcat(buf, "BAD NEXT QUEUE!!"); - break; - } - } - snprintf(elem, sizeof(elem), "--->%lx", MAKE_OFFSET(q)); - strcat(buf, elem); - elog(DEBUG2, "%s: %s", s, buf); -} - -#endif /* SHMQUEUE_DEBUG */ |