~ubuntu-branches/ubuntu/utopic/mpd/utopic-proposed

« back to all changes in this revision

Viewing changes to src/thread/Thread.cxx

  • Committer: Package Import Robot
  • Author(s): Steve Kowalik
  • Date: 2013-11-12 18:17:40 UTC
  • mfrom: (2.2.36 sid)
  • Revision ID: package-import@ubuntu.com-20131112181740-72aa4zihehoobedp
Tags: 0.18.3-1ubuntu1
* Merge from Debian unstable.  Remaining changes:
  - Add libmp3lame-dev to Build-Depends, and enable LAME.
  - Read the user for the daemon from the config file in the init script.
  - Move avahi-daemon from Suggests to Recommends.
  - Added apport hook to include user configuration file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2003-2013 The Music Player Daemon Project
 
3
 * http://www.musicpd.org
 
4
 *
 
5
 * This program is free software; you can redistribute it and/or modify
 
6
 * it under the terms of the GNU General Public License as published by
 
7
 * the Free Software Foundation; either version 2 of the License, or
 
8
 * (at your option) any later version.
 
9
 *
 
10
 * This program is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 * GNU General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU General Public License along
 
16
 * with this program; if not, write to the Free Software Foundation, Inc.,
 
17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
18
 */
 
19
 
 
20
#include "config.h"
 
21
#include "Thread.hxx"
 
22
#include "util/Error.hxx"
 
23
 
 
24
bool
 
25
Thread::Start(void (*_f)(void *ctx), void *_ctx, Error &error)
 
26
{
 
27
        assert(!IsDefined());
 
28
 
 
29
        f = _f;
 
30
        ctx = _ctx;
 
31
 
 
32
#ifdef WIN32
 
33
        handle = ::CreateThread(nullptr, 0, ThreadProc, this, 0, &id);
 
34
        if (handle == nullptr) {
 
35
                error.SetLastError("Failed to create thread");
 
36
                return false;
 
37
        }
 
38
#else
 
39
#ifndef NDEBUG
 
40
        creating = true;
 
41
#endif
 
42
 
 
43
        int e = pthread_create(&handle, nullptr, ThreadProc, this);
 
44
 
 
45
        if (e != 0) {
 
46
#ifndef NDEBUG
 
47
                creating = false;
 
48
#endif
 
49
                error.SetErrno(e, "Failed to create thread");
 
50
                return false;
 
51
        }
 
52
 
 
53
        defined = true;
 
54
#ifndef NDEBUG
 
55
        creating = false;
 
56
#endif
 
57
#endif
 
58
 
 
59
        return true;
 
60
}
 
61
 
 
62
void
 
63
Thread::Join()
 
64
{
 
65
        assert(IsDefined());
 
66
        assert(!IsInside());
 
67
 
 
68
#ifdef WIN32
 
69
        ::WaitForSingleObject(handle, INFINITE);
 
70
        ::CloseHandle(handle);
 
71
        handle = nullptr;
 
72
#else
 
73
        pthread_join(handle, nullptr);
 
74
        defined = false;
 
75
#endif
 
76
}
 
77
 
 
78
#ifdef WIN32
 
79
 
 
80
DWORD WINAPI
 
81
Thread::ThreadProc(LPVOID ctx)
 
82
{
 
83
        Thread &thread = *(Thread *)ctx;
 
84
 
 
85
        thread.f(thread.ctx);
 
86
        return 0;
 
87
}
 
88
 
 
89
#else
 
90
 
 
91
void *
 
92
Thread::ThreadProc(void *ctx)
 
93
{
 
94
        Thread &thread = *(Thread *)ctx;
 
95
 
 
96
#ifndef NDEBUG
 
97
        /* this works around a race condition that causes an assertion
 
98
           failure due to IsInside() spuriously returning false right
 
99
           after the thread has been created, and the calling thread
 
100
           hasn't initialised "defined" yet */
 
101
        thread.defined = true;
 
102
#endif
 
103
 
 
104
        thread.f(thread.ctx);
 
105
        return nullptr;
 
106
}
 
107
 
 
108
#endif