00001 #ifndef DMQ_WORKER_H
00002 #define DMQ_WORKER_H
00003
00004 #include "peer.h"
00005 #include "../../locking.h"
00006 #include "../../atomic_ops.h"
00007 #include "../../parser/msg_parser.h"
00008
00009 typedef struct dmq_job {
00010 peer_callback_t f;
00011 struct sip_msg* msg;
00012 dmq_peer_t* orig_peer;
00013 struct dmq_job* next;
00014 struct dmq_job* prev;
00015 } dmq_job_t;
00016
00017 typedef struct job_queue {
00018 atomic_t count;
00019 struct dmq_job* back;
00020 struct dmq_job* front;
00021 gen_lock_t lock;
00022 } job_queue_t;
00023
00024 struct dmq_worker {
00025 job_queue_t* queue;
00026 int jobs_processed;
00027 gen_lock_t lock;
00028 int pid;
00029 };
00030
00031 typedef struct dmq_worker dmq_worker_t;
00032
00033 void init_worker(dmq_worker_t* worker);
00034 int add_dmq_job(struct sip_msg*, dmq_peer_t*);
00035 void worker_loop(int id);
00036
00037 job_queue_t* alloc_job_queue();
00038 void destroy_job_queue(job_queue_t* queue);
00039 void job_queue_push(job_queue_t* queue, dmq_job_t* job);
00040 dmq_job_t* job_queue_pop(job_queue_t* queue);
00041 int job_queue_size(job_queue_t* queue);
00042
00043 #endif
00044