File: MDispatcher.h

package info (click to toggle)
mysql-gui-tools 5.0r12-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 105,540 kB
  • ctags: 50,897
  • sloc: sql: 348,439; pascal: 285,780; cpp: 94,578; ansic: 90,768; objc: 33,761; sh: 25,629; xml: 10,924; yacc: 10,755; java: 9,986; php: 2,806; python: 2,068; makefile: 1,945; perl: 3
file content (107 lines) | stat: -rw-r--r-- 2,810 bytes parent folder | download | duplicates (4)
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
99
100
101
102
103
104
105
106
107
/* Copyright (C) 2003, 2004 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


#ifndef _MDISPATCHER_H_
#define _MDISPATCHER_H_

#include <glibmm.h>
#include <map>
#include <pthread.h>

class MDispatcher : public Glib::ObjectBase {
  public:
    typedef sigc::signal1<void,bool> WorkStartStopSignal;
    
  private:
    struct Fetcher {
      MDispatcher *disp;

      pthread_t tid;

      bool cancelled;

      void *(*function)(void*);
      void *user_data;
      
      Glib::Dispatcher *sig_dispatcher;
    };
    struct AsyncFetcher {
      MDispatcher *disp;

      pthread_t tid;

      bool cancelled;
      bool data_ready;
      
      long delay;

      void *data;
      
      bool fetch_locked;
      
      void *(*function)(void*);
      void *user_data;
      void (*free_user_data)(void*);
      
      bool (*callback)(void *data,void *user_data);
      void *cb_user_data;
      
      Glib::Dispatcher *sig_dispatcher;
    };

    WorkStartStopSignal _work_signal;

    pthread_mutex_t _fetch_mutex;

    bool _done;

    bool _cancelled;

    bool _checking_instances;
    pthread_mutex_t _async_mutex;
    std::map<const char*,AsyncFetcher*> _async_fetchers;

    Fetcher *_fetcher;
    
    Glib::Dispatcher _sync_thread_signal;
    Glib::Dispatcher _async_thread_signal;
    
    static void *thread_func(Fetcher *self);
    static void *async_thread_func(AsyncFetcher *self);

    void sync_thread_finished();
    void async_thread_finished();    
    
  public:
    MDispatcher();

    void *dispatch(void *(*func)(void*), void *udata);
    void cancel();
    bool was_cancelled() { return _cancelled; };

    void dispatch_async(const char *name, 
                        void *(*func)(void*), void *udata, void(*free_data)(void*),
                        bool (*callback)(void*,void*), void *cbdata,
                        long repeat_delay);
    void cancel_async(const char *name);

    WorkStartStopSignal signal_work_start_stop() { return _work_signal; };
};

   

#endif /* _MDISPATCHER_H_ */