source: xplra/src/plugin/src/xplra/RequestQueue.cc@ 49:2f52c296803c

Last change on this file since 49:2f52c296803c was 13:42fd631176b7, checked in by István Váradi <ivaradi@…>, 11 years ago

Reorganized code to be able to handle the client library as a normal libtool library

File size: 4.6 KB
Line 
1// Copyright (c) 2013 by István Váradi
2
3// This file is part of XPLRA, a remote-access plugin for X-Plane
4
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7
8// 1. Redistributions of source code must retain the above copyright notice, this
9// list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25// The views and conclusions contained in the software and documentation are those
26// of the authors and should not be interpreted as representing official policies,
27// either expressed or implied, of the FreeBSD Project.
28
29//------------------------------------------------------------------------------
30
31#include "RequestQueue.h"
32
33#include "Request.h"
34
35#include <hu/varadiistvan/xplcommon/Util.h>
36
37//------------------------------------------------------------------------------
38
39using xplra::RequestQueue;
40
41using hu::varadiistvan::xplcommon::Util;
42
43//------------------------------------------------------------------------------
44
45float RequestQueue::flightLoop(float /*inElapsedSinceLastCall*/,
46 float /*inElapsedTimeSinceLastFlightLoop*/,
47 int /*inCounter*/, void* inRefCon)
48{
49 RequestQueue* requestQueue = reinterpret_cast<RequestQueue*>(inRefCon);
50 requestQueue->run();
51#if USE_SCHEDULE_FLIGHTLOOP
52 return 0.0;
53#else
54 return flightLoopInterval;
55#endif
56}
57
58//------------------------------------------------------------------------------
59
60RequestQueue::RequestQueue() :
61 enabled(true)
62{
63#if USE_SCHEDULE_FLIGHTLOOP
64 XPLMCreateFlightLoop_t createFL;
65
66 createFL.structSize = sizeof(createFL);
67 createFL.phase = xplm_FlightLoop_Phase_AfterFlightModel;
68 createFL.callbackFunc = &flightLoop;
69 createFL.refcon = this;
70
71 flightLoopID = XPLMCreateFlightLoop(&createFL);
72#else
73 XPLMRegisterFlightLoopCallback(&flightLoop, flightLoopInterval, this);
74#endif
75}
76
77//------------------------------------------------------------------------------
78
79bool RequestQueue::execute(Request* request)
80{
81 mutex.lock();
82 if (!enabled) {
83 mutex.unlock();
84 return false;
85 }
86
87 request->completed = false;
88 requests.push_back(request);
89
90#if USE_SCHEDULE_FLIGHTLOOP
91 if (requests.size()==1) {
92 XPLMScheduleFlightLoop(flightLoopID, -2.0, true);
93 }
94#endif
95
96 while(enabled && !request->completed) {
97 requestsDone.wait(mutex);
98 }
99
100 bool result = request->completed;
101
102 mutex.unlock();
103
104 return result;
105}
106
107//------------------------------------------------------------------------------
108
109void RequestQueue::disable()
110{
111 mutex.lock();
112 enabled = false;
113 mutex.unlock();
114 requestsDone.broadcast();
115#if USE_SCHEDULE_FLIGHTLOOP
116 XPLMDestroyFlightLoop(flightLoopID);
117#else
118 XPLMUnregisterFlightLoopCallback(&flightLoop, this);
119#endif
120}
121
122//------------------------------------------------------------------------------
123
124void RequestQueue::run()
125{
126 requests_t queuedRequests;
127
128 mutex.lock();
129 requests.swap(queuedRequests);
130 mutex.unlock();
131
132 if (queuedRequests.empty()) return;
133
134 for(requests_t::const_iterator i = queuedRequests.begin();
135 i!=queuedRequests.end(); ++i)
136 {
137 (*i)->execute();
138 }
139
140 mutex.lock();
141 for(requests_t::const_iterator i = queuedRequests.begin();
142 i!=queuedRequests.end(); ++i)
143 {
144 (*i)->completed = true;
145 }
146 mutex.unlock();
147 requestsDone.broadcast();
148}
149
150//------------------------------------------------------------------------------
151
152// Local Variables:
153// mode: C++
154// c-basic-offset: 4
155// indent-tabs-mode: nil
156// End:
Note: See TracBrowser for help on using the repository browser.