Boost logo

Boost :

From: Christopher Kohlhoff (chris_at_[hidden])
Date: 2005-12-28 07:08:10


Hi Andrew,

--- Andrew Schweitzer <a.schweitzer.grps_at_[hidden]> wrote:
> *Maybe there should be a "run_forever" version of demuxer::run?

If you want it to run forever just give it some "work":

  asio::demuxer d;
  asio::demuxer::work w(d);
  d.run();

In general you'll want to destroy the work object when you
actually do want the demuxer to exit.

> If I read the docs correctly, demuxer::run will exit if it has
> nothing left to do. So if the last timer expires, run will
> exit. The next time a timer is started demuxer::reset and
> demuxer::run must be called again or nothing will happen. Is
> this correct?

Yes. However, an application that is written to use an
asynchronous approach will continue to start asynchronous
operations (e.g. a server will always have an async_accept
operation running).

> Could this happen for sockets as well, if user never called a
> function like read or accept that will sit there forever until
> something happens? For example, if a client problem calls run,
> does an async connect, sends some data, but doesn't do a read,
> then would run stop after the send completed?

Yes.

> Or would run wait for socket to be closed?

No.

> *It looks like deadline_timer objects need to be dynamically
> allocated, right?

No, the deadline_timer object itself does not need to be
dynamically allocated.

> It looks to me that when they destruct they stop themselves.

The destructor implicitly cancels any outstanding asynchronous
wait, yes. The handler for that wait operation is still
dispatched.

> I think this means that there are two dynamic allocations per
> timer started, one for the implementation and one for the
> "handle". Could this be avoided?

Yes, looking at the implementation again I can probably change
it to eliminate the dynamic memory allocation of the handler as
well.

> *Since user must allocate each deadline_timer (assuming above
> correct), then user must remember to toss them when timer
> completes. It might be nice if this could be handled
> automatically.

Since you don't have to dynamically allocate the deadline_timer
object this doesn't apply :)

> *There aren't really unique IDs for timers, right? The address
> of the timer object must be unique as long as the timer is
> running, but after the timer completes it could be re-used for
> another timer, so that doesn't seem like a great idea.

This address is used internally as a cancellation token. Since
the destruction of a deadline_timer automatically cancels the
timer (and removes the token from the backend), it's not a
problem if the address gets reused.

> Does anyone else think unique timer IDs belong in the library?
> I'm not sure it's requirement, but most timer code I've worked
> on has used a unique ID. It's not hard for the application to
> provide this, but it is a bit more work.

What use case are you thinking of here? I have never had a need
for a timer ID when instead I can use boost::bind to associate
whatever data I need directly with the completion handler.

Cheers,
Chris


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk