1 /** 2 * Copyright (c) 2006-2016 LOVE Development Team 3 * 4 * This software is provided 'as-is', without any express or implied 5 * warranty. In no event will the authors be held liable for any damages 6 * arising from the use of this software. 7 * 8 * Permission is granted to anyone to use this software for any purpose, 9 * including commercial applications, and to alter it and redistribute it 10 * freely, subject to the following restrictions: 11 * 12 * 1. The origin of this software must not be misrepresented; you must not 13 * claim that you wrote the original software. If you use this software 14 * in a product, an acknowledgment in the product documentation would be 15 * appreciated but is not required. 16 * 2. Altered source versions must be plainly marked as such, and must not be 17 * misrepresented as being the original software. 18 * 3. This notice may not be removed or altered from any source distribution. 19 **/ 20 21 #ifndef LOVE_THREAD_CHANNEL_H 22 #define LOVE_THREAD_CHANNEL_H 23 24 // STL 25 #include <queue> 26 #include <string> 27 28 // LOVE 29 #include "common/Variant.h" 30 #include "threads.h" 31 32 namespace love 33 { 34 namespace thread 35 { 36 37 class Channel : public love::Object 38 { 39 // FOR WRAPPER USE ONLY 40 friend int w_Channel_performAtomic(lua_State *); 41 42 public: 43 44 Channel(); 45 ~Channel(); 46 47 static Channel *getChannel(const std::string &name); 48 49 unsigned long push(const Variant &var); 50 void supply(const Variant &var); // blocking push 51 bool pop(Variant *var); 52 void demand(Variant *var); // blocking pop 53 bool peek(Variant *var); 54 int getCount(); 55 void clear(); 56 57 private: 58 59 Channel(const std::string &name); 60 void lockMutex(); 61 void unlockMutex(); 62 63 MutexRef mutex; 64 ConditionalRef cond; 65 std::queue<Variant> queue; 66 bool named; 67 std::string name; 68 69 unsigned long sent; 70 unsigned long received; 71 72 }; // Channel 73 74 } // thread 75 } // love 76 77 #endif // LOVE_THREAD_CHANNEL_H 78