Changeset 781
- Timestamp:
- 07/03/08 19:22:30 (3 months ago)
- Files:
-
- trunk/phobos/internal/monitor.d (modified) (3 diffs)
- trunk/phobos/internal/object.d (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/phobos/internal/monitor.d
r780 r781 12 12 13 13 module internal.monitor; 14 import std.outofmemory; 14 15 15 16 extern (C) … … 19 20 void* memcpy(void *, in void *, size_t); 20 21 void* malloc(size_t); 22 void* calloc(size_t, size_t); 23 void* realloc(void*, size_t); 21 24 void free(void*); 22 25 } … … 94 97 } 95 98 96 /** Contains the object monitor and the array of delegates99 /** Contains the object's monitor and the array of delegates 97 100 that are used by signals and slots */ 98 101 struct FatLock 99 102 { 100 public void delegate(Object) [] delegates; 101 private OsMutex * mon; 102 void setup() { mon = conStruct!(OsMutex)(); } 103 void teardown() { deStruct(mon); } 103 private: 104 alias void delegate(Object) delegate_t; 105 delegate_t [] _delegates; 106 OsMutex * _mutex; 107 108 void setup() { _mutex = conStruct!(OsMutex)(); } 109 void teardown() { deStruct(_mutex); } 104 110 public: 105 void lock() { mon.lock; } 106 void unlock() { mon.unlock; } 111 void lock() { _mutex.lock; } 112 void unlock() { _mutex.unlock; } 113 bool HasDelegates() { return _delegates.length != 0; } 114 void SetDelegate(delegate_t dg) 115 { 116 foreach (inout x; _delegates) 117 { 118 if (!x || x == dg) 119 { x = dg; 120 return; 121 } 122 } 123 124 // Increase size of _delegates[] 125 auto len = _delegates.length; 126 auto startlen = len; 127 if (len == 0) 128 { 129 len = 4; 130 auto p = calloc(delegate_t.sizeof, len); 131 if (!p) 132 _d_OutOfMemory(); 133 _delegates = (cast(delegate_t*)p)[0 .. len]; 134 } 135 else 136 { 137 len += len + 4; 138 auto p = realloc(_delegates.ptr, delegate_t.sizeof * len); 139 if (!p) 140 _d_OutOfMemory(); 141 _delegates = (cast(delegate_t*)p)[0 .. len]; 142 _delegates[startlen .. len] = null; 143 } 144 _delegates[startlen] = dg; 145 } 146 147 void RemoveDelegate(delegate_t dg) 148 { 149 foreach (inout x; _delegates) 150 { 151 if (x == dg) 152 x = null; 153 } 154 } 155 156 void FinalizeDelegates(Object parent) 157 { 158 delegate_t[] dgs; 159 synchronized (parent) 160 { 161 dgs = _delegates; 162 _delegates = null; 163 } 164 165 foreach (dg; dgs) 166 { 167 if (dg) 168 { 169 //printf("calling dg = %llx (%p)\n", dg, parent); 170 dg(parent); 171 } 172 } 173 174 free(dgs.ptr); 175 } 107 176 } 108 177 trunk/phobos/internal/object.d
r779 r781 38 38 module object; 39 39 40 import std.outofmemory;41 40 import internal.monitor; 42 41 … … 66 65 int memcmp(in void *, in void *, size_t); 67 66 void* memcpy(void *, in void *, size_t); 68 void* calloc(size_t, size_t);69 void* realloc(void*, size_t);70 void free(void*);71 67 72 68 Object _d_newclass(ClassInfo ci); … … 151 147 FatLock * fatLock = GetFatLock(this); 152 148 assert(fatLock); 153 foreach (inout x; fatLock.delegates) 154 { 155 if (!x || x == dg) 156 { x = dg; 157 return; 158 } 159 } 160 161 // Increase size of delegates[] 162 auto len = fatLock.delegates.length; 163 auto startlen = len; 164 if (len == 0) 165 { 166 len = 4; 167 auto p = calloc((void delegate(Object)).sizeof, len); 168 if (!p) 169 _d_OutOfMemory(); 170 fatLock.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 171 } 172 else 173 { 174 len += len + 4; 175 auto p = realloc(fatLock.delegates.ptr, (void delegate(Object)).sizeof * len); 176 if (!p) 177 _d_OutOfMemory(); 178 fatLock.delegates = (cast(void delegate(Object)*)p)[0 .. len]; 179 fatLock.delegates[startlen .. len] = null; 180 } 181 fatLock.delegates[startlen] = dg; 149 fatLock.SetDelegate(dg); 182 150 } 183 151 } … … 194 162 FatLock * fatLock = GetFatLock(this); 195 163 assert(fatLock); 196 foreach (inout x; fatLock.delegates) 197 { 198 if (x == dg) 199 x = null; 200 } 164 fatLock.RemoveDelegate(dg); 201 165 } 202 166 } … … 225 189 FatLock * fatLock = GetFatLock(o); 226 190 assert(fatLock); 227 if (fatLock.delegates.length) 228 { 229 auto dgs = fatLock.delegates; 230 synchronized (o) 231 { 232 dgs = fatLock.delegates; 233 fatLock.delegates = null; 234 } 235 236 foreach (dg; dgs) 237 { 238 if (dg) 239 { 240 //printf("calling dg = %llx (%p)\n", dg, o); 241 dg(o); 242 } 243 } 244 245 free(dgs.ptr); 246 } 191 if (fatLock.HasDelegates) 192 fatLock.FinalizeDelegates(o); 247 193 } 248 194
