// Header for Asynch Remote Call, currently only support remote syscalls.
#pragma once

#include <parlib/parlib.h>
#include <error.h>
#include <parlib/pool.h>
#include <parlib/assert.h>
#include <sys/queue.h>
#include <ros/syscall.h>
#include <ros/ring_syscall.h>
#include <parlib/mcs.h>

__BEGIN_DECLS

struct arsc_channel {
	mcs_lock_t aclock;
	syscall_sring_t* ring_page;
	syscall_front_ring_t sysfr;
}; 

typedef struct arsc_channel arsc_channel_t;

#define SYS_CHANNEL (global_ac)
extern arsc_channel_t global_ac;
extern syscall_front_ring_t syscallfrontring;
extern sysevent_back_ring_t syseventbackring;

/*
 * Syscall Descriptor: This helps userspace track a specific syscall.  Includes
 * a cleanup function to be run when this syscall is complete.  Linked list of
 * these for now. (Tail Queue)
 */
typedef struct syscall_desc syscall_desc_t;
struct syscall_desc {
	TAILQ_ENTRY(syscall_desc) next;
	struct arsc_channel* channel;
	uint32_t idx;
};
TAILQ_HEAD(syscall_desc_list, syscall_desc);
typedef struct syscall_desc_list syscall_desc_list_t;


// TODO: where to declare async syscalls?

// async callback
#define MAX_SYSCALLS 100
#define MAX_ASYNCCALLS 100

// The high-level object a process waits on, with multiple syscalls within.
typedef struct async_desc {
	syscall_desc_list_t syslist;
	void (*cleanup)(void* data);
	void* data;
} async_desc_t;

// Response to an async call.  Should be some sort of aggregation of the
// syscall responses.
typedef struct async_rsp_t {
	int32_t retval;
} async_rsp_t;

// This is per-thread, and used when entering a async library call to properly
// group syscall_desc_t used during the processing of that async call
extern async_desc_t* current_async_desc;

// This pooltype contains syscall_desc_t, which is how you wait on one syscall.
POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
POOL_TYPE_DEFINE(async_desc_t, async_desc_pool, MAX_ASYNCCALLS);

// These are declared in asynccall.c
extern syscall_desc_pool_t syscall_desc_pool;
extern async_desc_pool_t async_desc_pool;

/* Initialize front and back rings of syscall/event ring */
void init_arc(struct arsc_channel* ac);

int async_syscall(arsc_channel_t* chan, syscall_req_t* req, syscall_desc_t** desc_ptr2);

/* Generic Async Call */
int waiton_syscall(syscall_desc_t* desc);

/* Async group call */
// not sure how to get results back for these?

int waiton_group_call(async_desc_t* desc, async_rsp_t* rsp);

async_desc_t* get_async_desc(void);
syscall_desc_t* get_sys_desc(async_desc_t* desc);
int get_all_desc(async_desc_t** a_desc, syscall_desc_t** s_desc);

// helper function to make arc calls

syscall_desc_t* arc_call(long int num, ...);

__END_DECLS
