diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-03-31 15:23:14 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-03-31 15:23:14 -0700 |
| commit | 647ce82b86a56c45f07cd69d5cabedd083179365 (patch) | |
| tree | 9874c3c4b1c240b53cf8249f7c55ce11ec7994e2 /node/Thread.hpp | |
| parent | e61a40a956dfa538be8c8fec1448a9e51acd02e5 (diff) | |
| download | infinitytier-647ce82b86a56c45f07cd69d5cabedd083179365.tar.gz infinitytier-647ce82b86a56c45f07cd69d5cabedd083179365.zip | |
Move more stuff into osdep/ -- node/ will not use threads directly.
Diffstat (limited to 'node/Thread.hpp')
| -rw-r--r-- | node/Thread.hpp | 203 |
1 files changed, 0 insertions, 203 deletions
diff --git a/node/Thread.hpp b/node/Thread.hpp deleted file mode 100644 index c8c99f29..00000000 --- a/node/Thread.hpp +++ /dev/null @@ -1,203 +0,0 @@ -/*
- * ZeroTier One - Network Virtualization Everywhere
- * Copyright (C) 2011-2015 ZeroTier, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * --
- *
- * ZeroTier may be used and distributed under the terms of the GPLv3, which
- * are available at: http://www.gnu.org/licenses/gpl-3.0.html
- *
- * If you would like to embed ZeroTier into a commercial application or
- * redistribute it in a modified binary form, please contact ZeroTier Networks
- * LLC. Start here: http://www.zerotier.com/
- */
-
-#ifndef ZT_THREAD_HPP
-#define ZT_THREAD_HPP
-
-#include <stdexcept>
-
-#include "Constants.hpp"
-
-#ifdef __WINDOWS__
-
-#include <WinSock2.h>
-#include <Windows.h>
-#include <string.h>
-#include "Mutex.hpp"
-
-namespace ZeroTier {
-
-template<typename C>
-static DWORD WINAPI ___zt_threadMain(LPVOID lpParam)
-{
- try {
- ((C *)lpParam)->threadMain();
- } catch ( ... ) {}
- return 0;
-}
-
-class Thread
-{
-public:
- Thread()
- throw()
- {
- _th = NULL;
- _tid = 0;
- }
-
- template<typename C>
- static inline Thread start(C *instance)
- throw(std::runtime_error)
- {
- Thread t;
- t._th = CreateThread(NULL,0,&___zt_threadMain<C>,(LPVOID)instance,0,&t._tid);
- if (t._th == NULL)
- throw std::runtime_error("CreateThread() failed");
- return t;
- }
-
- static inline void join(const Thread &t)
- {
- if (t._th != NULL) {
- for(;;) {
- DWORD ec = STILL_ACTIVE;
- GetExitCodeThread(t._th,&ec);
- if (ec == STILL_ACTIVE)
- WaitForSingleObject(t._th,1000);
- else break;
- }
- }
- }
-
- static inline void sleep(unsigned long ms)
- {
- Sleep((DWORD)ms);
- }
-
- // Not available on *nix platforms
- static inline void cancelIO(const Thread &t)
- {
- if (t._th != NULL)
- CancelSynchronousIo(t._th);
- }
-
- inline operator bool() const throw() { return (_th != NULL); }
-
-private:
- HANDLE _th;
- DWORD _tid;
-};
-
-} // namespace ZeroTier
-
-#else
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pthread.h>
-#include <unistd.h>
-
-namespace ZeroTier {
-
-template<typename C>
-static void *___zt_threadMain(void *instance)
-{
- try {
- ((C *)instance)->threadMain();
- } catch ( ... ) {}
- return (void *)0;
-}
-
-/**
- * A thread identifier, and static methods to start and join threads
- */
-class Thread
-{
-public:
- Thread()
- throw()
- {
- memset(&_tid,0,sizeof(_tid));
- _started = false;
- }
-
- Thread(const Thread &t)
- throw()
- {
- memcpy(&_tid,&(t._tid),sizeof(_tid));
- _started = t._started;
- }
-
- inline Thread &operator=(const Thread &t)
- throw()
- {
- memcpy(&_tid,&(t._tid),sizeof(_tid));
- _started = t._started;
- return *this;
- }
-
- /**
- * Start a new thread
- *
- * @param instance Instance whose threadMain() method gets called by new thread
- * @return Thread identifier
- * @throws std::runtime_error Unable to create thread
- * @tparam C Class containing threadMain()
- */
- template<typename C>
- static inline Thread start(C *instance)
- throw(std::runtime_error)
- {
- Thread t;
- t._started = true;
- if (pthread_create(&t._tid,(const pthread_attr_t *)0,&___zt_threadMain<C>,instance))
- throw std::runtime_error("pthread_create() failed, unable to create thread");
- return t;
- }
-
- /**
- * Join to a thread, waiting for it to terminate (does nothing on null Thread values)
- *
- * @param t Thread to join
- */
- static inline void join(const Thread &t)
- {
- if (t._started)
- pthread_join(t._tid,(void **)0);
- }
-
- /**
- * Sleep the current thread
- *
- * @param ms Number of milliseconds to sleep
- */
- static inline void sleep(unsigned long ms) { usleep(ms * 1000); }
-
- inline operator bool() const throw() { return (_started); }
-
-private:
- pthread_t _tid;
- volatile bool _started;
-};
-
-} // namespace ZeroTier
-
-#endif // __WINDOWS__ / !__WINDOWS__
-
-#endif
|
