diff options
| author | Stephen D. Huston <shuston@apache.org> | 2008-10-30 23:18:07 +0000 |
|---|---|---|
| committer | Stephen D. Huston <shuston@apache.org> | 2008-10-30 23:18:07 +0000 |
| commit | 18af9009d719ce758678185ae0a57967da5ca6fe (patch) | |
| tree | a291bdc0dc2e139249ddad5c0bb883fe8dde426a /cpp/src/qpid/sys/windows | |
| parent | 5d74de00280c14e33964b099d6658a147479b4ca (diff) | |
| download | qpid-python-18af9009d719ce758678185ae0a57967da5ca6fe.tar.gz | |
Resolve Time diffs for Windows; add Windows version of asynch I/O layer. Resolves QPID-1209
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@709285 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/windows')
| -rw-r--r-- | cpp/src/qpid/sys/windows/AsynchIO.cpp | 38 | ||||
| -rwxr-xr-x | cpp/src/qpid/sys/windows/AsynchIoResult.h | 4 | ||||
| -rwxr-xr-x | cpp/src/qpid/sys/windows/Condition.h | 4 | ||||
| -rw-r--r-- | cpp/src/qpid/sys/windows/Time.cpp | 90 | ||||
| -rw-r--r-- | cpp/src/qpid/sys/windows/Time.h | 36 |
5 files changed, 155 insertions, 17 deletions
diff --git a/cpp/src/qpid/sys/windows/AsynchIO.cpp b/cpp/src/qpid/sys/windows/AsynchIO.cpp index bde1213131..e5efc874aa 100644 --- a/cpp/src/qpid/sys/windows/AsynchIO.cpp +++ b/cpp/src/qpid/sys/windows/AsynchIO.cpp @@ -32,6 +32,7 @@ #include <boost/thread/once.hpp> +#include <queue> #include <winsock2.h> #include <mswsock.h> #include <windows.h> @@ -147,7 +148,7 @@ void AsynchAcceptorPrivate::start(Poller::shared_ptr poller) { restart (); } -void AsynchAcceptor::restart(void) { +void AsynchAcceptorPrivate::restart(void) { DWORD bytesReceived = 0; // Not used, needed for AcceptEx API AsynchAcceptResult *result = new AsynchAcceptResult(acceptedCallback, this, @@ -166,7 +167,7 @@ void AsynchAcceptor::restart(void) { AsynchAcceptResult::AsynchAcceptResult(AsynchAcceptor::Callback cb, - AsynchAcceptor *acceptor, + AsynchAcceptorPrivate *acceptor, SOCKET listener) : callback(cb), acceptor(acceptor), listener(listener) { newSocket.reset (new Socket()); @@ -318,21 +319,27 @@ private: volatile bool queuedClose; private: - void close(void); + // Dispatch events that have completed. + void dispatchReadComplete(AsynchIO::BufferBase *buffer); + void notifyEof(void); + void notifyDisconnect(void); + void notifyClosed(void); + void notifyBuffersEmpty(void); + void notifyIdle(void); /** * Initiate a read operation. AsynchIO::dispatchReadComplete() will be * called when the read is complete and data is available. */ - virtual void startRead(void); + void startRead(void); /** * Initiate a write of the specified buffer. There's no callback for * write completion to the AsynchIO object. */ - virtual void startWrite(AsynchIO::BufferBase* buff); + void startWrite(AsynchIO::BufferBase* buff); - virtual bool writesNotComplete(); + void close(void); /** * readComplete is called when a read request is complete. @@ -602,10 +609,6 @@ void AsynchIO::startWrite(AsynchIO::BufferBase* buff) { return; } -bool AsynchIO::writesNotComplete() { - return writeInProgress; -} - /* * Close the socket and callback to say we've done it */ @@ -726,4 +729,17 @@ void AsynchIO::completion(AsynchIoResult *result) { delete this; } -}} // namespace qpid::windows +} // namespace windows + +AsynchIO* qpid::sys::AsynchIO::create(const Socket& s, + AsynchIO::ReadCallback rCb, + AsynchIO::EofCallback eofCb, + AsynchIO::DisconnectCallback disCb, + AsynchIO::ClosedCallback cCb, + AsynchIO::BuffersEmptyCallback eCb, + AsynchIO::IdleCallback iCb) +{ + return new qpid::sys::windows::AsynchIO(s, rCb, eofCb, disCb, cCb, eCb, iCb); +} + +}} // namespace qpid::sys diff --git a/cpp/src/qpid/sys/windows/AsynchIoResult.h b/cpp/src/qpid/sys/windows/AsynchIoResult.h index 9efdaebda8..7db4e9c331 100755 --- a/cpp/src/qpid/sys/windows/AsynchIoResult.h +++ b/cpp/src/qpid/sys/windows/AsynchIoResult.h @@ -22,7 +22,7 @@ * */ -#include "AsynchIO.h" +#include "qpid/sys/AsynchIO.h" #include "qpid/sys/Socket.h" #include <memory.h> #include <winsock2.h> @@ -101,8 +101,6 @@ private: char addressBuffer[SOCKADDRBUFLEN]; }; -class AsynchIO; - class AsynchIoResult : public AsynchResult { public: typedef boost::function1<void, AsynchIoResult *> Completer; diff --git a/cpp/src/qpid/sys/windows/Condition.h b/cpp/src/qpid/sys/windows/Condition.h index e16fa2a176..979fae9b0a 100755 --- a/cpp/src/qpid/sys/windows/Condition.h +++ b/cpp/src/qpid/sys/windows/Condition.h @@ -65,9 +65,7 @@ void Condition::wait(Mutex& mutex) { } bool Condition::wait(Mutex& mutex, const AbsTime& absoluteTime){ - boost::system_time st; - toPtime(st, absoluteTime); - return condition.timed_wait(mutex.mutex, st); + return condition.timed_wait(mutex.mutex, absoluteTime.getPrivate()); } void Condition::notify(){ diff --git a/cpp/src/qpid/sys/windows/Time.cpp b/cpp/src/qpid/sys/windows/Time.cpp new file mode 100644 index 0000000000..477a06656c --- /dev/null +++ b/cpp/src/qpid/sys/windows/Time.cpp @@ -0,0 +1,90 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +#include "qpid/sys/Time.h" +#include <ostream> +#include <boost/date_time/posix_time/posix_time.hpp> +#include <boost/thread/thread_time.hpp> +#include <windows.h> + +using namespace boost::posix_time; + +namespace qpid { +namespace sys { + +AbsTime::AbsTime(const AbsTime& t, const Duration& d) { + if (d == Duration::max()) { + timepoint = ptime(max_date_time); + } + else { + time_duration td = microseconds(d.nanosecs / 1000); + timepoint = t.timepoint + td; + } +} + +AbsTime AbsTime::FarFuture() { + AbsTime ff; + ptime maxd(max_date_time); + ff.timepoint = maxd; + return ff; +} + +AbsTime AbsTime::now() { + AbsTime time_now; + time_now.timepoint = boost::get_system_time(); + return time_now; +} + +Duration::Duration(const AbsTime& time0) : nanosecs(0) { + time_period p(ptime(min_date_time), time0.timepoint); + nanosecs = p.length().total_nanoseconds(); +} + +Duration::Duration(const AbsTime& start, const AbsTime& finish) { + time_duration d = finish.timepoint - start.timepoint; + nanosecs = d.total_nanoseconds(); +} + +std::ostream& operator<<(std::ostream& o, const Duration& d) { + return o << int64_t(d) << "ns"; +} + +std::ostream& operator<<(std::ostream& o, const AbsTime& t) { + std::string time_string = to_simple_string(t.timepoint); + return o << time_string; +} + +void toPtime(ptime& pt, const AbsTime& t) { + pt = t.getPrivate(); +} + +void sleep(int secs) { + ::Sleep(secs * 1000); +} + +void usleep(uint32_t usecs) { + DWORD msecs = usecs / 1000; + if (msecs == 0) + msecs = 1; + ::Sleep(msecs); +} + +}} diff --git a/cpp/src/qpid/sys/windows/Time.h b/cpp/src/qpid/sys/windows/Time.h new file mode 100644 index 0000000000..49b3c4bab3 --- /dev/null +++ b/cpp/src/qpid/sys/windows/Time.h @@ -0,0 +1,36 @@ +#ifndef QPID_SYS_WINDOWS_TIME_H +#define QPID_SYS_WINDOWS_TIME_H + +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <boost/date_time/posix_time/posix_time.hpp> + +namespace qpid { +namespace sys { + +/** + * Class to represent an instant in time. Boost has this stuff already done + * so just reuse it. We can also grab this for quick use with the Condition + * wait operations. + */ +typedef boost::posix_time::ptime TimePrivate; + +}} // namespace qpid::sys + +#endif /*!QPID_SYS_WINDOWS_TIME_H*/ |
