diff options
author | Martin Sustrik <sustrik@fastmq.commkdir> | 2009-07-29 12:07:54 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@fastmq.commkdir> | 2009-07-29 12:07:54 +0200 |
commit | 4ed70a930202b103e7e80b8dc925e0aaa4622595 (patch) | |
tree | aeed881ce17629f81b7c90f7d675aac8ecf69d4f /src/ypollset.cpp |
initial commit
Diffstat (limited to 'src/ypollset.cpp')
-rw-r--r-- | src/ypollset.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. +*/ + +#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); +} |