summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/Dispatcher.cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2007-06-18 12:11:32 +0000
committerAndrew Stitcher <astitcher@apache.org>2007-06-18 12:11:32 +0000
commit45b526ce09daee869ec1313808583f7e05bff7bb (patch)
tree297d2b1f02b14e1fdffbc1074b3d23670859f602 /cpp/src/qpid/sys/Dispatcher.cpp
parent41c30308ad435c338633b97405fe7350d515f069 (diff)
downloadqpid-python-45b526ce09daee869ec1313808583f7e05bff7bb.tar.gz
Intermediate checkin with preliminary work on epoll based net IO
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@548337 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/Dispatcher.cpp')
-rw-r--r--cpp/src/qpid/sys/Dispatcher.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/cpp/src/qpid/sys/Dispatcher.cpp b/cpp/src/qpid/sys/Dispatcher.cpp
new file mode 100644
index 0000000000..4838e5e4cd
--- /dev/null
+++ b/cpp/src/qpid/sys/Dispatcher.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 "Dispatcher.h"
+
+#include <assert.h>
+
+namespace qpid {
+namespace sys {
+
+Dispatcher::Dispatcher(Poller::shared_ptr poller0) :
+ poller(poller0) {
+}
+
+Dispatcher::~Dispatcher() {
+}
+
+void Dispatcher::run() {
+ do {
+ Poller::Event event = poller->wait();
+ // Poller::wait guarantees to return an event
+ DispatchHandle* h = static_cast<DispatchHandle*>(event.handle);
+ switch (event.dir) {
+ case Poller::IN:
+ h->readableCallback(*h);
+ break;
+ case Poller::OUT:
+ h->writableCallback(*h);
+ break;
+ case Poller::INOUT:
+ h->readableCallback(*h);
+ h->writableCallback(*h);
+ break;
+ case Poller::SHUTDOWN:
+ goto dispatcher_shutdown;
+ default:
+ ;
+ }
+ } while (true);
+
+dispatcher_shutdown:
+ ;
+}
+
+void DispatchHandle::watch(Poller::shared_ptr poller0) {
+ bool r = readableCallback;
+ bool w = writableCallback;
+
+ // If no callbacks set then do nothing (that is what we were asked to do!)
+ // TODO: Maybe this should be an assert instead
+ if (!r && !w)
+ return;
+
+ Poller::Direction d = r ?
+ (w ? Poller::INOUT : Poller::IN) :
+ Poller::OUT;
+
+ poller = poller0;
+ poller->addFd(*this, d);
+}
+
+void DispatchHandle::rewatch() {
+ assert(poller);
+ poller->rearmFd(*this);
+}
+
+void DispatchHandle::unwatch() {
+ poller->delFd(*this);
+ poller.reset();
+}
+
+}}