// Common, group Threads
// Copyright 2001,2002 Alexander Liss
#include <pthread.h>
//#include <unistd.h>
#include <string.h>
#include "AUniTime.h"
#include "AEvent.h"
#include "AThread.h"
#include "AWait.h"
int AWait(ACondition& c,AMutex& m)
{
if( c.status ) return -1;
if( m.status ) return -2;
return pthread_cond_wait(&c.condition,&m.mutex);
}
int AWait(ACondition& c,AMutex& m,unsigned timeout)
{
if( c.status ) return -1;
if( m.status ) return -2;
AUniTime time,current;
time.put_milliseconds(timeout);
if(current.set_current()) return 3;
time+=current;
timespec t;
time.get_timespec(t);
return pthread_cond_timedwait(&c.condition,&m.mutex,&t);
}
int AWait(AEvent& z)
{ AFunctionLock lock(z.mutex);
return AWait(z.condition,z.mutex);
}
int AWait(AEvent& z,unsigned timeout)
{ AFunctionLock lock(z.mutex);
return AWait(z.condition,z.mutex,timeout);
}
int AWait(AThreadControl& t)
{
void *z=0;
return pthread_join(t.handle,&z);
}
int millisleep(unsigned& left, unsigned initial)
{ int g=0;
timespec in,out;
memset(&in,0,sizeof(timespec));
memset(&out,0,sizeof(timespec));
in.tv_sec=initial/1000;
in.tv_nsec=(initial%1000)*1000000;
g=nanosleep(&in,&out);
if(g)
{
left=1000*out.tv_sec + out.tv_nsec/1000000;
return 1;
}
return 0;
}