~ubuntu-branches/ubuntu/maverick/pdns/maverick-updates

« back to all changes in this revision

Viewing changes to pdns/selectmplexer.cc

  • Committer: Bazaar Package Importer
  • Author(s): Matthijs Mohlmann, Matthijs Mohlmann, Christoph Haas
  • Date: 2007-04-15 23:23:39 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20070415232339-5x3scc8gx04e50um
Tags: 2.9.21-1
[ Matthijs Mohlmann ]
* New upstream release. (Closes: #420294)
* Remove meta pdns package.
* Added new sqlite3 backend package.
* Months and minutes where mixed up. (Closes: #406462)
* Case sensitivity in bind backend caused PowerDNS to not serve a certain
  zone. (Closes: #406461)
* Bind backend forgot about zones on a notify. (Closes: #398213)

[ Christoph Haas ]
* Documented incorporated backend bind. (Closes: #415471)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "mplexer.hh"
 
2
#include "sstuff.hh"
 
3
#include <iostream>
 
4
#include "misc.hh"
 
5
#include <boost/lexical_cast.hpp>
 
6
#include "syncres.hh"
 
7
#include "utility.hh" 
 
8
 
 
9
 
 
10
using namespace boost;
 
11
using namespace std;
 
12
 
 
13
static FDMultiplexer* make()
 
14
{
 
15
  return new SelectFDMultiplexer();
 
16
}
 
17
 
 
18
static struct RegisterOurselves
 
19
{
 
20
  RegisterOurselves() {
 
21
    FDMultiplexer::getMultiplexerMap().insert(make_pair(1, &make));
 
22
  }
 
23
} doIt;
 
24
 
 
25
void SelectFDMultiplexer::addFD(callbackmap_t& cbmap, int fd, callbackfunc_t toDo, const boost::any& parameter)
 
26
{
 
27
  Callback cb;
 
28
  cb.d_callback=toDo;
 
29
  cb.d_parameter=parameter;
 
30
  memset(&cb.d_ttd, 0, sizeof(cb.d_ttd));
 
31
  if(cbmap.count(fd))
 
32
    throw FDMultiplexerException("Tried to add fd "+lexical_cast<string>(fd)+ " to multiplexer twice");
 
33
  cbmap[fd]=cb;
 
34
}
 
35
 
 
36
void SelectFDMultiplexer::removeFD(callbackmap_t& cbmap, int fd)
 
37
{
 
38
  if(d_inrun && d_iter->first==fd)  // trying to remove us!
 
39
    d_iter++;
 
40
 
 
41
  if(!cbmap.erase(fd))
 
42
    throw FDMultiplexerException("Tried to remove unlisted fd "+lexical_cast<string>(fd)+ " from multiplexer");
 
43
}
 
44
 
 
45
int SelectFDMultiplexer::run(struct timeval* now)
 
46
{
 
47
  if(d_inrun) {
 
48
    throw FDMultiplexerException("FDMultiplexer::run() is not reentrant!\n");
 
49
  }
 
50
  fd_set readfds, writefds;
 
51
  FD_ZERO(&readfds);
 
52
  FD_ZERO(&writefds);
 
53
  
 
54
  int fdmax=0;
 
55
 
 
56
  for(callbackmap_t::const_iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end(); ++i) {
 
57
    FD_SET(i->first, &readfds);
 
58
    fdmax=max(i->first, fdmax);
 
59
  }
 
60
 
 
61
  for(callbackmap_t::const_iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end(); ++i) {
 
62
    FD_SET(i->first, &writefds);
 
63
    fdmax=max(i->first, fdmax);
 
64
  }
 
65
  
 
66
  struct timeval tv={0,500000};
 
67
  int ret=select(fdmax + 1, &readfds, &writefds, 0, &tv);
 
68
  Utility::gettimeofday(now, 0);
 
69
  
 
70
  if(ret < 0 && errno!=EINTR)
 
71
    throw FDMultiplexerException("select returned error: "+stringerror());
 
72
 
 
73
  if(ret==0) // nothing
 
74
    return 0;
 
75
 
 
76
  d_iter=d_readCallbacks.end();
 
77
  d_inrun=true;
 
78
  
 
79
  for(callbackmap_t::iterator i=d_readCallbacks.begin(); i != d_readCallbacks.end() && i->first <= fdmax; ) {
 
80
    d_iter=i++;
 
81
 
 
82
    if(FD_ISSET(d_iter->first, &readfds)) {
 
83
      d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
 
84
    }
 
85
  }
 
86
 
 
87
  for(callbackmap_t::iterator i=d_writeCallbacks.begin(); i != d_writeCallbacks.end() && i->first <= fdmax; ) {
 
88
    d_iter=i++;
 
89
    if(FD_ISSET(d_iter->first, &writefds)) {
 
90
      d_iter->second.d_callback(d_iter->first, d_iter->second.d_parameter);
 
91
    }
 
92
  }
 
93
 
 
94
  d_inrun=false;
 
95
  return 0;
 
96
}
 
97
 
 
98
#if 0
 
99
 
 
100
void acceptData(int fd, boost::any& parameter)
 
101
{
 
102
  cout<<"Have data on fd "<<fd<<endl;
 
103
  Socket* sock=boost::any_cast<Socket*>(parameter);
 
104
  string packet;
 
105
  IPEndpoint rem;
 
106
  sock->recvFrom(packet, rem);
 
107
  cout<<"Received "<<packet.size()<<" bytes!\n";
 
108
}
 
109
 
 
110
 
 
111
int main()
 
112
{
 
113
  Socket s(InterNetwork, Datagram);
 
114
  
 
115
  IPEndpoint loc("0.0.0.0", 2000);
 
116
  s.bind(loc);
 
117
 
 
118
  SelectFDMultiplexer sfm;
 
119
 
 
120
  sfm.addReadFD(s.getHandle(), &acceptData, &s);
 
121
 
 
122
  for(int n=0; n < 100 ; ++n) {
 
123
    sfm.run();
 
124
  }
 
125
  sfm.removeReadFD(s.getHandle());
 
126
  sfm.removeReadFD(s.getHandle());
 
127
}
 
128
#endif
 
129