Add parlib/common.h
[akaros.git] / user / parlib / include / arc.h
1 // Header for Asynch Remote Call, currently only support remote syscalls.
2 #ifndef PARLIB_ARC_H
3 #define PARLIB_ARC_H
4
5 #include <parlib/parlib.h>
6 #include <error.h>
7 #include <parlib/pool.h>
8 #include <assert.h>
9 #include <sys/queue.h>
10 #include <ros/syscall.h>
11 #include <ros/ring_syscall.h>
12 #include <parlib/mcs.h>
13
14 __BEGIN_DECLS
15
16 struct arsc_channel {
17         mcs_lock_t aclock;
18         syscall_sring_t* ring_page;
19         syscall_front_ring_t sysfr;
20 }; 
21
22 typedef struct arsc_channel arsc_channel_t;
23
24 #define SYS_CHANNEL (global_ac)
25 extern arsc_channel_t global_ac;
26 extern syscall_front_ring_t syscallfrontring;
27 extern sysevent_back_ring_t syseventbackring;
28
29 /*
30  * Syscall Descriptor: This helps userspace track a specific syscall.  Includes
31  * a cleanup function to be run when this syscall is complete.  Linked list of
32  * these for now. (Tail Queue)
33  */
34 typedef struct syscall_desc syscall_desc_t;
35 struct syscall_desc {
36         TAILQ_ENTRY(syscall_desc) next;
37         struct arsc_channel* channel;
38         uint32_t idx;
39 };
40 TAILQ_HEAD(syscall_desc_list, syscall_desc);
41 typedef struct syscall_desc_list syscall_desc_list_t;
42
43
44 // TODO: where to declare async syscalls?
45
46 // async callback
47 #define MAX_SYSCALLS 100
48 #define MAX_ASYNCCALLS 100
49
50 // The high-level object a process waits on, with multiple syscalls within.
51 typedef struct async_desc {
52         syscall_desc_list_t syslist;
53         void (*cleanup)(void* data);
54         void* data;
55 } async_desc_t;
56
57 // Response to an async call.  Should be some sort of aggregation of the
58 // syscall responses.
59 typedef struct async_rsp_t {
60         int32_t retval;
61 } async_rsp_t;
62
63 // This is per-thread, and used when entering a async library call to properly
64 // group syscall_desc_t used during the processing of that async call
65 extern async_desc_t* current_async_desc;
66
67 // This pooltype contains syscall_desc_t, which is how you wait on one syscall.
68 POOL_TYPE_DEFINE(syscall_desc_t, syscall_desc_pool, MAX_SYSCALLS);
69 POOL_TYPE_DEFINE(async_desc_t, async_desc_pool, MAX_ASYNCCALLS);
70
71 // These are declared in asynccall.c
72 extern syscall_desc_pool_t syscall_desc_pool;
73 extern async_desc_pool_t async_desc_pool;
74
75 /* Initialize front and back rings of syscall/event ring */
76 void init_arc(struct arsc_channel* ac);
77
78 int async_syscall(arsc_channel_t* chan, syscall_req_t* req, syscall_desc_t** desc_ptr2);
79
80 /* Generic Async Call */
81 int waiton_syscall(syscall_desc_t* desc);
82
83 /* Async group call */
84 // not sure how to get results back for these?
85
86 int waiton_group_call(async_desc_t* desc, async_rsp_t* rsp);
87
88 async_desc_t* get_async_desc(void);
89 syscall_desc_t* get_sys_desc(async_desc_t* desc);
90 int get_all_desc(async_desc_t** a_desc, syscall_desc_t** s_desc);
91
92 // helper function to make arc calls
93
94 syscall_desc_t* arc_call(long int num, ...);
95
96 __END_DECLS
97
98 #endif /* PARLIB_ARC_H */