Commit 764204b25998ccf8daecfc4aa6caabeb5aebfd01
1 parent
350c0377
Ignoring strict aliasing in some usages of libev macros.
With compiler warning -Wstrict-aliasing enabled, usage of the macros ev_async_timer and ev_timer_init yields said warnings. Created templates to locally turn off these warnings. Compiles without warnings with gcc 4.9.2 and clang 3.5.
Showing
1 changed file
with
28 additions
and
6 deletions
src/client.cpp
| ... | ... | @@ -24,6 +24,28 @@ |
| 24 | 24 | |
| 25 | 25 | using namespace std; |
| 26 | 26 | |
| 27 | +namespace { | |
| 28 | + | |
| 29 | +template<typename tev, typename tcb> | |
| 30 | +void redox_ev_async_init(tev ev, tcb cb) | |
| 31 | +{ | |
| 32 | +#pragma GCC diagnostic push | |
| 33 | +#pragma GCC diagnostic ignored "-Wstrict-aliasing" | |
| 34 | + ev_async_init(ev,cb); | |
| 35 | +#pragma GCC diagnostic pop | |
| 36 | +} | |
| 37 | + | |
| 38 | +template<typename ttimer, typename tcb, typename tafter, typename trepeat> | |
| 39 | +void redox_ev_timer_init(ttimer timer, tcb cb, tafter after, trepeat repeat) | |
| 40 | +{ | |
| 41 | +#pragma GCC diagnostic push | |
| 42 | +#pragma GCC diagnostic ignored "-Wstrict-aliasing" | |
| 43 | + ev_timer_init(timer,cb,after,repeat); | |
| 44 | +#pragma GCC diagnostic pop | |
| 45 | +} | |
| 46 | + | |
| 47 | +} // anonymous | |
| 48 | + | |
| 27 | 49 | namespace redox { |
| 28 | 50 | |
| 29 | 51 | Redox::Redox(ostream &log_stream, log::Level log_level) |
| ... | ... | @@ -275,16 +297,16 @@ void Redox::runEventLoop() { |
| 275 | 297 | |
| 276 | 298 | // Set up asynchronous watcher which we signal every |
| 277 | 299 | // time we add a command |
| 278 | - ev_async_init(&watcher_command_, processQueuedCommands); | |
| 300 | + redox_ev_async_init(&watcher_command_, processQueuedCommands); | |
| 279 | 301 | ev_async_start(evloop_, &watcher_command_); |
| 280 | 302 | |
| 281 | 303 | // Set up an async watcher to break the loop |
| 282 | - ev_async_init(&watcher_stop_, breakEventLoop); | |
| 304 | + redox_ev_async_init(&watcher_stop_, breakEventLoop); | |
| 283 | 305 | ev_async_start(evloop_, &watcher_stop_); |
| 284 | 306 | |
| 285 | 307 | // Set up an async watcher which we signal every time |
| 286 | 308 | // we want a command freed |
| 287 | - ev_async_init(&watcher_free_, freeQueuedCommands); | |
| 309 | + redox_ev_async_init(&watcher_free_, freeQueuedCommands); | |
| 288 | 310 | ev_async_start(evloop_, &watcher_free_); |
| 289 | 311 | |
| 290 | 312 | setRunning(true); |
| ... | ... | @@ -307,7 +329,7 @@ void Redox::runEventLoop() { |
| 307 | 329 | // Wait to receive server replies for clean hiredis disconnect |
| 308 | 330 | this_thread::sleep_for(chrono::milliseconds(10)); |
| 309 | 331 | ev_run(evloop_, EVRUN_NOWAIT); |
| 310 | - | |
| 332 | + | |
| 311 | 333 | if (getConnectState() == CONNECTED) { |
| 312 | 334 | redisAsyncDisconnect(ctx_); |
| 313 | 335 | } |
| ... | ... | @@ -410,7 +432,7 @@ template <class ReplyT> bool Redox::processQueuedCommand(long id) { |
| 410 | 432 | } else { |
| 411 | 433 | |
| 412 | 434 | c->timer_.data = (void *)c->id_; |
| 413 | - ev_timer_init(&c->timer_, submitCommandCallback<ReplyT>, c->after_, c->repeat_); | |
| 435 | + redox_ev_timer_init(&c->timer_, submitCommandCallback<ReplyT>, c->after_, c->repeat_); | |
| 414 | 436 | ev_timer_start(evloop_, &c->timer_); |
| 415 | 437 | |
| 416 | 438 | c->timer_guard_.unlock(); |
| ... | ... | @@ -610,7 +632,7 @@ string Redox::get(const string &key) { |
| 610 | 632 | string reply = c.reply(); |
| 611 | 633 | c.free(); |
| 612 | 634 | return reply; |
| 613 | -}; | |
| 635 | +} | |
| 614 | 636 | |
| 615 | 637 | bool Redox::set(const string &key, const string &value) { return commandSync({"SET", key, value}); } |
| 616 | 638 | ... | ... |