OpenSDN source code
ifmap_update_sender.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __ctrlplane__ifmap_update_sender__
6 #define __ctrlplane__ifmap_update_sender__
7 
8 #include <mutex>
9 
10 #include "base/bitset.h"
11 #include "ifmap/ifmap_encoder.h"
12 
13 struct IFMapMarker;
14 class IFMapUpdate;
15 class IFMapServer;
16 class IFMapState;
17 class IFMapUpdate;
18 class IFMapUpdateQueue;
19 
21 public:
23  virtual ~IFMapUpdateSender();
24 
25  // events
26 
27  // Event posted when the update queue has elements to transmit.
28  virtual void QueueActive();
29 
30  // Event posted when a particular client is ready to send updates
31  // (after previously blocking).
32  virtual void SendActive(int index);
33 
34  void CleanupClient(int index);
35 
36  void SetServer(IFMapServer *srv) { server_ = srv; }
37 
40  }
41 
42  bool IsClientBlocked(int client_index) {
43  return send_blocked_.test(client_index);
44  }
45 
46 private:
47  class SendTask;
48  friend class IFMapUpdateSenderTest;
49 
50  void StartTask();
51 
52  void Send(IFMapMarker *imarker);
53 
54  void SendUpdate(BitSet send_set, BitSet *blocked_set);
55 
56  IFMapMarker* ProcessMarker(IFMapMarker *marker, IFMapMarker *next_marker,
57  bool *done);
58  void ProcessUpdate(IFMapUpdate *update, const BitSet &base_send_set);
59 
60  void GetSendScheduled(BitSet *current);
62  const BitSet &base_send_set);
63 
67 
68  std::mutex mutex_; // protect scheduling of send task
71  BitSet send_scheduled_; // client-set for which send active was called
72  BitSet send_blocked_; // client-set for clients that are blocked
73 
74  void SetSendBlocked(int client_index) {
75  send_blocked_.set(client_index);
76  }
77 };
78 
79 #endif /* defined(__ctrlplane__ifmap_update_sender__) */
Definition: bitset.h:17
BitSet & set(size_t pos)
Definition: bitset.cc:125
bool test(size_t pos) const
Definition: bitset.cc:146
void SetObjectsPerMessage(int num)
void SetSendBlocked(int client_index)
IFMapMarker * ProcessMarker(IFMapMarker *marker, IFMapMarker *next_marker, bool *done)
virtual void QueueActive()
IFMapUpdateSender(IFMapServer *server, IFMapUpdateQueue *queue)
virtual void SendActive(int index)
void SetServer(IFMapServer *srv)
void SetObjectsPerMessage(int num)
void GetSendScheduled(BitSet *current)
void SendUpdate(BitSet send_set, BitSet *blocked_set)
void Send(IFMapMarker *imarker)
void LogAndCountSentUpdate(IFMapUpdate *update, const BitSet &base_send_set)
IFMapMessage * message_
friend class IFMapUpdateSenderTest
bool IsClientBlocked(int client_index)
void ProcessUpdate(IFMapUpdate *update, const BitSet &base_send_set)
IFMapUpdateQueue * queue_
void CleanupClient(int index)