39 lines
		
	
	
		
			980 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			980 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* Prototypes for condition spinning helper functions (part of libsys). */
 | 
						|
#ifndef _MINIX_SPIN_H
 | 
						|
#define _MINIX_SPIN_H
 | 
						|
 | 
						|
/* Opaque spin state structure. */
 | 
						|
typedef struct {
 | 
						|
	int s_state;
 | 
						|
	u32_t s_usecs;
 | 
						|
	u64_t s_base_tsc;
 | 
						|
	clock_t s_base_uptime;
 | 
						|
	int s_timeout;
 | 
						|
} spin_t;
 | 
						|
 | 
						|
/* Functions. */
 | 
						|
void spin_init(spin_t *s, u32_t usecs);
 | 
						|
int spin_check(spin_t *s);
 | 
						|
 | 
						|
/* Macros. */
 | 
						|
 | 
						|
/* Execute a loop for at least 'u' microseconds, using spin object 's'.
 | 
						|
 * The body of the loop is guaranteed to be executed at least once.
 | 
						|
 */
 | 
						|
#define SPIN_FOR(s,u)							\
 | 
						|
	for (spin_init((s), (u)); spin_check((s)); )
 | 
						|
 | 
						|
/* Return whether spin object 's' timed out after a loop. */
 | 
						|
#define SPIN_TIMEOUT(s) ((s)->s_timeout)
 | 
						|
 | 
						|
/* Spin until the given condition becomes true, or 'u' microseconds expired.
 | 
						|
 * The condition is guaranteed to be checked at least once.
 | 
						|
 */
 | 
						|
#define SPIN_UNTIL(c,u) do {						\
 | 
						|
	spin_t s;							\
 | 
						|
	SPIN_FOR(&s,(u))						\
 | 
						|
		if (c) break;						\
 | 
						|
} while (0)
 | 
						|
 | 
						|
#endif /* _MINIX_SPIN_H */
 |