summaryrefslogtreecommitdiff
path: root/libcult/cult/sched/thread.hxx
blob: 49d62259b992512f2bc79c730149ce4181293a28 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// file      : cult/sched/thread.hxx
// author    : Boris Kolpackov <boris@kolpackov.net>
// copyright : Copyright (c) 2005-2010 Boris Kolpackov
// license   : GNU GPL v2 + exceptions; see accompanying LICENSE file

#ifndef CULT_SCHED_THREAD_HXX
#define CULT_SCHED_THREAD_HXX

#include <cult/types/fundamental.hxx>
#include <cult/types/shptr.hxx>

#include <cult/sched/mutex.hxx>
#include <cult/sched/exception.hxx>

#include <cult/mm/new.hxx>

#include <pthread.h>

namespace Cult
{
  namespace Sched
  {
    // Instantiating an automatic variable of type Thread results
    // in undefined behavior (read core dump).
    //
    class Thread: public MM::ServiceAwareObject
    {
    public:
      struct Exception: virtual Sched::Exception {};

    public:
      virtual
      ~Thread ();

      Thread (Void* (*StartRoutine) (Void*), Void* arg = 0);

      // Adopt an existing thread. Adoption of a detached thread
      // results in undefined behavior. Adoption of an already
      // adopted thread results in Adopted exception.
      //

      struct Adopted: virtual Exception {};

      Thread ();

    public:
      // Joining an already joined thread results in Joined exception.
      //

      struct Joined: virtual Exception {};

      //@@ Need to work out the cancelled case.
      //
      Void*
      join ();

      Void
      cancel ();

    public:
      static Void
      exit (Void* ret);

      // self() may not be called in TSD destructors. Call to self() from
      // a foreign thread (i.e., one that is neither native nor adopted)
      // results in Foreign exception.
      //

      struct Foreign: virtual Exception {};

      static Shptr<Thread>
      self  ();

      static Void
      test_cancel ();

    private:
      pthread_t id_;

      Boolean detached_;
      Mutex mutex_;
    };
  }
}

#endif  // CULT_SCHED_THREAD_HXX