Changeset 325
- Timestamp:
- 07/07/10 17:13:26 (2 years ago)
- Files:
-
- trunk/import/object.di (modified) (1 diff)
- trunk/src/object_.d (modified) (4 diffs)
- trunk/src/rt/monitor.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/import/object.di
r295 r325 42 42 bool opEquals(Object lhs, Object rhs); 43 43 //bool opEquals(TypeInfo lhs, TypeInfo rhs); 44 45 void setSameMutex(shared Object ownee, shared Object owner); 44 46 45 47 struct Interface trunk/src/object_.d
r297 r325 1934 1934 /* internal */ 1935 1935 DEvent[] devt; 1936 size_t refs; 1936 1937 /* stuff */ 1937 1938 } … … 1939 1940 Monitor* getMonitor(Object h) 1940 1941 { 1941 return cast(Monitor*) (cast(void**) h)[1];1942 return cast(Monitor*) h.__monitor; 1942 1943 } 1943 1944 1944 1945 void setMonitor(Object h, Monitor* m) 1945 1946 { 1946 (cast(void**) h)[1] = m; 1947 h.__monitor = m; 1948 } 1949 1950 void setSameMutex(shared Object ownee, shared Object owner) 1951 in 1952 { 1953 assert(ownee.__monitor is null); 1954 } 1955 body 1956 { 1957 auto m = cast(shared(Monitor)*) owner.__monitor; 1958 1959 if (m is null) 1960 { 1961 _d_monitor_create(cast(Object) owner); 1962 m = cast(shared(Monitor)*) owner.__monitor; 1963 } 1964 1965 auto i = m.impl; 1966 if (i is null) 1967 { 1968 _d_monitor_lock(cast(Object) owner); 1969 m.refs++; 1970 _d_monitor_unlock(cast(Object) owner); 1971 ownee.__monitor = owner.__monitor; 1972 return; 1973 } 1974 // If m.impl is set (ie. if this is a user-created monitor), assume 1975 // the monitor is garbage collected and simply copy the reference. 1976 ownee.__monitor = owner.__monitor; 1947 1977 } 1948 1978 … … 1954 1984 extern (C) void _d_monitordelete(Object h, bool det) 1955 1985 { 1986 // det is true when the object is being destroyed deterministically (ie. 1987 // when it is explicitly deleted or is a scope object whose time is up). 1956 1988 Monitor* m = getMonitor(h); 1957 1989 … … 1961 1993 if (i is null) 1962 1994 { 1963 _d_monitor_devt(m, h); 1964 _d_monitor_destroy(h); 1965 setMonitor(h, null); 1995 _d_monitor_lock(h); 1996 auto refs = --m.refs; 1997 _d_monitor_unlock(h); 1998 if (!refs) 1999 { 2000 _d_monitor_devt(m, h); 2001 _d_monitor_destroy(h); 2002 setMonitor(h, null); 2003 } 1966 2004 return; 1967 2005 } 2006 // NOTE: Since a monitor can be shared via setSameMutex it isn't safe 2007 // to explicitly delete user-created monitors--there's no 2008 // refcount and it may have multiple owners. 2009 /+ 1968 2010 if (det && (cast(void*) i) !is (cast(void*) h)) 1969 2011 delete i; 2012 +/ 1970 2013 setMonitor(h, null); 1971 2014 } trunk/src/rt/monitor.c
r323 r325 34 34 typedef struct Monitor 35 35 { 36 void* impl; // for user-level monitors 37 Array devt; // for internal monitors 36 void* impl; // for user-level monitors 37 Array devt; // for internal monitors 38 size_t refs; // reference count 38 39 39 40 #if _WIN32 … … 91 92 InitializeCriticalSection(&cs->mon); 92 93 h->monitor = (void *)cs; 94 cs->refs = 1; 93 95 cs = NULL; 94 96 } … … 179 181 pthread_mutex_init(&cs->mon, & _monitors_attr); 180 182 h->monitor = (void *)cs; 183 cs->refs = 1; 181 184 cs = NULL; 182 185 }
