Don't use classes nested in function definitions since they cause problems
for the VC7.1 linker.
This commit is contained in:
parent
2fab66c440
commit
03b978c7f9
@ -74,42 +74,8 @@ public:
|
||||
|
||||
if (h == &task_handler_)
|
||||
{
|
||||
// Helper class to perform operations on block exit.
|
||||
class cleanup
|
||||
{
|
||||
public:
|
||||
cleanup(asio::detail::mutex::scoped_lock& lock,
|
||||
handler_base*& handler_queue, handler_base*& handler_queue_end,
|
||||
handler_base& task_handler)
|
||||
: lock_(lock),
|
||||
handler_queue_(handler_queue),
|
||||
handler_queue_end_(handler_queue_end),
|
||||
task_handler_(task_handler)
|
||||
{
|
||||
}
|
||||
|
||||
~cleanup()
|
||||
{
|
||||
// Reinsert the task at the end of the handler queue.
|
||||
lock_.lock();
|
||||
task_handler_.next_ = 0;
|
||||
if (handler_queue_end_)
|
||||
{
|
||||
handler_queue_end_->next_ = &task_handler_;
|
||||
handler_queue_end_ = &task_handler_;
|
||||
}
|
||||
else
|
||||
{
|
||||
handler_queue_ = handler_queue_end_ = &task_handler_;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
asio::detail::mutex::scoped_lock& lock_;
|
||||
handler_base*& handler_queue_;
|
||||
handler_base*& handler_queue_end_;
|
||||
handler_base& task_handler_;
|
||||
} c(lock, handler_queue_, handler_queue_end_, task_handler_);
|
||||
task_cleanup c(lock, handler_queue_,
|
||||
handler_queue_end_, task_handler_);
|
||||
|
||||
// Run the task. May throw an exception. Only block if the handler
|
||||
// queue is empty, otherwise we want to return as soon as possible to
|
||||
@ -118,27 +84,7 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
// Helper class to perform operations on block exit.
|
||||
class cleanup
|
||||
{
|
||||
public:
|
||||
cleanup(asio::detail::mutex::scoped_lock& lock,
|
||||
int& outstanding_work)
|
||||
: lock_(lock),
|
||||
outstanding_work_(outstanding_work)
|
||||
{
|
||||
}
|
||||
|
||||
~cleanup()
|
||||
{
|
||||
lock_.lock();
|
||||
--outstanding_work_;
|
||||
}
|
||||
|
||||
private:
|
||||
asio::detail::mutex::scoped_lock& lock_;
|
||||
int& outstanding_work_;
|
||||
} c(lock, outstanding_work_);
|
||||
handler_cleanup c(lock, outstanding_work_);
|
||||
|
||||
// Invoke the handler. May throw an exception.
|
||||
h->call(allocator_); // call() deletes the handler object
|
||||
@ -357,6 +303,65 @@ private:
|
||||
Handler handler_;
|
||||
};
|
||||
|
||||
// Helper class to perform task-related operations on block exit.
|
||||
class task_cleanup
|
||||
{
|
||||
public:
|
||||
task_cleanup(asio::detail::mutex::scoped_lock& lock,
|
||||
handler_base*& handler_queue, handler_base*& handler_queue_end,
|
||||
handler_base& task_handler)
|
||||
: lock_(lock),
|
||||
handler_queue_(handler_queue),
|
||||
handler_queue_end_(handler_queue_end),
|
||||
task_handler_(task_handler)
|
||||
{
|
||||
}
|
||||
|
||||
~task_cleanup()
|
||||
{
|
||||
// Reinsert the task at the end of the handler queue.
|
||||
lock_.lock();
|
||||
task_handler_.next_ = 0;
|
||||
if (handler_queue_end_)
|
||||
{
|
||||
handler_queue_end_->next_ = &task_handler_;
|
||||
handler_queue_end_ = &task_handler_;
|
||||
}
|
||||
else
|
||||
{
|
||||
handler_queue_ = handler_queue_end_ = &task_handler_;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
asio::detail::mutex::scoped_lock& lock_;
|
||||
handler_base*& handler_queue_;
|
||||
handler_base*& handler_queue_end_;
|
||||
handler_base& task_handler_;
|
||||
};
|
||||
|
||||
// Helper class to perform handler-related operations on block exit.
|
||||
class handler_cleanup
|
||||
{
|
||||
public:
|
||||
handler_cleanup(asio::detail::mutex::scoped_lock& lock,
|
||||
int& outstanding_work)
|
||||
: lock_(lock),
|
||||
outstanding_work_(outstanding_work)
|
||||
{
|
||||
}
|
||||
|
||||
~handler_cleanup()
|
||||
{
|
||||
lock_.lock();
|
||||
--outstanding_work_;
|
||||
}
|
||||
|
||||
private:
|
||||
asio::detail::mutex::scoped_lock& lock_;
|
||||
int& outstanding_work_;
|
||||
};
|
||||
|
||||
// Mutex to protect access to internal data.
|
||||
asio::detail::mutex mutex_;
|
||||
|
||||
|
@ -72,6 +72,23 @@ public:
|
||||
::CreateIoCompletionPort(sock_as_handle, iocp_.handle, 0, 0);
|
||||
}
|
||||
|
||||
struct auto_work
|
||||
{
|
||||
auto_work(win_iocp_io_service& io_service)
|
||||
: io_service_(io_service)
|
||||
{
|
||||
io_service_.work_started();
|
||||
}
|
||||
|
||||
~auto_work()
|
||||
{
|
||||
io_service_.work_finished();
|
||||
}
|
||||
|
||||
private:
|
||||
win_iocp_io_service& io_service_;
|
||||
};
|
||||
|
||||
// Run the event processing loop.
|
||||
void run()
|
||||
{
|
||||
@ -100,22 +117,7 @@ public:
|
||||
{
|
||||
// Ensure that the io_service does not exit due to running out of work
|
||||
// while we make the upcall.
|
||||
struct auto_work
|
||||
{
|
||||
auto_work(win_iocp_io_service& io_service)
|
||||
: io_service_(io_service)
|
||||
{
|
||||
io_service_.work_started();
|
||||
}
|
||||
|
||||
~auto_work()
|
||||
{
|
||||
io_service_.work_finished();
|
||||
}
|
||||
|
||||
private:
|
||||
win_iocp_io_service& io_service_;
|
||||
} work(*this);
|
||||
auto_work work(*this);
|
||||
|
||||
// Dispatch the operation.
|
||||
operation* op = static_cast<operation*>(overlapped);
|
||||
|
Loading…
Reference in New Issue
Block a user