Line data Source code
1 : #include "../fd_util.h"
2 : #include "../wksp/fd_wksp_private.h"
3 :
4 : #if FD_HAS_HOSTED
5 :
6 : #include <stdio.h>
7 :
8 : FD_IMPORT_CSTR( fd_alloc_ctl_help, "src/util/alloc/fd_alloc_ctl_help" );
9 :
10 : int
11 : fd_alloc_fprintf( fd_alloc_t * join,
12 : FILE * stream );
13 :
14 : int
15 : main( int argc,
16 42 : char ** argv ) {
17 42 : fd_boot( &argc, &argv );
18 195 : # define SHIFT(n) argv+=(n),argc-=(n)
19 :
20 42 : if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "no arguments" ));
21 42 : char const * bin = argv[0];
22 42 : SHIFT(1);
23 :
24 42 : ulong tag = 1UL;
25 :
26 42 : int cnt = 0;
27 120 : while( argc ) {
28 78 : char const * cmd = argv[0];
29 78 : SHIFT(1);
30 :
31 78 : if( !strcmp( cmd, "help" ) ) {
32 :
33 3 : fputs( fd_alloc_ctl_help, stdout );
34 :
35 3 : FD_LOG_NOTICE(( "%i: %s: success", cnt, cmd ));
36 :
37 75 : } else if( !strcmp( cmd, "tag" ) ) {
38 :
39 9 : if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
40 :
41 9 : tag = fd_cstr_to_ulong( argv[0] );
42 :
43 9 : FD_LOG_NOTICE(( "%i: %s %lu: success", cnt, cmd, tag ));
44 9 : SHIFT(1);
45 :
46 66 : } else if( !strcmp( cmd, "new" ) ) {
47 :
48 6 : if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
49 :
50 6 : char const * name = argv[0];
51 6 : ulong wksp_tag = fd_cstr_to_ulong( argv[1] );
52 :
53 6 : ulong align = fd_alloc_align();
54 6 : ulong footprint = fd_alloc_footprint();
55 :
56 6 : fd_wksp_t * wksp = fd_wksp_attach( name ); /* logs details */
57 6 : if( FD_UNLIKELY( !wksp ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_attach( \"%s\" ) failed", cnt, cmd, name ));
58 :
59 6 : ulong gaddr = fd_wksp_alloc( wksp, align, footprint, wksp_tag );
60 6 : if( FD_UNLIKELY( !gaddr ) )
61 0 : FD_LOG_ERR(( "%i: %s: fd_wksp_alloc(\"%s\",%lu,%lu,%lu) failed", cnt, cmd, name, align, footprint, wksp_tag ));
62 :
63 6 : void * shmem = fd_wksp_laddr_fast( wksp, gaddr );
64 6 : if( FD_UNLIKELY( !fd_alloc_new( shmem, wksp_tag ) ) ) /* logs details */
65 0 : FD_LOG_ERR(( "%i: %s: fd_alloc_new(\"%s\",%lu) failed", cnt, cmd, name, wksp_tag ));
66 :
67 6 : char cstr[ FD_WKSP_CSTR_MAX ];
68 6 : printf( "%s\n", fd_wksp_cstr( wksp, gaddr, cstr ) );
69 :
70 6 : fd_wksp_detach( wksp ); /* logs details */
71 :
72 6 : FD_LOG_NOTICE(( "%i: %s %s %lu: success", cnt, cmd, name, wksp_tag ));
73 6 : SHIFT(2);
74 :
75 60 : } else if( !strcmp( cmd, "delete" ) ) {
76 :
77 6 : if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
78 :
79 6 : char const * cstr = argv[0];
80 6 : int garbage_collect = fd_cstr_to_int( argv[1] );
81 :
82 6 : void * shalloc = fd_wksp_map( cstr );
83 6 : if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
84 :
85 6 : fd_alloc_t * alloc = fd_alloc_join( shalloc, 0UL /* d/c */ );
86 6 : if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",0UL) failed", cnt, cmd, cstr ));
87 :
88 6 : fd_wksp_t * wksp = fd_alloc_wksp( shalloc );
89 6 : ulong wksp_tag = fd_alloc_tag ( alloc );
90 :
91 6 : fd_alloc_delete( fd_alloc_leave( alloc ) ); /* logs details */
92 :
93 6 : if( garbage_collect ) fd_wksp_tag_free( wksp, &wksp_tag, 1UL ); /* logs details */
94 :
95 6 : fd_wksp_unmap( shalloc ); /* logs details */
96 :
97 6 : FD_LOG_NOTICE(( "%i: %s %s %i: success", cnt, cmd, cstr, garbage_collect ));
98 6 : SHIFT(2);
99 :
100 54 : } else if( !strcmp( cmd, "malloc" ) ) {
101 :
102 12 : if( FD_UNLIKELY( argc<4 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
103 :
104 12 : char const * cstr = argv[0];
105 12 : ulong cgroup_idx = fd_cstr_to_ulong( argv[1] );
106 12 : ulong align = fd_cstr_to_ulong( argv[2] );
107 12 : ulong sz = fd_cstr_to_ulong( argv[3] );
108 :
109 12 : void * shalloc = fd_wksp_map( cstr );
110 12 : if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
111 :
112 12 : fd_alloc_t * alloc = fd_alloc_join( shalloc, cgroup_idx );
113 12 : if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",%lu) failed", cnt, cmd, cstr, cgroup_idx ));
114 :
115 12 : fd_wksp_t * wksp = fd_alloc_wksp( alloc );
116 12 : void * laddr = fd_alloc_malloc( alloc, align, sz );
117 :
118 12 : char buf[ FD_WKSP_CSTR_MAX ];
119 12 : if( FD_LIKELY( laddr ) ) printf( "%s\n", fd_wksp_cstr( wksp, fd_wksp_gaddr_fast( wksp, laddr ), buf ) );
120 3 : else if( FD_LIKELY( !sz ) ) printf( "%s\n", fd_wksp_cstr( wksp, 0UL, buf ) );
121 0 : else FD_LOG_ERR(( "%i: %s: fd_alloc_malloc(\"%s\":%lu,%lu,%lu) failed",
122 12 : cnt, cmd, cstr, cgroup_idx, align, sz ));
123 :
124 12 : fd_wksp_unmap( fd_alloc_leave( alloc ) ); /* logs details */
125 :
126 12 : FD_LOG_NOTICE(( "%i: %s %s %lu %lu %lu: success", cnt, cmd, cstr, cgroup_idx, align, sz ));
127 12 : SHIFT(4);
128 :
129 42 : } else if( !strcmp( cmd, "free" ) ) {
130 :
131 21 : if( FD_UNLIKELY( argc<3 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
132 :
133 21 : char const * cstr = argv[0];
134 21 : ulong cgroup_idx = fd_cstr_to_ulong( argv[1] );
135 21 : char const * name_gaddr = argv[2];
136 :
137 21 : void * laddr = fd_wksp_map( name_gaddr ); /* logs details */
138 21 : if( FD_LIKELY( laddr ) ) {
139 15 : void * shalloc = fd_wksp_map( cstr ); /* logs details */
140 15 : if( FD_LIKELY( shalloc ) ) {
141 12 : fd_alloc_t * alloc = fd_alloc_join( shalloc, cgroup_idx ); /* logs details */
142 12 : if( FD_LIKELY( alloc ) ) {
143 12 : if( FD_LIKELY( fd_wksp_containing( laddr )==fd_alloc_wksp( alloc ) ) ) fd_alloc_free( alloc, laddr );
144 0 : else FD_LOG_WARNING(( "%i: %s: alloc %s was not used for %s", cnt, cmd, cstr, name_gaddr ));
145 12 : fd_alloc_leave( alloc ); /* logs details */
146 12 : }
147 12 : fd_wksp_unmap( shalloc ); /* logs details */
148 12 : }
149 15 : fd_wksp_unmap( laddr ); /* logs details */
150 15 : }
151 :
152 21 : FD_LOG_NOTICE(( "%i: %s %s %lu %s: success", cnt, cmd, cstr, cgroup_idx, name_gaddr ));
153 21 : SHIFT(3);
154 :
155 21 : } else if( !strcmp( cmd, "compact" ) ) {
156 :
157 3 : if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
158 :
159 3 : char const * cstr = argv[0];
160 :
161 3 : void * shalloc = fd_wksp_map( cstr );
162 3 : if( FD_UNLIKELY( !shalloc ) ) FD_LOG_ERR(( "%i: %s: fd_wksp_map(\"%s\") failed", cnt, cmd, cstr ));
163 :
164 3 : fd_alloc_t * alloc = fd_alloc_join( shalloc, 0 /*d/c*/ );
165 3 : if( FD_UNLIKELY( !alloc ) ) FD_LOG_ERR(( "%i: %s: fd_alloc_join(\"%s\",0) failed", cnt, cmd, cstr ));
166 :
167 3 : fd_alloc_compact( alloc ); /* logs details */
168 :
169 3 : fd_wksp_unmap( fd_alloc_leave( alloc ) ); /* logs details */
170 :
171 3 : FD_LOG_NOTICE(( "%i: %s %s: success", cnt, cmd, cstr ));
172 3 : SHIFT(1);
173 :
174 18 : } else if( !strcmp( cmd, "query" ) ) {
175 :
176 18 : if( FD_UNLIKELY( argc<2 ) ) FD_LOG_ERR(( "%i: %s: too few arguments\n\tDo %s help for help", cnt, cmd, bin ));
177 :
178 18 : char const * what = argv[0];
179 18 : char const * cstr = argv[1];
180 :
181 18 : void * shmem = NULL;
182 18 : fd_alloc_t * alloc = NULL;
183 18 : int err = -1;
184 :
185 18 : shmem = fd_wksp_map( cstr );
186 18 : if( FD_LIKELY( shmem ) ) {
187 9 : alloc = fd_alloc_join( shmem, 0UL /* d/c */ );
188 9 : if( FD_LIKELY( alloc ) ) err = 0;
189 9 : }
190 :
191 18 : if( !strcmp( what, "test" ) ) printf( "%i\n", err );
192 12 : else if( !strcmp( what, "tag" ) ) printf( "%lu\n", FD_UNLIKELY( err ) ? 0UL : fd_alloc_tag( alloc ) );
193 6 : else if( !strcmp( what, "leak" ) ) printf( "%i\n", FD_UNLIKELY( err ) ? -1 : !fd_alloc_is_empty( alloc ) );
194 0 : else if( !strcmp( what, "full" ) ) fd_alloc_fprintf( alloc, stdout );
195 0 : else FD_LOG_ERR(( "unknown query %s", what ));
196 :
197 18 : if( FD_LIKELY( alloc ) ) fd_alloc_leave( alloc );
198 18 : if( FD_LIKELY( shmem ) ) fd_wksp_unmap( shmem );
199 :
200 18 : FD_LOG_NOTICE(( "%i: %s %s %s: success", cnt, cmd, what, cstr ));
201 18 : SHIFT(2);
202 :
203 18 : } else {
204 :
205 0 : FD_LOG_ERR(( "%i: %s: unknown command\n\t"
206 0 : "Do %s help for help", cnt, cmd, bin ));
207 :
208 0 : }
209 78 : cnt++;
210 78 : }
211 :
212 42 : if( FD_UNLIKELY( cnt<1 ) ) FD_LOG_NOTICE(( "processed %i commands\n\tDo %s help for help", cnt, bin ));
213 39 : else FD_LOG_NOTICE(( "processed %i commands", cnt ));
214 :
215 42 : # undef SHIFT
216 42 : fd_halt();
217 42 : return 0;
218 42 : }
219 :
220 : #else
221 :
222 : int
223 : main( int argc,
224 : char ** argv ) {
225 : fd_boot( &argc, &argv );
226 : if( FD_UNLIKELY( argc<1 ) ) FD_LOG_ERR(( "No arguments" ));
227 : if( FD_UNLIKELY( argc>1 ) ) FD_LOG_ERR(( "fd_alloc_ctl not supported on this platform" ));
228 : FD_LOG_NOTICE(( "processed 0 commands" ));
229 : fd_halt();
230 : return 0;
231 : }
232 :
233 : #endif
234 :
|