From 4ed70a930202b103e7e80b8dc925e0aaa4622595 Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Wed, 29 Jul 2009 12:07:54 +0200 Subject: initial commit --- src/ypollset.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/ypollset.cpp (limited to 'src/ypollset.cpp') diff --git a/src/ypollset.cpp b/src/ypollset.cpp new file mode 100644 index 0000000..0be6791 --- /dev/null +++ b/src/ypollset.cpp @@ -0,0 +1,56 @@ +/* + Copyright (c) 2007-2009 FastMQ Inc. + + This file is part of 0MQ. + + 0MQ is free software; you can redistribute it and/or modify it under + the terms of the Lesser GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + 0MQ is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + Lesser GNU General Public License for more details. + + You should have received a copy of the Lesser GNU General Public License + along with this program. If not, see . +*/ + +#include "ypollset.hpp" + +zs::ypollset_t::ypollset_t () +{ +} + +void zs::ypollset_t::signal (int signal_) +{ + zs_assert (signal_ >= 0 && signal_ < wait_signal); + if (bits.btsr (signal_, wait_signal)) + sem.post (); +} + +zs::ypollset_t::signals_t zs::ypollset_t::poll () +{ + signals_t result = 0; + while (!result) { + result = bits.izte (signals_t (1) << wait_signal, 0); + if (!result) { + sem.wait (); + result = bits.xchg (0); + } + + // If btsr was really atomic, result would never be 0 at this + // point, i.e. no looping would be possible. However, to + // support even CPU architectures without CAS instruction + // we allow btsr to be composed of two independent atomic + // operation (set and reset). In such case looping can occur + // sporadically. + } + return result; +} + +zs::ypollset_t::signals_t zs::ypollset_t::check () +{ + return bits.xchg (0); +} -- cgit v1.2.3