]> rtime.felk.cvut.cz Git - frescor/forb.git/blob - src/request.h
Source files moved to a separate directory
[frescor/forb.git] / src / request.h
1 #ifndef REQUEST_H
2 #define REQUEST_H
3
4 #include <forb/forb.h>
5 #include <forb/cdr.h>
6 #include <forb/basic_types.h>
7 #include <forb/syncobj.h>
8 #include <ul_gavlcust.h>
9 #include <forb/forb-internal.h>
10
11 /**
12  * Helper structure for sending ORB requests.
13  *
14  * It is allocated in stub's stack.
15  * 
16  */
17 struct forb_request {
18         CORBA_unsigned_long request_id;
19         CDR_Codec cdr_request;
20         CDR_Codec *cdr_reply;
21         gavl_node_t node;
22         forb_object obj;
23         struct forb_env *env;   /**< Where to store exception returned in reply */
24         forb_syncobj_t reply_ready; /**< Synchronization object for waiting for reply */
25         forb_syncobj_t *reply_processed; /**< Synchronization object for receiver thread to wait for stub. */
26 };
27
28 typedef struct forb_request forb_request_t;
29
30 /* Declaration of AVL tree for storing sent requests. */
31 GAVL_CUST_NODE_INT_DEC(forb_request_nolock /* cust_prefix */,
32                        forb_t /* cust_root_t */,
33                        forb_request_t /* cust_item_t */,
34                        CORBA_unsigned_long /* cust_key_t */,
35                        requests /* cust_root_node */,
36                        node /* cust_item_node */,
37                        request_id /* cust_item_key */,
38                        forb_request_cmp/* cust_cmp_fnc */);
39
40 static inline int
41 forb_request_insert(forb_t *forb, forb_request_t *req)
42 {
43         int ret;
44         fosa_mutex_lock(&forb->request_mutex);
45         ret = forb_request_nolock_insert(forb, req);
46         fosa_mutex_unlock(&forb->request_mutex);
47         return ret;
48 }
49
50 static inline void
51 forb_request_delete(forb_t *forb, forb_request_t *req)
52 {
53         fosa_mutex_lock(&forb->request_mutex);
54         forb_request_nolock_delete(forb, req);
55         fosa_mutex_unlock(&forb->request_mutex);
56 }
57
58 static inline forb_request_t *
59 forb_request_find(forb_t *forb, CORBA_unsigned_long *request_id)
60 {
61         forb_request_t *ret;
62         fosa_mutex_lock(&forb->request_mutex);
63         ret = forb_request_nolock_find(forb, request_id);
64         fosa_mutex_unlock(&forb->request_mutex);
65         return ret;
66 }
67
68 int
69 forb_request_init(forb_request_t *req, forb_object obj);
70 void
71 forb_request_destroy(forb_request_t *req);
72 void
73 forb_request_wait_for_reply(forb_request_t *req);
74 void
75 forb_request_signal_processed(forb_request_t *req);
76 void
77 forb_request_send(forb_request_t *req, CORBA_Environment *env);
78
79
80 #endif