source: source/ariba/utility/transport/asio/unique_io_service.cpp@ 12774

Last change on this file since 12774 was 10653, checked in by Michael Tänzer, 12 years ago

Merge the ASIO branch back into trunk

File size: 3.9 KB
Line 
1// [License]
2// The Ariba-Underlay Copyright
3//
4// Copyright (c) 2008-2012, Institute of Telematics, UniversitÀt Karlsruhe (TH)
5//
6// Institute of Telematics
7// UniversitÀt Karlsruhe (TH)
8// Zirkel 2, 76128 Karlsruhe
9// Germany
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// THIS SOFTWARE IS PROVIDED BY THE INSTITUTE OF TELEMATICS ``AS IS'' AND
22// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARIBA PROJECT OR
25// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32//
33// The views and conclusions contained in the software and documentation
34// are those of the authors and should not be interpreted as representing
35// official policies, either expressed or implied, of the Institute of
36// Telematics.
37// [License]
38
39/**
40 * @author Mario Hock <mario@omnifile.org>, Michael TÀnzer <neo@nhng.de>
41 */
42
43#include "unique_io_service.h"
44
45#include <boost/asio.hpp>
46#include <boost/thread.hpp>
47
48namespace ariba {
49namespace transport {
50namespace detail {
51
52using namespace std;
53
54
55/* init static members */
56boost::asio::io_service* unique_io_service::asio_io_service = NULL;
57int unique_io_service::asio_io_service_ref_count = 0;
58boost::thread* unique_io_service::thread = NULL;
59int unique_io_service::run_count = 0;
60boost::mutex unique_io_service::thread_stopped_mutex;
61boost::condition_variable unique_io_service::thread_stopped_cond;
62bool unique_io_service::thread_stopped = true;
63
64
65unique_io_service::unique_io_service():
66 running(false)
67{
68 if ( asio_io_service_ref_count == 0 )
69 {
70 asio_io_service = new boost::asio::io_service();
71 }
72
73 asio_io_service_ref_count++;
74}
75
76
77
78unique_io_service::~unique_io_service()
79{
80 assert( !running );
81
82 asio_io_service_ref_count--;
83
84 if ( asio_io_service_ref_count <= 0 )
85 {
86 delete asio_io_service;
87 asio_io_service = NULL;
88 }
89}
90
91
92
93boost::asio::io_service & unique_io_service::get_asio_io_service()
94{
95 assert(asio_io_service != NULL );
96
97 return *asio_io_service;
98}
99
100
101
102void unique_io_service::start()
103{
104 assert(!running);
105
106 boost::mutex::scoped_lock lock(thread_stopped_mutex);
107 if (thread_stopped)
108 {
109 thread_stopped = false;
110 thread = new boost::thread(&unique_io_service::thread_function);
111 }
112
113 run_count++;
114 running = true;
115}
116
117
118
119void unique_io_service::stop()
120{
121 assert( running );
122
123 running = false;
124 run_count--;
125
126 if ( run_count == 0 )
127 {
128 asio_io_service->stop();
129
130 boost::mutex::scoped_lock lock(thread_stopped_mutex);
131 while (!thread_stopped)
132 {
133 thread_stopped_cond.wait(lock);
134 }
135 delete thread;
136 }
137}
138
139
140void unique_io_service::thread_function()
141{
142 asio_io_service->run();
143
144 {
145 boost::mutex::scoped_lock lock(thread_stopped_mutex);
146 thread_stopped = true;
147 }
148 thread_stopped_cond.notify_one();
149}
150
151
152}}} // namespace ariba::transport::detail
Note: See TracBrowser for help on using the repository browser.