Last modified by Frank Fock on 2024/05/25 10:09

Show last authors
1 By default AGENT++ is a multi-threaded agent. Therefore access to each MibEntry in the a Mib has to be synchronized.
2
3 In order to reduce blocking of concurrent requests, AGENT++ uses a two level lockin:
4
5 1. Mib instance level - locks the whole MIB
6 1. MibEntry level - locks a scalar, sub-tree, or table
7
8 As tables and complex (sub-tree) entries may contain also MibEntry objects, for example scalars, additional levels can be implemented by the user.
9
10 In any case, the locking procedure boundary must be implemented according to the following schema:
11
12 {{code}}
13 Mib* mib;
14 ...
15
16 mib->lock_mib();
17
18 // code to lookup a MibEntry (replace "my context" with "" or your context and the OID by the table entry OID, for example):
19 MibTable* table = (MibTable*) mib->get("my context", "1.3.6.1.4.1.????.1");
20
21 // enter protected region:
22 table->start_synch();
23
24 // now you can drop the Mib lock
25 mib->unlock_mib();
26
27 // do the real work on table
28 ...
29
30 table->end_synch();
31 {{/code}}
32
33 If you need to add/remove objects from the Mib, the locking schema looks sligtly different:
34
35 {{code}}
36 Mib* mib;
37 ...
38
39 mib->lock_mib();
40
41 // code to lookup a MibEntry:
42 MibTable table = ...;
43
44 // enter protected region:
45 table->start_synch();
46
47 // remove table from Mib:
48 MibContext* ctx = mib->get_context(DEFAULT_CONTEXT);
49 ctx->remove(*table->key());
50 table->end_synch();
51 delete table;
52 // now you can drop the Mib lock
53 mib->unlock_mib();
54 {{/code}}