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 87 88 89 90 91 92 93 94 95 96 97 98
|
//=========================================================
// MusE
// Linux Music Editor
// $Id: thread.h,v 1.1.1.1 2003/10/29 10:05:13 wschweer Exp $
//
// (C) Copyright 2001 Werner Schweer (ws@seh.de)
//=========================================================
#ifndef __THREAD_H__
#define __THREAD_H__
#include <pthread.h>
#include <list>
//---------------------------------------------------------
// Poll
//---------------------------------------------------------
struct Poll {
int fd;
int action;
void (*handler)(void*,void*);
void* param1;
void* param2;
Poll(int _fd, int _action, void(*_handler)(void*,void*), void* p, void* q) {
fd = _fd;
action = _action;
handler = _handler;
param1 = p;
param2 = q;
}
};
typedef std::list<Poll> PollList;
typedef std::list<Poll>::iterator iPoll;
//---------------------------------------------------------
// ThreadMsg
//---------------------------------------------------------
struct ThreadMsg {
int id;
};
//---------------------------------------------------------
// Thread
//---------------------------------------------------------
class Thread {
const char* _name;
volatile bool _running;
int realTimePriority;
int _pollWait; // poll timeout in msec (-1 = infinite)
pthread_t thread;
int toThreadFdw; // message to thread (app write)
PollList plist;
pthread_mutex_t lock;
pthread_cond_t ready;
void* userPtr;
protected:
int fromThreadFdr; // message from thread (seq read)
int fromThreadFdw; // message from thread (app write)
int toThreadFdr; // message to thread (seq read)
struct pollfd* pfd; // poll file descriptors
int npfd;
int maxpfd;
virtual void processMsg(const ThreadMsg*) {}
virtual void processMsg1(const void *) {}
virtual void defaultTick() {}
public:
Thread(int prio, const char* name);
virtual ~Thread();
const char* name() const { return _name; }
virtual void start(void* ptr=0);
void stop(bool);
void clearPollFd() { plist.clear(); npfd = 0; }
void addPollFd(int fd, int action, void (*handler)(void*,void*), void*, void*);
void removePollFd(int fd, int action);
void loop();
void readMsg();
void readMsg1(int size);
bool sendMsg1(const void* m, int n);
bool sendMsg(const ThreadMsg* m);
bool isRunning() const { return _running; }
void setPollWait(int val) { _pollWait = val; }
virtual void threadStart(void*){ } // called from loop
virtual void threadStop() { } // called from loop before leaving
};
#endif
|