#ifdef CONFIG_ARSC_SERVER
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <parlib/vcore.h>
#include <parlib/parlib.h>
#include <ros/syscall.h>
#include <parlib/arc.h>
#include <stdio.h>

#define NUM_THREADS 4

pthread_t t1;

async_desc_t desc1;

syscall_desc_t* sys_cputs_async(const char *s, size_t len,                                             
                     void (*cleanup_handler)(void*), void* cleanup_data)
{                                                                                                                     
	return arc_call(SYS_cputs, s, len);
}

void *syscall_thread(void* arg)
{
	char testme ='a';
	char buf[20] = {0};
	sprintf(buf, "%d", (pthread_self()->id % 10) );
	char tid = buf[0];
	syscall_desc_t* sysdesc;
	sysdesc = sys_cputs_async(&tid, 1, NULL, NULL);
	assert (-1 != waiton_syscall(sysdesc));
}

int main(int argc, char** argv){
	int pid = sys_getpid();
	pthread_t *my_threads = malloc(sizeof(pthread_t) * NUM_THREADS);
	char testme = 't';
	printf ("multi thread - init arsc \n");
	init_arc(&SYS_CHANNEL);
	for (int i = 0; i < NUM_THREADS ; i++)
		pthread_create(&my_threads[i], NULL, &syscall_thread, NULL);
	
	for (int i = 0; i < NUM_THREADS; i++){
		pthread_join(my_threads[i], NULL);
	}

	printf("multi thread - end\n");
}
#else
int main(){};
#endif
