| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // Author: morlovich@google.com (Maksim Orlovich) |
| // |
| // This contains the class ThreadSystem::Thread which should be subclassed |
| // by things that wish to run in a thread. |
| |
| #ifndef PAGESPEED_KERNEL_BASE_THREAD_H_ |
| #define PAGESPEED_KERNEL_BASE_THREAD_H_ |
| |
| #include "pagespeed/kernel/base/basictypes.h" |
| #include "pagespeed/kernel/base/scoped_ptr.h" |
| #include "pagespeed/kernel/base/string.h" |
| #include "pagespeed/kernel/base/string_util.h" |
| #include "pagespeed/kernel/base/thread_system.h" |
| |
| namespace net_instaweb { |
| |
| // Base class for client thread code. |
| class ThreadSystem::Thread { |
| public: |
| // Initializes the thread object for given runtime, but does not start it. |
| // (You need to call Start() for that) |
| // |
| // If you pass in kJoinable for flags, you must explicitly call Join() to |
| // wait for thread to complete and release associated resources. That is not |
| // needed with kDetach, but you are still responsible for cleaning up |
| // the Thread object. |
| // |
| // Any mutexes and condvars you use must be compatible with the passed in |
| // 'runtime'. |
| // |
| // The 'name' will be used purely for debugging purposes. Note that on |
| // many systems (e.g. Linux PThreads) the OS will only keep track of |
| // 15 characters, so you may not want to get too wordy. |
| Thread(ThreadSystem* runtime, StringPiece name, ThreadFlags flags); |
| |
| // Note: it is safe to delete the Thread object from within ::Run |
| // as far as this baseclass is concerned. |
| virtual ~Thread(); |
| |
| // Invokes Run() in a separate thread. Returns if successful or not. |
| bool Start(); |
| |
| // Waits for the thread executing Run() to exit. This must be called on |
| // every thread created with kJoinable. |
| void Join(); |
| |
| GoogleString name() const { return name_; } |
| |
| virtual void Run() = 0; |
| |
| private: |
| // There are 2 types involved in the implementation of threading here. |
| // One is this class, Thread, which user code subclasses |
| // |
| // The other code is ThreadImpl which is subclassed by the actual |
| // implementation of threading and which does the actual threading work. |
| scoped_ptr<ThreadImpl> impl_; |
| |
| GoogleString name_; |
| |
| ThreadFlags flags_; |
| bool started_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Thread); |
| }; |
| |
| } // namespace net_instaweb |
| |
| #endif // PAGESPEED_KERNEL_BASE_THREAD_H_ |