You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2008/09/12 23:25:19 UTC

svn commit: r694812 - in /incubator/qpid/trunk/qpid/cpp/src: Makefile.am qpid/sys/PollableCondition.cpp qpid/sys/PollableCondition.h qpid/sys/PollableQueue.h qpid/sys/posix/PollableCondition.cpp qpid/sys/posix/PollableCondition.h

Author: aconway
Date: Fri Sep 12 14:25:16 2008
New Revision: 694812

URL: http://svn.apache.org/viewvc?rev=694812&view=rev
Log:
Moved PollableCondition into sys/posix, posix only impl.

Added:
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp   (with props)
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h   (with props)
Removed:
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.cpp
Modified:
    incubator/qpid/trunk/qpid/cpp/src/Makefile.am
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.h
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableQueue.h

Modified: incubator/qpid/trunk/qpid/cpp/src/Makefile.am
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/Makefile.am?rev=694812&r1=694811&r2=694812&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/Makefile.am (original)
+++ incubator/qpid/trunk/qpid/cpp/src/Makefile.am Fri Sep 12 14:25:16 2008
@@ -75,7 +75,8 @@
   qpid/sys/posix/Shlib.cpp \
   qpid/sys/posix/Mutex.cpp \
   qpid/sys/posix/Fork.cpp \
-  qpid/sys/posix/StrError.cpp
+  qpid/sys/posix/StrError.cpp \
+  qpid/sys/posix/PollableCondition.cpp
 
 posix_plat_hdr = \
   qpid/sys/posix/check.h \
@@ -83,7 +84,8 @@
   qpid/sys/posix/PrivatePosix.h \
   qpid/sys/posix/Mutex.h \
   qpid/sys/posix/Fork.h \
-  qpid/sys/posix/LockFile.h
+  qpid/sys/posix/LockFile.h \
+  qpid/sys/posix/PollableCondition.h 
 
 if HAVE_EPOLL 
   poller = qpid/sys/epoll/EpollPoller.cpp
@@ -266,7 +268,6 @@
   qpid/sys/AsynchIOHandler.cpp \
   qpid/sys/Dispatcher.cpp \
   qpid/sys/PollableCondition.h \
-  qpid/sys/PollableCondition.cpp \
   qpid/sys/PollableQueue.h \
   qpid/sys/Runnable.cpp \
   qpid/sys/SystemInfo.cpp \

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.h?rev=694812&r1=694811&r2=694812&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableCondition.h Fri Sep 12 14:25:16 2008
@@ -22,39 +22,7 @@
  *
  */
 
-#include "qpid/sys/IOHandle.h"
-
-// FIXME aconway 2008-08-11: this could be of more general interest,
-// move to sys namespace in common lib. 
-// 
-
-namespace qpid {
-namespace sys {
-
-/**
- * A pollable condition to integrate in-process conditions with IO
- * conditions in a polling loop.
- *
- * Setting the condition makes it readable for a poller.
- * 
- * Writable/disconnected conditions are undefined and should not be
- * polled for.
- */
-class PollableCondition : public sys::IOHandle {
-  public:
-    PollableCondition();
-
-    /** Set the condition, triggers readable in a poller. */ 
-    void set();
-
-    /** Get the current state of the condition, then clear it.
-     *@return The state of the condition before it was cleared.
-     */
-    bool clear();
-
-  private:
-    int writeFd;
-};
-}} // namespace qpid::sys
+// Currently only has a posix implementation, add #ifdefs for other platforms as needed.
+#include "posix/PollableCondition.h"
 
 #endif  /*!QPID_SYS_POLLABLECONDITION_H*/

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableQueue.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableQueue.h?rev=694812&r1=694811&r2=694812&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableQueue.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/PollableQueue.h Fri Sep 12 14:25:16 2008
@@ -31,13 +31,9 @@
 #include <deque>
 
 namespace qpid {
-
-namespace sys { class Poller; }
-
 namespace sys {
 
-// FIXME aconway 2008-08-11: this could be of more general interest,
-// move to common lib.
+class Poller;
 
 /**
  * A queue that can be polled by sys::Poller.  Any thread can push to

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp?rev=694812&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp Fri Sep 12 14:25:16 2008
@@ -0,0 +1,100 @@
+#ifndef QPID_SYS_LINUX_POLLABLECONDITION_CPP
+#define QPID_SYS_LINUX_POLLABLECONDITION_CPP
+
+/*
+ *
+ * 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.
+ *
+ */
+
+// FIXME aconway 2008-08-11: this could be of more general interest,
+// move to common lib.
+// 
+
+#include "PollableCondition.h"
+#include "qpid/sys/posix/PrivatePosix.h"
+#include "qpid/Exception.h"
+
+#include <unistd.h>
+#include <fcntl.h>
+
+namespace qpid {
+namespace sys {
+
+PollableCondition::PollableCondition() : IOHandle(new sys::IOHandlePrivate) {
+    int fds[2];
+    if (::pipe(fds) == -1)
+        throw ErrnoException(QPID_MSG("Can't create PollableCondition"));
+    impl->fd = fds[0];
+    writeFd = fds[1];
+    if (::fcntl(impl->fd, F_SETFL, O_NONBLOCK) == -1)
+        throw ErrnoException(QPID_MSG("Can't create PollableCondition"));
+    if (::fcntl(writeFd, F_SETFL, O_NONBLOCK) == -1)
+        throw ErrnoException(QPID_MSG("Can't create PollableCondition"));
+}
+
+bool PollableCondition::clear() {
+    char buf[256];
+    ssize_t n;
+    bool wasSet = false;
+    while ((n = ::read(impl->fd, buf, sizeof(buf))) > 0) 
+        wasSet = true;
+    if (n == -1 && errno != EAGAIN) throw ErrnoException(QPID_MSG("Error clearing PollableCondition"));
+    return wasSet;
+}
+
+void PollableCondition::set() {
+    static const char dummy=0;
+    ssize_t n = ::write(writeFd, &dummy, 1);
+    if (n == -1 && errno != EAGAIN) throw ErrnoException("Error setting PollableCondition");
+}
+
+
+#if 0
+// FIXME aconway 2008-08-12: More efficient Linux implementation using
+// eventfd system call.  Move to separate file & do configure.ac test
+// to enable this when ::eventfd() is available.
+
+#include <sys/eventfd.h>
+
+namespace qpid {
+namespace sys {
+
+PollableCondition::PollableCondition() : IOHandle(new sys::IOHandlePrivate) {
+    impl->fd = ::eventfd(0, 0);
+    if (impl->fd < 0) throw ErrnoException("conditionfd() failed");
+}
+
+bool PollableCondition::clear() {
+    char buf[8];
+    ssize_t n = ::read(impl->fd, buf, 8);
+    if (n != 8) throw ErrnoException("read failed on conditionfd");
+    return *reinterpret_cast<uint64_t*>(buf);
+}
+
+void PollableCondition::set() {
+    static const uint64_t value=1;
+    ssize_t n = ::write(impl->fd, reinterpret_cast<const void*>(&value), 8);
+    if (n != 8) throw ErrnoException("write failed on conditionfd");
+}
+    
+#endif
+
+}} // namespace qpid::sys
+
+#endif  /*!QPID_SYS_LINUX_POLLABLECONDITION_CPP*/

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.cpp
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h?rev=694812&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h (added)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h Fri Sep 12 14:25:16 2008
@@ -0,0 +1,56 @@
+#ifndef QPID_SYS_POSIX_POLLABLECONDITION_H
+#define QPID_SYS_POSIX_POLLABLECONDITION_H
+
+/*
+ *
+ * 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/IOHandle.h"
+
+namespace qpid {
+namespace sys {
+
+/**
+ * A pollable condition to integrate in-process conditions with IO
+ * conditions in a polling loop.
+ *
+ * Setting the condition makes it readable for a poller.
+ * 
+ * Writable/disconnected conditions are undefined and should not be
+ * polled for.
+ */
+class PollableCondition : public sys::IOHandle {
+  public:
+    PollableCondition();
+
+    /** Set the condition, triggers readable in a poller. */ 
+    void set();
+
+    /** Get the current state of the condition, then clear it.
+     *@return The state of the condition before it was cleared.
+     */
+    bool clear();
+
+  private:
+    int writeFd;
+};
+}} // namespace qpid::sys
+
+#endif  /*!QPID_SYS_POSIX_POLLABLECONDITION_H*/

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PollableCondition.h
------------------------------------------------------------------------------
    svn:keywords = Rev Date