// 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;
}