• Refactor state management code to use three methods .connect(),
    .disconnect(), and .wait(). Start conforming to uniform coding style
    already applied to Command class.
    
    Split off subscribe functionality into its own class Subscriber. This is
    good because it was introducing unnecessary state and complexity into
    the main client. Now, Redox handles publishing like any other command
    and the Subscriber receives messages.
    Hayk Martirosyan authored
     
    Browse File »

  • Now, there is only one callback for command(), and it returns a const
    reference to the Command object. The user is responsible for error
    checking using c.ok(), c.status(), and getting the reply with c.reply().
    This significantly cleans up the library code and the user code.
    
    Greatly refactored the data type specialization code in command.cpp.
    Hayk Martirosyan authored
     
    Browse File »


  • Consolidated user callbacks into one, improved some logic.
    Hayk Martirosyan authored
     
    Browse File »
  • Created an atomic_int connect_state that keeps track of not yet
    connected, connected, disconnected, and errors. Used to implement good
    error behavior when the server is down and you start() a Redox instance,
    or when the server goes down in the middle of running commands. Now,
    nothing should hang, but should return errors (or throw exceptions) when
    the server goes down.
    
    Also added hooks for a user connect/disconnect callback in the
    constructor, which is helpful for client programs.
    
    Added an example with three Redox clients in one thread.
    Hayk Martirosyan authored
     
    Browse File »



  • Hayk Martirosyan authored
     
    Browse File »
  • The event loop (now libev) now runs in a separate detached thread,
    which is abstracted away from the user, who only calls a nonblocking
    .start() method. This thread loops continously, alternating telling
    Redis about asynchronous commands ready to send, and running one
    iteration of the event loop, where all pending events are taken
    care of. This greatly simplifies the user code.
    
    Additionally, some clever tricker is implemented now to handle
    memory management well with the templated command types. The
    difficulty comes from the fact that we pass redis a void pointer
    only, and must retreive everything from that (so, we can't use
    shared_ptr for the whole thing). Thus, we use maps of void pointers
    to their templated data structure pointers, where the memory address
    of the pointer serves as the key.
    Hayk Martirosyan authored
     
    Browse File »