So... Alot of changes...
[potpourri.git] / src / Thread.cpp
blobd52e27a6d8a94e3ec19a5e24e8a010b5f37c8cbd
1 // Copyright 2008 Brian Caine
3 // This file is part of Potpourri.
5 // Potpourri 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 3 of the License, or
8 // (at your option) any later version.
10 // Potpourri is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTIBILITY of FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with Potpourri. If not, see <http://www.gnu.org/licenses/>.
19 // NOTES:
21 // This is the sauce for the Thread class
23 #include <iostream>
25 #include "Thread.h"
27 using namespace fragrant;
29 Thread* Thread::makeThread(ThreadFunc function,
30 std::vector<fragrant::Variant*> params)
32 Thread* thread = new Thread(function, params);
34 if (!was_made)
36 delete thread;
37 thread = 0;
38 std::cerr << "Thread::makeThread(): Error making thread" << std::endl;
40 else
41 thread->run();
43 return thread;
46 Thread::~Thread()
48 if (!errnum)
50 pthread_join(threadnum, 0);
54 Thread::Thread(ThreadFunc function, std::vector<fragrant::Variant*> params)
56 // no reason to refuse
57 was_made = static_cast<bool>(function);
59 func = function;
60 func_params = params;
62 threadnum = 0;
63 errnum = 0;
66 void Thread::run()
68 errnum = pthread_create(&threadnum, 0, Thread::run,
69 static_cast<void*>(this));
70 if (errnum)
72 threadnum = 0;
73 std::cerr << "Thread::run(): Error starting thread" << std::endl;
76 return;
79 void* Thread::run(void* thread)
81 Thread* the_thread = static_cast<Thread*>(thread);
83 ThreadFunc func = the_thread->func;
84 std::vector<fragrant::Variant*> params = the_thread->func_params;
86 func(params);
88 pthread_exit(0);
91 bool Thread::was_made = false;