Line data Source code
1 : #include "fd_vinyl.h"
2 :
3 : /* FIXME: HAVE ERR_TIMEOUT? */
4 :
5 : int
6 0 : fd_vinyl_halt( fd_cnc_t * cnc ) {
7 :
8 0 : int err = fd_cnc_open( cnc ); /* logs details */
9 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
10 :
11 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_HALT );
12 :
13 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_HALT, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_BOOT )
14 0 : ? FD_VINYL_SUCCESS : FD_VINYL_ERR_CORRUPT;
15 :
16 0 : fd_cnc_close( cnc );
17 :
18 0 : return err;
19 0 : }
20 :
21 : int
22 0 : fd_vinyl_sync( fd_cnc_t * cnc ) {
23 :
24 0 : int err = fd_cnc_open( cnc ); /* logs details */
25 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
26 :
27 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_SYNC );
28 :
29 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_SYNC, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_RUN )
30 0 : ? FD_VINYL_SUCCESS : FD_VINYL_ERR_CORRUPT;
31 :
32 0 : fd_cnc_close( cnc );
33 :
34 0 : return err;
35 0 : }
36 :
37 : int
38 : fd_vinyl_get( fd_cnc_t * cnc,
39 : int opt,
40 0 : ulong * opt_val ) {
41 :
42 0 : int err = fd_cnc_open( cnc ); /* logs details */
43 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
44 :
45 0 : fd_vinyl_cmd_t * cmd = (fd_vinyl_cmd_t *)fd_cnc_app_laddr( cnc );
46 :
47 0 : cmd->get.opt = opt;
48 :
49 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_GET );
50 :
51 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_GET, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_RUN )
52 0 : ? cmd->get.err : FD_VINYL_ERR_CORRUPT;
53 :
54 0 : fd_cnc_close( cnc );
55 :
56 0 : if( opt_val ) *opt_val = cmd->get.val;
57 0 : return err;
58 0 : }
59 :
60 : int
61 : fd_vinyl_set( fd_cnc_t * cnc,
62 : int opt,
63 : ulong val,
64 0 : ulong * opt_val ) {
65 :
66 0 : int err = fd_cnc_open( cnc ); /* logs details */
67 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
68 :
69 0 : fd_vinyl_cmd_t * cmd = (fd_vinyl_cmd_t *)fd_cnc_app_laddr( cnc );
70 :
71 0 : cmd->set.opt = opt;
72 0 : cmd->set.val = val;
73 :
74 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_SET );
75 :
76 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_SET, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_RUN )
77 0 : ? cmd->set.err : FD_VINYL_ERR_CORRUPT;
78 :
79 0 : fd_cnc_close( cnc );
80 :
81 0 : if( opt_val ) *opt_val = cmd->set.val;
82 0 : return err;
83 0 : }
84 :
85 : int
86 : fd_vinyl_client_join( fd_cnc_t * cnc,
87 : fd_vinyl_rq_t * rq,
88 : fd_vinyl_cq_t * cq,
89 : fd_wksp_t * wksp,
90 : ulong link_id,
91 : ulong burst_max,
92 0 : ulong quota_max ) {
93 :
94 0 : int err = fd_cnc_open( cnc ); /* logs details */
95 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
96 :
97 : /* At this point, we have a command session on cnc and a superficially
98 : valid request. Issue the command and wait for the response. */
99 :
100 0 : fd_vinyl_cmd_t * cmd = (fd_vinyl_cmd_t *)fd_cnc_app_laddr( cnc );
101 :
102 0 : cmd->join.link_id = link_id;
103 0 : cmd->join.burst_max = burst_max;
104 0 : cmd->join.quota_max = quota_max;
105 :
106 0 : if( FD_UNLIKELY( !fd_wksp_cstr_laddr( rq, cmd->join.rq ) ) ||
107 0 : FD_UNLIKELY( !fd_wksp_cstr_laddr( cq, cmd->join.cq ) ) ||
108 0 : FD_UNLIKELY( !wksp ) ) {
109 0 : fd_cnc_close( cnc );
110 0 : return FD_VINYL_ERR_INVAL;
111 0 : }
112 :
113 0 : strcpy( cmd->join.wksp, fd_wksp_name( wksp ) );
114 :
115 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_CLIENT_JOIN );
116 :
117 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_CLIENT_JOIN, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_RUN )
118 0 : ? cmd->join.err : FD_VINYL_ERR_CORRUPT;
119 :
120 0 : fd_cnc_close( cnc );
121 :
122 0 : return err;
123 0 : }
124 :
125 : int
126 : fd_vinyl_client_leave( fd_cnc_t * cnc,
127 0 : ulong link_id ) {
128 :
129 0 : int err = fd_cnc_open( cnc ); /* logs details */
130 0 : if( FD_UNLIKELY( err ) ) return err==FD_CNC_ERR_AGAIN ? FD_VINYL_ERR_AGAIN : FD_VINYL_ERR_CORRUPT;
131 :
132 : /* At this point, we have a command session on cnc and a superficially
133 : valid request. Issue the command and wait for the response. */
134 :
135 0 : fd_vinyl_cmd_t * cmd = (fd_vinyl_cmd_t *)fd_cnc_app_laddr( cnc );
136 :
137 0 : cmd->leave.link_id = link_id;
138 :
139 0 : fd_cnc_signal( cnc, FD_VINYL_CNC_SIGNAL_CLIENT_LEAVE );
140 :
141 0 : err = FD_LIKELY( fd_cnc_wait( cnc, FD_VINYL_CNC_SIGNAL_CLIENT_LEAVE, (long)5e9, NULL )==FD_VINYL_CNC_SIGNAL_RUN )
142 0 : ? cmd->leave.err : FD_VINYL_ERR_CORRUPT;
143 :
144 0 : fd_cnc_close( cnc );
145 :
146 0 : return err;
147 0 : }
|