189 lines
4.7 KiB
C
189 lines
4.7 KiB
C
#include "tref.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "os.h"
|
|
#include "taoserror.h"
|
|
#include "tglobal.h"
|
|
#include "tlog.h"
|
|
|
|
typedef struct {
|
|
int refNum;
|
|
int steps;
|
|
int rsetId;
|
|
int64_t *rid;
|
|
void **p;
|
|
} SRefSpace;
|
|
|
|
void iterateRefs(int rsetId) {
|
|
int count = 0;
|
|
|
|
void *p = taosIterateRef(rsetId, 0);
|
|
while (p) {
|
|
// process P
|
|
count++;
|
|
p = taosIterateRef(rsetId, (int64_t)p);
|
|
}
|
|
|
|
printf(" %d ", count);
|
|
}
|
|
|
|
void *addRef(void *param) {
|
|
SRefSpace *pSpace = (SRefSpace *)param;
|
|
int id;
|
|
|
|
for (int i = 0; i < pSpace->steps; ++i) {
|
|
printf("a");
|
|
id = taosRand() % pSpace->refNum;
|
|
if (pSpace->rid[id] <= 0) {
|
|
pSpace->p[id] = taosMemoryMalloc(128);
|
|
pSpace->rid[id] = taosAddRef(pSpace->rsetId, pSpace->p[id]);
|
|
}
|
|
taosUsleep(100);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void *removeRef(void *param) {
|
|
SRefSpace *pSpace = (SRefSpace *)param;
|
|
int id, code;
|
|
|
|
for (int i = 0; i < pSpace->steps; ++i) {
|
|
printf("d");
|
|
id = taosRand() % pSpace->refNum;
|
|
if (pSpace->rid[id] > 0) {
|
|
code = taosRemoveRef(pSpace->rsetId, pSpace->rid[id]);
|
|
if (code == 0) pSpace->rid[id] = 0;
|
|
}
|
|
|
|
taosUsleep(100);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void *acquireRelease(void *param) {
|
|
SRefSpace *pSpace = (SRefSpace *)param;
|
|
int id;
|
|
|
|
for (int i = 0; i < pSpace->steps; ++i) {
|
|
printf("a");
|
|
|
|
id = taosRand() % pSpace->refNum;
|
|
void *p = taosAcquireRef(pSpace->rsetId, (int64_t)pSpace->p[id]);
|
|
if (p) {
|
|
taosUsleep(id % 5 + 1);
|
|
taosReleaseRef(pSpace->rsetId, (int64_t)pSpace->p[id]);
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void myfree(void *p) { taosMemoryFree(p); }
|
|
|
|
void *openRefSpace(void *param) {
|
|
SRefSpace *pSpace = (SRefSpace *)param;
|
|
|
|
printf("c");
|
|
pSpace->rsetId = taosOpenRef(50, myfree);
|
|
|
|
if (pSpace->rsetId < 0) {
|
|
printf("failed to open ref, reason:%s\n", tstrerror(pSpace->rsetId));
|
|
return NULL;
|
|
}
|
|
|
|
pSpace->p = (void **)taosMemoryCalloc(sizeof(void *), pSpace->refNum);
|
|
pSpace->rid = taosMemoryCalloc(pSpace->refNum, sizeof(int64_t));
|
|
|
|
TdThreadAttr thattr;
|
|
taosThreadAttrInit(&thattr);
|
|
taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE);
|
|
|
|
TdThread thread1, thread2, thread3;
|
|
taosThreadCreate(&(thread1), &thattr, addRef, (void *)(pSpace));
|
|
taosThreadCreate(&(thread2), &thattr, removeRef, (void *)(pSpace));
|
|
taosThreadCreate(&(thread3), &thattr, acquireRelease, (void *)(pSpace));
|
|
|
|
taosThreadJoin(thread1, NULL);
|
|
taosThreadJoin(thread2, NULL);
|
|
taosThreadJoin(thread3, NULL);
|
|
|
|
for (int i = 0; i < pSpace->refNum; ++i) {
|
|
taosRemoveRef(pSpace->rsetId, pSpace->rid[i]);
|
|
}
|
|
|
|
taosCloseRef(pSpace->rsetId);
|
|
|
|
uInfo("rsetId:%d main thread exit", pSpace->rsetId);
|
|
taosMemoryFree(pSpace->p);
|
|
pSpace->p = NULL;
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
int refNum = 100;
|
|
int threads = 10;
|
|
int steps = 10000;
|
|
int loops = 1;
|
|
|
|
uDebugFlag = 143;
|
|
|
|
for (int i = 1; i < argc; ++i) {
|
|
if (strcmp(argv[i], "-n") == 0 && i < argc - 1) {
|
|
refNum = atoi(argv[++i]);
|
|
} else if (strcmp(argv[i], "-s") == 0 && i < argc - 1) {
|
|
steps = atoi(argv[++i]);
|
|
} else if (strcmp(argv[i], "-t") == 0 && i < argc - 1) {
|
|
threads = atoi(argv[++i]);
|
|
} else if (strcmp(argv[i], "-l") == 0 && i < argc - 1) {
|
|
loops = atoi(argv[++i]);
|
|
} else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) {
|
|
uDebugFlag = atoi(argv[i]);
|
|
} else {
|
|
printf("\nusage: %s [options] \n", argv[0]);
|
|
printf(" [-n]: number of references, default: %d\n", refNum);
|
|
printf(" [-s]: steps to run for each reference, default: %d\n", steps);
|
|
printf(" [-t]: number of rsetIds running in parallel, default: %d\n", threads);
|
|
printf(" [-l]: number of loops, default: %d\n", loops);
|
|
printf(" [-d]: debugFlag, default: %d\n", uDebugFlag);
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
taosInitLog("tref.log", 10, false);
|
|
|
|
SRefSpace *pSpaceList = (SRefSpace *)taosMemoryCalloc(sizeof(SRefSpace), threads);
|
|
TdThread *pThreadList = (TdThread *)taosMemoryCalloc(sizeof(TdThread), threads);
|
|
|
|
TdThreadAttr thattr;
|
|
taosThreadAttrInit(&thattr);
|
|
taosThreadAttrSetDetachState(&thattr, PTHREAD_CREATE_JOINABLE);
|
|
|
|
for (int i = 0; i < loops; ++i) {
|
|
printf("\nloop: %d\n", i);
|
|
for (int j = 0; j < threads; ++j) {
|
|
pSpaceList[j].steps = steps;
|
|
pSpaceList[j].refNum = refNum;
|
|
taosThreadCreate(&(pThreadList[j]), &thattr, openRefSpace, (void *)(pSpaceList + j));
|
|
}
|
|
|
|
for (int j = 0; j < threads; ++j) {
|
|
taosThreadJoin(pThreadList[j], NULL);
|
|
}
|
|
}
|
|
|
|
int num = taosListRef();
|
|
printf("\nnumber of references:%d\n", num);
|
|
|
|
taosMemoryFree(pSpaceList);
|
|
taosMemoryFree(pThreadList);
|
|
|
|
taosCloseLog();
|
|
|
|
return num;
|
|
}
|