mirror of
https://github.com/LBRYFoundation/pool.git
synced 2025-08-23 17:37:25 +00:00
165 lines
2.2 KiB
C++
165 lines
2.2 KiB
C++
|
|
#include "stratum.h"
|
|
|
|
//#define _LIST_DEBUG_
|
|
|
|
void CommonLock(pthread_mutex_t *mutex)
|
|
{
|
|
if (g_debuglog_list) {
|
|
int i=0;
|
|
for(; i<10; i++)
|
|
{
|
|
int res = pthread_mutex_trylock(mutex);
|
|
if(res == 0) break;
|
|
|
|
usleep(100*YAAMP_MS);
|
|
}
|
|
|
|
if(i == 10)
|
|
debuglog("failed mutex2 %x <<----------------\n", mutex);
|
|
} else {
|
|
pthread_mutex_lock(mutex);
|
|
}
|
|
}
|
|
|
|
void CommonUnlock(pthread_mutex_t *mutex)
|
|
{
|
|
pthread_mutex_unlock(mutex);
|
|
}
|
|
|
|
CommonList::CommonList()
|
|
{
|
|
count = 0;
|
|
yaamp_create_mutex(&mutex);
|
|
|
|
first = NULL;
|
|
last = NULL;
|
|
}
|
|
|
|
CommonList::~CommonList()
|
|
{
|
|
// DeleteAll(NULL);
|
|
}
|
|
|
|
void CommonList::Enter()
|
|
{
|
|
if (g_debuglog_list) {
|
|
int i=0;
|
|
for(; i<10; i++)
|
|
{
|
|
int res = pthread_mutex_trylock(&mutex);
|
|
if(res == 0) break;
|
|
|
|
usleep(100*YAAMP_MS);
|
|
}
|
|
|
|
if(i == 10)
|
|
debuglog("failed mutex1 %x <<----------------\n", &mutex);
|
|
} else {
|
|
pthread_mutex_lock(&mutex);
|
|
}
|
|
}
|
|
|
|
void CommonList::Leave()
|
|
{
|
|
pthread_mutex_unlock(&mutex);
|
|
}
|
|
|
|
CLI CommonList::AddTail(void *data)
|
|
{
|
|
Enter();
|
|
|
|
CLI item = new COMMONLISTITEM;
|
|
item->data = data;
|
|
|
|
count++;
|
|
|
|
item->prev = last;
|
|
item->next = NULL;
|
|
|
|
last = item;
|
|
|
|
if(!first) first = item;
|
|
if(item->prev) item->prev->next = item;
|
|
|
|
Leave();
|
|
return item;
|
|
}
|
|
|
|
void CommonList::Delete(CLI item)
|
|
{
|
|
Enter();
|
|
|
|
if(first == item)
|
|
first = item->next;
|
|
|
|
if(last == item)
|
|
last = item->prev;
|
|
|
|
if(item->prev) item->prev->next = item->next;
|
|
if(item->next) item->next->prev = item->prev;
|
|
|
|
count--;
|
|
delete item;
|
|
|
|
Leave();
|
|
}
|
|
|
|
void CommonList::Delete(void *data)
|
|
{
|
|
CLI item = Find(data);
|
|
if(item) Delete(item);
|
|
}
|
|
|
|
void CommonList::DeleteAll(LISTFREEPARAM freeparam)
|
|
{
|
|
Enter();
|
|
for(CLI li1 = first; li1; )
|
|
{
|
|
CLI tmp = li1;
|
|
li1 = li1->next;
|
|
|
|
if(freeparam)
|
|
freeparam(tmp->data);
|
|
|
|
delete tmp;
|
|
}
|
|
count = 0;
|
|
Leave();
|
|
}
|
|
|
|
CLI CommonList::Find(void *data)
|
|
{
|
|
Enter();
|
|
for(CLI item = first; item; item = item->next)
|
|
if(data == item->data)
|
|
{
|
|
Leave();
|
|
return item;
|
|
}
|
|
|
|
Leave();
|
|
return NULL;
|
|
}
|
|
|
|
void CommonList::Swap(CLI i1, CLI i2)
|
|
{
|
|
// Enter();
|
|
if(i1->prev) i1->prev->next = i2;
|
|
if(i2->next) i2->next->prev = i1;
|
|
|
|
i1->next = i2->next;
|
|
i2->prev = i1->prev;
|
|
|
|
i1->prev = i2;
|
|
i2->next = i1;
|
|
|
|
if(!i2->prev) first = i2;
|
|
if(!i1->next) last = i1;
|
|
|
|
// Leave();
|
|
}
|
|
|
|
|
|
|
|
|