blob: dc3c7486025b56a71cde1eca9feec3bdc22ef9d9 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Mark Slee9f0c6512007-02-28 23:58:26 +000019
Mark Sleef5f2be42006-09-05 21:05:31 +000020#ifndef _THRIFT_CONCURRENCY_THREAD_H_
21#define _THRIFT_CONCURRENCY_THREAD_H_ 1
Marc Slemko66949872006-07-15 01:52:39 +000022
David Reiss7247b8c2009-04-02 23:05:40 +000023#include <stdint.h>
Marc Slemko6f038a72006-08-03 18:58:09 +000024#include <boost/shared_ptr.hpp>
25#include <boost/weak_ptr.hpp>
26
Roger Meier12d70532011-12-14 23:35:28 +000027#ifdef HAVE_CONFIG_H
28#include <config.h>
29#endif
30
Roger Meier3faaedf2011-10-02 10:51:45 +000031#ifdef USE_BOOST_THREAD
32#include <boost/thread.hpp>
33#endif
34
Roger Meier12d70532011-12-14 23:35:28 +000035#ifdef HAVE_PTHREAD_H
36#include <pthread.h>
37#endif
38
T Jake Lucianib5e62212009-01-31 22:36:20 +000039namespace apache { namespace thrift { namespace concurrency {
Marc Slemko66949872006-07-15 01:52:39 +000040
41class Thread;
42
Mark Sleef5f2be42006-09-05 21:05:31 +000043/**
Marc Slemko3a3b53b2007-05-22 23:59:54 +000044 * Minimal runnable class. More or less analogous to java.lang.Runnable.
Mark Sleef5f2be42006-09-05 21:05:31 +000045 *
Mark Sleef5f2be42006-09-05 21:05:31 +000046 * @version $Id:$
47 */
Marc Slemko66949872006-07-15 01:52:39 +000048class Runnable {
49
50 public:
Marc Slemko66949872006-07-15 01:52:39 +000051 virtual ~Runnable() {};
Marc Slemko66949872006-07-15 01:52:39 +000052 virtual void run() = 0;
Marc Slemkofe5ba12e2006-07-20 21:16:27 +000053
Mark Sleef5f2be42006-09-05 21:05:31 +000054 /**
55 * Gets the thread object that is hosting this runnable object - can return
Mark Slee5ea15f92007-03-05 22:55:59 +000056 * an empty boost::shared pointer if no references remain on thet thread object
Mark Sleef5f2be42006-09-05 21:05:31 +000057 */
Mark Slee5ea15f92007-03-05 22:55:59 +000058 virtual boost::shared_ptr<Thread> thread() { return thread_.lock(); }
Marc Slemkofe5ba12e2006-07-20 21:16:27 +000059
Mark Sleef5f2be42006-09-05 21:05:31 +000060 /**
61 * Sets the thread that is executing this object. This is only meant for
62 * use by concrete implementations of Thread.
63 */
Mark Slee5ea15f92007-03-05 22:55:59 +000064 virtual void thread(boost::shared_ptr<Thread> value) { thread_ = value; }
Marc Slemkofe5ba12e2006-07-20 21:16:27 +000065
Marc Slemko6f038a72006-08-03 18:58:09 +000066 private:
Mark Slee5ea15f92007-03-05 22:55:59 +000067 boost::weak_ptr<Thread> thread_;
Marc Slemko66949872006-07-15 01:52:39 +000068};
69
Mark Sleef5f2be42006-09-05 21:05:31 +000070/**
Marc Slemko3a3b53b2007-05-22 23:59:54 +000071 * Minimal thread class. Returned by thread factory bound to a Runnable object
Mark Sleef5f2be42006-09-05 21:05:31 +000072 * and ready to start execution. More or less analogous to java.lang.Thread
73 * (minus all the thread group, priority, mode and other baggage, since that
74 * is difficult to abstract across platforms and is left for platform-specific
75 * ThreadFactory implemtations to deal with
76 *
T Jake Lucianib5e62212009-01-31 22:36:20 +000077 * @see apache::thrift::concurrency::ThreadFactory)
Mark Sleef5f2be42006-09-05 21:05:31 +000078 */
Marc Slemko66949872006-07-15 01:52:39 +000079class Thread {
Marc Slemko3a3b53b2007-05-22 23:59:54 +000080
Marc Slemko66949872006-07-15 01:52:39 +000081 public:
Marc Slemko3a3b53b2007-05-22 23:59:54 +000082
Roger Meier3faaedf2011-10-02 10:51:45 +000083#ifdef USE_BOOST_THREAD
84 typedef boost::thread::id id_t;
Roger Meier12d70532011-12-14 23:35:28 +000085
86 static inline bool is_current(id_t t) { return t == boost::this_thread::get_id(); }
87 static inline id_t get_current() { return boost::this_thread::get_id(); }
Roger Meier3faaedf2011-10-02 10:51:45 +000088#else
Mark Slee9b82d272007-05-23 05:16:07 +000089 typedef uint64_t id_t;
Roger Meier12d70532011-12-14 23:35:28 +000090 static inline bool is_current(pthread_t t) { return pthread_equal(pthread_self(), t); }
Jake Farrelld77d1802012-01-17 14:28:05 +000091 static inline id_t get_current() { return (Thread::id_t)pthread_self(); }
Roger Meier3faaedf2011-10-02 10:51:45 +000092#endif
Marc Slemko3a3b53b2007-05-22 23:59:54 +000093
Marc Slemko66949872006-07-15 01:52:39 +000094 virtual ~Thread() {};
95
Mark Sleef5f2be42006-09-05 21:05:31 +000096 /**
97 * Starts the thread. Does platform specific thread creation and
98 * configuration then invokes the run method of the Runnable object bound
99 * to this thread.
100 */
Marc Slemko66949872006-07-15 01:52:39 +0000101 virtual void start() = 0;
102
Mark Sleef5f2be42006-09-05 21:05:31 +0000103 /**
104 * Join this thread. Current thread blocks until this target thread
105 * completes.
106 */
Marc Slemko66949872006-07-15 01:52:39 +0000107 virtual void join() = 0;
108
Mark Sleef5f2be42006-09-05 21:05:31 +0000109 /**
Marc Slemko3a3b53b2007-05-22 23:59:54 +0000110 * Gets the thread's platform-specific ID
111 */
Marc Slemkoa6479032007-06-05 22:20:14 +0000112 virtual id_t getId() = 0;
Marc Slemko3a3b53b2007-05-22 23:59:54 +0000113
114 /**
Mark Sleef5f2be42006-09-05 21:05:31 +0000115 * Gets the runnable object this thread is hosting
116 */
Mark Slee5ea15f92007-03-05 22:55:59 +0000117 virtual boost::shared_ptr<Runnable> runnable() const { return _runnable; }
Marc Slemkofe5ba12e2006-07-20 21:16:27 +0000118
119 protected:
Mark Slee5ea15f92007-03-05 22:55:59 +0000120 virtual void runnable(boost::shared_ptr<Runnable> value) { _runnable = value; }
Marc Slemkofe5ba12e2006-07-20 21:16:27 +0000121
122 private:
Mark Slee5ea15f92007-03-05 22:55:59 +0000123 boost::shared_ptr<Runnable> _runnable;
Marc Slemko3a3b53b2007-05-22 23:59:54 +0000124
Marc Slemko66949872006-07-15 01:52:39 +0000125};
126
Mark Sleef5f2be42006-09-05 21:05:31 +0000127/**
128 * Factory to create platform-specific thread object and bind them to Runnable
129 * object for execution
130 */
Marc Slemko66949872006-07-15 01:52:39 +0000131class ThreadFactory {
132
133 public:
Marc Slemko66949872006-07-15 01:52:39 +0000134 virtual ~ThreadFactory() {}
Mark Slee5ea15f92007-03-05 22:55:59 +0000135 virtual boost::shared_ptr<Thread> newThread(boost::shared_ptr<Runnable> runnable) const = 0;
Marc Slemko3a3b53b2007-05-22 23:59:54 +0000136
137 /** Gets the current thread id or unknown_thread_id if the current thread is not a thrift thread */
138
139 static const Thread::id_t unknown_thread_id;
140
Marc Slemkoa6479032007-06-05 22:20:14 +0000141 virtual Thread::id_t getCurrentThreadId() const = 0;
Marc Slemko66949872006-07-15 01:52:39 +0000142};
143
T Jake Lucianib5e62212009-01-31 22:36:20 +0000144}}} // apache::thrift::concurrency
Marc Slemko66949872006-07-15 01:52:39 +0000145
Mark Sleef5f2be42006-09-05 21:05:31 +0000146#endif // #ifndef _THRIFT_CONCURRENCY_THREAD_H_