comparison mac/dw.m @ 728:55f22b39ab57

Changes to correctly set the main thread and lock the run mutex when not running a loop and when called from a callback.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 14 Mar 2011 22:25:01 +0000
parents f190b5c2ce16
children 6712e4211522
comparison
equal deleted inserted replaced
727:f190b5c2ce16 728:55f22b39ab57
1935 if(DWThread == (DWTID)-1 || DWThread == curr) 1935 if(DWThread == (DWTID)-1 || DWThread == curr)
1936 { 1936 {
1937 DWTID orig = DWThread; 1937 DWTID orig = DWThread;
1938 NSDate *until = [NSDate dateWithTimeIntervalSinceNow:(milliseconds/1000.0)]; 1938 NSDate *until = [NSDate dateWithTimeIntervalSinceNow:(milliseconds/1000.0)];
1939 1939
1940 dw_mutex_lock(DWRunMutex);
1941 if(orig == (DWTID)-1) 1940 if(orig == (DWTID)-1)
1942 { 1941 {
1942 dw_mutex_lock(DWRunMutex);
1943 DWThread = curr; 1943 DWThread = curr;
1944 } 1944 }
1945 /* Process any pending events */ 1945 /* Process any pending events */
1946 while(_dw_main_iteration(until)) 1946 while(_dw_main_iteration(until))
1947 { 1947 {
1948 /* Just loop */ 1948 /* Just loop */
1949 } 1949 }
1950 if(orig == (DWTID)-1) 1950 if(orig == (DWTID)-1)
1951 { 1951 {
1952 DWThread = orig; 1952 DWThread = orig;
1953 dw_mutex_unlock(DWRunMutex);
1953 } 1954 }
1954 dw_mutex_unlock(DWRunMutex);
1955 } 1955 }
1956 else 1956 else
1957 { 1957 {
1958 usleep(milliseconds * 1000); 1958 usleep(milliseconds * 1000);
1959 } 1959 }
1978 /* 1978 /*
1979 * Processes a single message iteration and returns. 1979 * Processes a single message iteration and returns.
1980 */ 1980 */
1981 void API dw_main_iteration(void) 1981 void API dw_main_iteration(void)
1982 { 1982 {
1983 dw_mutex_lock(DWRunMutex); 1983 DWTID curr = pthread_self();
1984 _dw_main_iteration([NSDate distantPast]); 1984
1985 dw_mutex_unlock(DWRunMutex); 1985 if(DWThread == (DWTID)-1)
1986 {
1987 dw_mutex_lock(DWRunMutex);
1988 DWThread = curr;
1989 _dw_main_iteration([NSDate distantPast]);
1990 DWThread = (DWTID)-1;
1991 dw_mutex_unlock(DWRunMutex);
1992 }
1993 else if(DWThread == curr)
1994 {
1995 _dw_main_iteration([NSDate distantPast]);
1996 }
1986 } 1997 }
1987 1998
1988 /* 1999 /*
1989 * Cleanly terminates a DW session, should be signal handler safe. 2000 * Cleanly terminates a DW session, should be signal handler safe.
1990 * Parameters: 2001 * Parameters: