# HG changeset patch # User Merten Sach # Date 1329157932 -3600 # Node ID 677afc259a58ad27ac96a3806b820b508c1cac7e # Parent 7c9e00ff1bf452be98dce61cfa42c01939964d7d fix branch to compile with new folder structure diff -r 7c9e00ff1bf4 -r 677afc259a58 BlockingQueue.c --- a/BlockingQueue.c Wed Jun 22 18:49:17 2011 +0200 +++ b/BlockingQueue.c Mon Feb 13 19:32:12 2012 +0100 @@ -13,7 +13,7 @@ #include #include "BlockingQueue.h" -#include "../vmalloc.h" +#include "VMS_Implementations/VMS_impl/vmalloc.h" #define INC(x) (++x == 1024) ? (x) = 0 : (x) @@ -26,7 +26,7 @@ { PThdQueueStruc* retQ; int retCode; - retQ = (PThdQueueStruc *) VMS__malloc( sizeof( PThdQueueStruc ) ); + retQ = (PThdQueueStruc *) VMS_int__malloc( sizeof( PThdQueueStruc ) ); retCode = @@ -118,7 +118,7 @@ CASQueueStruc* makeCASQ() { CASQueueStruc* retQ; - retQ = (CASQueueStruc *) VMS__malloc( sizeof( CASQueueStruc ) ); + retQ = (CASQueueStruc *) VMS_int__malloc( sizeof( CASQueueStruc ) ); retQ->insertLock = UNLOCKED; retQ->extractLock= UNLOCKED; @@ -243,7 +243,7 @@ SRSWQueueStruc* makeSRSWQ() { SRSWQueueStruc* retQ; - retQ = (SRSWQueueStruc *) VMS__malloc( sizeof( SRSWQueueStruc ) ); + retQ = (SRSWQueueStruc *) VMS_int__malloc( sizeof( SRSWQueueStruc ) ); retQ->extractPos = &(retQ->startOfData[0]); //side by side == empty retQ->insertPos = &(retQ->startOfData[1]); // so start pos's have to be @@ -255,7 +255,7 @@ void freeSRSWQ( SRSWQueueStruc* Q ) { - VMS__free( Q ); + VMS_int__free( Q ); } void* readSRSWQ( SRSWQueueStruc* Q ) @@ -380,11 +380,11 @@ SRMWQueueStruc* makeSRMWQ() { SRMWQueueStruc* retQ; - retQ = (SRMWQueueStruc *) VMS__malloc( sizeof( SRMWQueueStruc ) ); + retQ = (SRMWQueueStruc *) VMS_int__malloc( sizeof( SRMWQueueStruc ) ); retQ->numInternalQs = 0; retQ->internalQsSz = 10; - retQ->internalQs = VMS__malloc( retQ->internalQsSz * + retQ->internalQs = VMS_int__malloc( retQ->internalQsSz * sizeof(SRSWQueueStruc *) ); retQ->lastQReadFrom = 0; @@ -411,11 +411,11 @@ oldSz = Q->internalQsSz; oldArray = Q->internalQs; Q->internalQsSz *= 2; - Q->internalQs = VMS__malloc( Q->internalQsSz * sizeof(SRSWQueueStruc *)); + Q->internalQs = VMS_int__malloc( Q->internalQsSz * sizeof(SRSWQueueStruc *)); for( i = 0; i < oldSz; i++ ) { Q->internalQs[i] = oldArray[i]; } - VMS__free( oldArray ); + VMS_int__free( oldArray ); } Q->internalQs[ Q->numInternalQs - 1 ] = makeSRSWQ(); return Q->numInternalQs - 1; diff -r 7c9e00ff1bf4 -r 677afc259a58 PrivateQueue.c --- a/PrivateQueue.c Wed Jun 22 18:49:17 2011 +0200 +++ b/PrivateQueue.c Mon Feb 13 19:32:12 2012 +0100 @@ -1,203 +1,203 @@ -/* - * Copyright 2009 OpenSourceStewardshipFoundation.org - * Licensed under GNU General Public License version 2 - * - * Author: seanhalle@yahoo.com - */ - - -#include -#include -#include -#include - -#include "PrivateQueue.h" -#include "../vmalloc.h" - - - -//=========================================================================== - -/*This kind of queue is private to a single core at a time -- has no - * synchronizations - */ - -PrivQueueStruc* makeVMSPrivQ() - { - PrivQueueStruc *retQ; - retQ = VMS__malloc( sizeof( PrivQueueStruc ) ); - retQ->startOfData = (void*)VMS__malloc( 1024 * sizeof(void *) ); - memset( retQ->startOfData, 0, 1024 ); - - retQ->extractPos = &(retQ->startOfData[0]); //side by side == empty - retQ->insertPos = &(retQ->startOfData[1]); // so start pos's have to be - retQ->endOfData = &(retQ->startOfData[1023]); - - return retQ; - } - - -void -enlargePrivQ( PrivQueueStruc *Q ) - { size_t oldSize, newSize; - void **oldStartOfData; - - oldSize = Q->endOfData - Q->startOfData + 1; - newSize = 2 * oldSize; - oldStartOfData = Q->startOfData; - Q->startOfData = VMS__malloc( newSize * sizeof(void*)); - //copy second half - size_t secondHalfSize = Q->endOfData - Q->extractPos + 1; - memcpy(Q->startOfData,Q->extractPos, secondHalfSize * sizeof(void*)); - //copy first half - memcpy(Q->startOfData + secondHalfSize, oldStartOfData, - (oldSize-secondHalfSize) * sizeof(void*)); - VMS__free(oldStartOfData); - - Q->extractPos = Q->startOfData; - Q->insertPos = Q->startOfData + oldSize - 1; - Q->endOfData = &(Q->startOfData[newSize - 1]); - } - - -/*Returns NULL when queue is empty - */ -void* readPrivQ( PrivQueueStruc* Q ) - { void *out = 0; - void **startOfData = Q->startOfData; - void **endOfData = Q->endOfData; - - void **insertPos = Q->insertPos; - void **extractPos = Q->extractPos; - - //if not empty -- (extract is just below insert when empty) - if( insertPos - extractPos != 1 && - !(extractPos == endOfData && insertPos == startOfData)) - { //move before read - if( extractPos == endOfData ) //write new pos exactly once, correctly - { Q->extractPos = startOfData; //can't overrun then fix it 'cause - } // other thread might read bad pos - else - { Q->extractPos++; - } - out = *(Q->extractPos); - return out; - } - //Q is empty - return NULL; - } - -int32 -numInPrivQ( PrivQueueStruc *Q ) - { int32 size, numIn; - - if( Q->insertPos < Q->extractPos ) - { //insert has wrapped around so numIn is: - // insertPos + size - extractPos -- Consider, is empty when - // extractPos = endOfData and insert = start -- correctly get zero - size = Q->endOfData - Q->startOfData; - numIn = Q->insertPos + size - Q->extractPos; - } - else - { - numIn = Q->insertPos - Q->extractPos -1;//-1 bec empty @ side-by-side - } - return numIn; - } - - -/*Expands the queue size automatically when it's full - */ -void -writePrivQ( void * in, PrivQueueStruc* Q ) - { - while(1){ - void **startOfData = Q->startOfData; - void **endOfData = Q->endOfData; - - void **insertPos = Q->insertPos; - void **extractPos = Q->extractPos; - - //Full? (insert is just below extract when full) - if( extractPos - insertPos != 1 && - !(insertPos == endOfData && extractPos == startOfData)) - { *(Q->insertPos) = in; //insert before move - if( insertPos == endOfData ) //write new pos exactly once, correctly - { Q->insertPos = startOfData; - } - else - { Q->insertPos++; - } - return; - } - //Q is full - enlargePrivQ( Q ); - } - } - - -/*Returns false when the queue was full. - * have option of calling make_larger_PrivQ to make more room, then try again - */ -int writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ) - { - void **startOfData = Q->startOfData; - void **endOfData = Q->endOfData; - - void **insertPos = Q->insertPos; - void **extractPos = Q->extractPos; - - if( extractPos - insertPos != 1 && - !(insertPos == endOfData && extractPos == startOfData)) - { *(Q->insertPos) = in; //insert before move - if( insertPos == endOfData ) //write new pos exactly once, correctly - { Q->insertPos = startOfData; - } - else - { Q->insertPos++; - } - return TRUE; - } - //Q is full - return FALSE; - } - -/*Treats queue as a stack -- no matter contents, if read done right after - * a push, then the pushed item is what comes out. - * Expands the queue size automatically when it's full. - */ -void -pushPrivQ( void * in, PrivQueueStruc* Q ) - { - while(1){ - void **startOfData = Q->startOfData; - void **endOfData = Q->endOfData; - - void **insertPos = Q->insertPos; - void **extractPos = Q->extractPos; - - //Full? (insert is just below extract when full) - if( extractPos - insertPos != 1 && - !(insertPos == endOfData && extractPos == startOfData)) - { //insert -- but go backwards, inserting at read position then - // move read pos backwards - *(Q->extractPos) = in; - if( extractPos == startOfData ) //write new pos exactly once, correctly - { Q->extractPos = endOfData; //can't overrun then fix it 'cause - } // other thread might read bad pos - else - { Q->extractPos--; - } - return; - } - //Q is full - enlargePrivQ( Q ); - } - } - -void -freePrivQ( PrivQueueStruc *Q ) - { - VMS__free( Q->startOfData ); - VMS__free( Q ); +/* + * Copyright 2009 OpenSourceStewardshipFoundation.org + * Licensed under GNU General Public License version 2 + * + * Author: seanhalle@yahoo.com + */ + + +#include +#include +#include +#include + +#include "PrivateQueue.h" +#include "VMS_Implementations/VMS_impl/vmalloc.h" + + + +//=========================================================================== + +/*This kind of queue is private to a single core at a time -- has no + * synchronizations + */ + +PrivQueueStruc* makePrivQ() + { + PrivQueueStruc *retQ; + retQ = VMS_int__malloc( sizeof( PrivQueueStruc ) ); + retQ->startOfData = (void*)VMS_int__malloc( 1024 * sizeof(void *) ); + memset( retQ->startOfData, 0, 1024 ); + + retQ->extractPos = &(retQ->startOfData[0]); //side by side == empty + retQ->insertPos = &(retQ->startOfData[1]); // so start pos's have to be + retQ->endOfData = &(retQ->startOfData[1023]); + + return retQ; + } + + +void +enlargePrivQ( PrivQueueStruc *Q ) + { size_t oldSize, newSize; + void **oldStartOfData; + + oldSize = Q->endOfData - Q->startOfData + 1; + newSize = 2 * oldSize; + oldStartOfData = Q->startOfData; + Q->startOfData = VMS_int__malloc( newSize * sizeof(void*)); + //copy second half + size_t secondHalfSize = Q->endOfData - Q->extractPos + 1; + memcpy(Q->startOfData,Q->extractPos, secondHalfSize * sizeof(void*)); + //copy first half + memcpy(Q->startOfData + secondHalfSize, oldStartOfData, + (oldSize-secondHalfSize) * sizeof(void*)); + VMS_int__free(oldStartOfData); + + Q->extractPos = Q->startOfData; + Q->insertPos = Q->startOfData + oldSize - 1; + Q->endOfData = &(Q->startOfData[newSize - 1]); + } + + +/*Returns NULL when queue is empty + */ +void* readPrivQ( PrivQueueStruc* Q ) + { void *out = 0; + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; + + //if not empty -- (extract is just below insert when empty) + if( insertPos - extractPos != 1 && + !(extractPos == endOfData && insertPos == startOfData)) + { //move before read + if( extractPos == endOfData ) //write new pos exactly once, correctly + { Q->extractPos = startOfData; //can't overrun then fix it 'cause + } // other thread might read bad pos + else + { Q->extractPos++; + } + out = *(Q->extractPos); + return out; + } + //Q is empty + return NULL; + } + +int32 +numInPrivQ( PrivQueueStruc *Q ) + { int32 size, numIn; + + if( Q->insertPos < Q->extractPos ) + { //insert has wrapped around so numIn is: + // insertPos + size - extractPos -- Consider, is empty when + // extractPos = endOfData and insert = start -- correctly get zero + size = Q->endOfData - Q->startOfData; + numIn = Q->insertPos + size - Q->extractPos; + } + else + { + numIn = Q->insertPos - Q->extractPos -1;//-1 bec empty @ side-by-side + } + return numIn; + } + + +/*Expands the queue size automatically when it's full + */ +void +writePrivQ( void * in, PrivQueueStruc* Q ) + { + while(1){ + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; + + //Full? (insert is just below extract when full) + if( extractPos - insertPos != 1 && + !(insertPos == endOfData && extractPos == startOfData)) + { *(Q->insertPos) = in; //insert before move + if( insertPos == endOfData ) //write new pos exactly once, correctly + { Q->insertPos = startOfData; + } + else + { Q->insertPos++; + } + return; + } + //Q is full + enlargePrivQ( Q ); + } + } + + +/*Returns false when the queue was full. + * have option of calling make_larger_PrivQ to make more room, then try again + */ +int writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ) + { + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; + + if( extractPos - insertPos != 1 && + !(insertPos == endOfData && extractPos == startOfData)) + { *(Q->insertPos) = in; //insert before move + if( insertPos == endOfData ) //write new pos exactly once, correctly + { Q->insertPos = startOfData; + } + else + { Q->insertPos++; + } + return TRUE; + } + //Q is full + return FALSE; + } + +/*Treats queue as a stack -- no matter contents, if read done right after + * a push, then the pushed item is what comes out. + * Expands the queue size automatically when it's full. + */ +void +pushPrivQ( void * in, PrivQueueStruc* Q ) + { + while(1){ + void **startOfData = Q->startOfData; + void **endOfData = Q->endOfData; + + void **insertPos = Q->insertPos; + void **extractPos = Q->extractPos; + + //Full? (insert is just below extract when full) + if( extractPos - insertPos != 1 && + !(insertPos == endOfData && extractPos == startOfData)) + { //insert -- but go backwards, inserting at read position then + // move read pos backwards + *(Q->extractPos) = in; + if( extractPos == startOfData ) //write new pos exactly once, correctly + { Q->extractPos = endOfData; //can't overrun then fix it 'cause + } // other thread might read bad pos + else + { Q->extractPos--; + } + return; + } + //Q is full + enlargePrivQ( Q ); + } + } + +void +freePrivQ( PrivQueueStruc *Q ) + { + VMS_int__free( Q->startOfData ); + VMS_int__free( Q ); } \ No newline at end of file diff -r 7c9e00ff1bf4 -r 677afc259a58 PrivateQueue.h --- a/PrivateQueue.h Wed Jun 22 18:49:17 2011 +0200 +++ b/PrivateQueue.h Mon Feb 13 19:32:12 2012 +0100 @@ -1,38 +1,38 @@ -/* - * Copyright 2009 OpenSourceStewardshipFoundation.org - * Licensed under GNU General Public License version 2 - * - * Author: seanhalle@yahoo.com - */ - -#ifndef _PRIVATE_QUEUE_H -#define _PRIVATE_QUEUE_H - -#include "../VMS_primitive_data_types.h" - -#define TRUE 1 -#define FALSE 0 - -#define LOCKED 1 -#define UNLOCKED 0 - - -typedef struct - { void **insertPos; - void **extractPos; - void **startOfData; //data is pointers - void **endOfData; //set when alloc data - } -PrivQueueStruc; - - -PrivQueueStruc* makeVMSPrivQ ( ); -void* readPrivQ ( PrivQueueStruc *Q ); -void writePrivQ( void *in, PrivQueueStruc *Q ); -int32 writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ); //return - // false when full -int32 numInPrivQ( PrivQueueStruc *Q ); -void pushPrivQ( void * in, PrivQueueStruc* Q ); - -#endif /* _PRIVATE_QUEUE_H */ - +/* + * Copyright 2009 OpenSourceStewardshipFoundation.org + * Licensed under GNU General Public License version 2 + * + * Author: seanhalle@yahoo.com + */ + +#ifndef _PRIVATE_QUEUE_H +#define _PRIVATE_QUEUE_H + +#include "VMS_Implementations/VMS_impl/VMS_primitive_data_types.h" + +#define TRUE 1 +#define FALSE 0 + +#define LOCKED 1 +#define UNLOCKED 0 + + +typedef struct + { void **insertPos; + void **extractPos; + void **startOfData; //data is pointers + void **endOfData; //set when alloc data + } +PrivQueueStruc; + + +PrivQueueStruc* makePrivQ ( ); +void* readPrivQ ( PrivQueueStruc *Q ); +void writePrivQ( void *in, PrivQueueStruc *Q ); +int32 writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ); //return + // false when full +int32 numInPrivQ( PrivQueueStruc *Q ); +void pushPrivQ( void * in, PrivQueueStruc* Q ); + +#endif /* _PRIVATE_QUEUE_H */ +