Skip to content

Commit 7f7f102

Browse files
committed
Switched bitcoin-cli.cpp to use RAII unique pointers with deleters.
1 parent e5534d2 commit 7f7f102

File tree

1 file changed

+12
-20
lines changed

1 file changed

+12
-20
lines changed

src/bitcoin-cli.cpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@
1717
#include <boost/filesystem/operations.hpp>
1818
#include <stdio.h>
1919

20-
#include <event2/event.h>
21-
#include <event2/http.h>
2220
#include <event2/buffer.h>
2321
#include <event2/keyvalq_struct.h>
22+
#include "support/events.h"
2423

2524
#include <univalue.h>
2625

@@ -190,23 +189,19 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
190189
std::string host = GetArg("-rpcconnect", DEFAULT_RPCCONNECT);
191190
int port = GetArg("-rpcport", BaseParams().RPCPort());
192191

193-
// Create event base
194-
struct event_base *base = event_base_new(); // TODO RAII
195-
if (!base)
196-
throw std::runtime_error("cannot create event_base");
192+
// Obtain event base
193+
raii_event_base base = obtain_event_base();
197194

198195
// Synchronously look up hostname
199-
struct evhttp_connection *evcon = evhttp_connection_base_new(base, NULL, host.c_str(), port); // TODO RAII
200-
if (evcon == NULL)
201-
throw std::runtime_error("create connection failed");
202-
evhttp_connection_set_timeout(evcon, GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT));
196+
raii_evhttp_connection evcon = obtain_evhttp_connection_base(base.get(), host, port);
197+
evhttp_connection_set_timeout(evcon.get(), GetArg("-rpcclienttimeout", DEFAULT_HTTP_CLIENT_TIMEOUT));
203198

204199
HTTPReply response;
205-
struct evhttp_request *req = evhttp_request_new(http_request_done, (void*)&response); // TODO RAII
200+
raii_evhttp_request req = obtain_evhttp_request(http_request_done, (void*)&response);
206201
if (req == NULL)
207202
throw std::runtime_error("create http request failed");
208203
#if LIBEVENT_VERSION_NUMBER >= 0x02010300
209-
evhttp_request_set_error_cb(req, http_error_cb);
204+
evhttp_request_set_error_cb(req.get(), http_error_cb);
210205
#endif
211206

212207
// Get credentials
@@ -223,28 +218,25 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
223218
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
224219
}
225220

226-
struct evkeyvalq *output_headers = evhttp_request_get_output_headers(req);
221+
struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req.get());
227222
assert(output_headers);
228223
evhttp_add_header(output_headers, "Host", host.c_str());
229224
evhttp_add_header(output_headers, "Connection", "close");
230225
evhttp_add_header(output_headers, "Authorization", (std::string("Basic ") + EncodeBase64(strRPCUserColonPass)).c_str());
231226

232227
// Attach request data
233228
std::string strRequest = JSONRPCRequestObj(strMethod, params, 1).write() + "\n";
234-
struct evbuffer * output_buffer = evhttp_request_get_output_buffer(req);
229+
struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req.get());
235230
assert(output_buffer);
236231
evbuffer_add(output_buffer, strRequest.data(), strRequest.size());
237232

238-
int r = evhttp_make_request(evcon, req, EVHTTP_REQ_POST, "/");
233+
int r = evhttp_make_request(evcon.get(), req.get(), EVHTTP_REQ_POST, "/");
234+
req.release(); // ownership moved to evcon in above call
239235
if (r != 0) {
240-
evhttp_connection_free(evcon);
241-
event_base_free(base);
242236
throw CConnectionFailed("send http request failed");
243237
}
244238

245-
event_base_dispatch(base);
246-
evhttp_connection_free(evcon);
247-
event_base_free(base);
239+
event_base_dispatch(base.get());
248240

249241
if (response.status == 0)
250242
throw CConnectionFailed(strprintf("couldn't connect to server: %s (code %d)\n(make sure server is running and you are connecting to the correct RPC port)", http_errorstring(response.error), response.error));

0 commit comments

Comments
 (0)