00001 #ifndef COMMONS_THREADS_H
00002 #define COMMONS_THREADS_H
00003
00004 #include <pthread.h>
00005 #include <sched.h>
00006 #include <sys/syscall.h>
00007 #include <sys/types.h>
00008 #include <unistd.h>
00009
00010 #include <boost/function.hpp>
00011
00012 #include <commons/check.h>
00013 #include <commons/delegates.h>
00014 #include <commons/nullptr.h>
00015
00016 namespace commons
00017 {
00018
00019 using namespace boost;
00020
00024 #undef __CPUMASK
00025 #define __CPUMASK(cpu) (static_cast<__cpu_mask>(1) << ((cpu) % __NCPUBITS))
00026
00031 inline pid_t
00032 gettid()
00033 {
00034 return static_cast<pid_t>(syscall(SYS_gettid));
00035 }
00036
00040 void
00041 pin_thread(int cpu)
00042 {
00043 pid_t pid = gettid();
00044 cpu_set_t cs;
00045 CPU_ZERO(&cs);
00046 CPU_SET(cpu, &cs);
00047 sched_setaffinity(pid, sizeof(cs), &cs);
00048 }
00049
00053 inline void
00054 waitall(pthread_t* ts, int n)
00055 {
00056 for (int i = 0; i < n; i++) {
00057 check(pthread_join(ts[i], nullptr) == 0);
00058 }
00059 }
00060
00066 pthread_t
00067 spawn(const boost::function<void()>& f)
00068 {
00069 pthread_t t;
00070 return pthread_create(&t, NULL, &run_function0_null,
00071 new boost::function<void()>(f)) == 0 ? t : 0;
00072 }
00073
00074 }
00075
00076 #endif