~ubuntu-branches/ubuntu/karmic/gears/karmic

« back to all changes in this revision

Viewing changes to gears/base/common/thread_posix.cc

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Lesicnik
  • Date: 2009-04-30 19:15:25 UTC
  • Revision ID: james.westby@ubuntu.com-20090430191525-0790sb5wzg8ou0xb
Tags: upstream-0.5.21.0~svn3334+dfsg
ImportĀ upstreamĀ versionĀ 0.5.21.0~svn3334+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2008, Google Inc.
 
2
//
 
3
// Redistribution and use in source and binary forms, with or without
 
4
// modification, are permitted provided that the following conditions are met:
 
5
//
 
6
//  1. Redistributions of source code must retain the above copyright notice,
 
7
//     this list of conditions and the following disclaimer.
 
8
//  2. Redistributions in binary form must reproduce the above copyright notice,
 
9
//     this list of conditions and the following disclaimer in the documentation
 
10
//     and/or other materials provided with the distribution.
 
11
//  3. Neither the name of Google Inc. nor the names of its contributors may be
 
12
//     used to endorse or promote products derived from this software without
 
13
//     specific prior written permission.
 
14
//
 
15
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 
16
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 
17
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 
18
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
19
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 
20
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 
21
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 
22
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 
23
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 
24
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
25
 
 
26
// POSIX systems.
 
27
#if defined(LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)
 
28
 
 
29
#include <assert.h>
 
30
#include <pthread.h>
 
31
#include "gears/base/common/thread_posix.h"
 
32
#include "gears/base/common/thread.h"
 
33
#if defined(OS_ANDROID)
 
34
#include "gears/base/android/java_jni.h"
 
35
#endif
 
36
 
 
37
Thread::ThreadInternal::ThreadInternal()
 
38
    : handle_(0) {
 
39
}
 
40
 
 
41
Thread::ThreadInternal::~ThreadInternal() {
 
42
  // The thread should have either terminated before destruction, or
 
43
  // never have been started.
 
44
  assert(handle_ == 0);
 
45
}
 
46
 
 
47
bool Thread::ThreadInternal::Start(Thread *thread) {
 
48
  assert(handle_ == 0);
 
49
  // Start the child thread. The child will call ThreadRun with a
 
50
  // pointer to the Thread instance.
 
51
  if (pthread_create(&handle_, NULL, &ThreadRun, thread) == 0) {
 
52
    return true;
 
53
  } else {
 
54
    LOG(("Failed to start thread\n"));
 
55
    handle_ = 0;
 
56
    return false;
 
57
  }
 
58
}
 
59
 
 
60
void Thread::ThreadInternal::Join() {
 
61
  if (handle_ == 0) {
 
62
    return;
 
63
  }
 
64
  // This will block until thread termination.
 
65
  if (pthread_join(handle_, NULL) != 0) {
 
66
    LOG(("Failed to join child thread\n"));
 
67
    assert(false);
 
68
  }
 
69
  handle_ = 0;
 
70
}
 
71
 
 
72
void *Thread::ThreadInternal::ThreadRun(void *data) {
 
73
#ifdef OS_ANDROID
 
74
  // Android requires threads to register themselves with the VM, in
 
75
  // case the therad ends up calling some managed code.
 
76
  JniAttachCurrentThread();
 
77
#endif
 
78
  // Call the parent Thread::ThreadMain()
 
79
  Thread *thread = reinterpret_cast<Thread *>(data);
 
80
  thread->ThreadMain();
 
81
#ifdef OS_ANDROID
 
82
  // Unregister from the Android VM.
 
83
  JniDetachCurrentThread();
 
84
#endif
 
85
  return NULL;
 
86
}
 
87
 
 
88
#endif // defined(LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID)