Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / programs / nsgmls / DescriptorManager.C
1 /* $XConsortium: DescriptorManager.C /main/1 1996/07/29 16:48:58 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
4
5 #include "splib.h"
6 #include "DescriptorManager.h"
7 #include "ListIter.h"
8
9 #ifdef SP_NAMESPACE
10 namespace SP_NAMESPACE {
11 #endif
12
13 DescriptorUser::DescriptorUser(DescriptorManager *manager)
14 : manager_(manager)
15 {
16   if (manager_)
17     manager_->addUser(this);
18 }
19
20 DescriptorUser::~DescriptorUser()
21 {
22   if (manager_)
23     manager_->removeUser(this);
24 }
25
26 void DescriptorUser::managerDeleted()
27 {
28   manager_ = 0;
29 }
30
31 Boolean DescriptorUser::suspend()
32 {
33   return 0;
34 }
35
36 void DescriptorUser::acquireD()
37 {
38   if (manager_)
39     manager_->acquireD();
40 }
41
42 void DescriptorUser::releaseD()
43 {
44   if (manager_)
45     manager_->releaseD();
46 }
47
48 DescriptorManager::DescriptorManager(int maxD)
49 : maxD_(maxD), usedD_(0)
50 {
51 }
52
53 DescriptorManager::~DescriptorManager()
54 {
55   for (ListIter<DescriptorUser *> iter(users_);
56        !iter.done();
57        iter.next())
58     iter.cur()->managerDeleted();
59 }
60
61 void DescriptorManager::addUser(DescriptorUser *p)
62 {
63   users_.insert(p);
64 }
65
66 void DescriptorManager::removeUser(DescriptorUser *p)
67 {
68   users_.remove(p);
69 }
70
71 void DescriptorManager::acquireD()
72 {
73   if (usedD_ >= maxD_) {
74     for (ListIter<DescriptorUser *> iter(users_);
75          !iter.done();
76          iter.next()) {
77       if (iter.cur()->suspend())
78         break;
79     }
80   }
81   usedD_++;
82 }
83
84 void DescriptorManager::releaseD()
85 {
86   usedD_--;
87 }
88
89 #ifdef SP_NAMESPACE
90 }
91 #endif