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

syscall_desc_t* sys_cputs_async(const char *s, size_t len,                                             
                     void (*cleanup_handler)(void*), void* cleanup_data)
{                                                                                                                     
    /*// could just hardcode 4 0's, will eventually wrap this marshaller anyway                                         
	syscall_desc_t* desc;
    syscall_req_t syscall = {REQ_alloc, cleanup_handler, cleanup_data,
							SYS_cputs,{(uint32_t)s, len, [2 ... (NUM_SYSCALL_ARGS-1)] 0} };                          
    syscall.cleanup = cleanup_handler;                                                                                  
    syscall.data = cleanup_data;
    async_syscall(&syscall, &desc);
	*/
	return arc_call(SYS_cputs, s, len);
}

int main(int argc, char** argv){
	int pid = sys_getpid();
	char testme = 't';
	printf ("single thread - init arsc \n");
	syscall_desc_t* sysdesc[2];
	syscall_rsp_t sysrsp;
	init_arc(&SYS_CHANNEL);

	printf ("single thread - init complete \n");
	// cprintf_async(&desc1, "Cross-Core call 1, coming from process %08x\n", pid);
	sysdesc[0] = sys_cputs_async(&testme, 1, NULL, NULL);
	sysdesc[1] = sys_cputs_async(&testme, 1, NULL, NULL);

	printf ("single thread - call placed \n");
	//ignore return value
	assert(-1 != waiton_syscall(sysdesc[0]));
	assert(-1 != waiton_syscall(sysdesc[1]));
	printf ("single thread - dummy call \n");	
}

#else
int main(){};
#endif
