69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz>
 | |
|  *
 | |
|  * Licensed under the GNU GPLv2 or later.
 | |
|  * This program is free software;  you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation; either version 2 of the License, or
 | |
|  * (at your option) any later version.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY;  without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
 | |
|  * the GNU General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License
 | |
|  * along with this program;  if not, write to the Free Software Foundation,
 | |
|  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| #ifndef FUTEX_UTILS_H__
 | |
| #define FUTEX_UTILS_H__
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| /*
 | |
|  * Wait for nr_threads to be sleeping
 | |
|  */
 | |
| static inline int wait_for_threads(unsigned int nr_threads)
 | |
| {
 | |
| 	char thread_state, name[1024];
 | |
| 	DIR *dir;
 | |
| 	struct dirent *dent;
 | |
| 	unsigned int cnt = 0;
 | |
| 
 | |
| 	snprintf(name, sizeof(name), "/proc/%i/task/", getpid());
 | |
| 
 | |
| 	dir = SAFE_OPENDIR(name);
 | |
| 
 | |
| 	while ((dent = SAFE_READDIR(dir))) {
 | |
| 		/* skip ".", ".." and the main thread */
 | |
| 		if (atoi(dent->d_name) == getpid() || atoi(dent->d_name) == 0)
 | |
| 			continue;
 | |
| 
 | |
| 		snprintf(name, sizeof(name), "/proc/%i/task/%s/stat",
 | |
| 			 getpid(), dent->d_name);
 | |
| 
 | |
| 		SAFE_FILE_SCANF(name, "%*i %*s %c", &thread_state);
 | |
| 
 | |
| 		if (thread_state != 'S') {
 | |
| 			tst_res(TINFO, "Thread %s not sleeping yet", dent->d_name);
 | |
| 			SAFE_CLOSEDIR(dir);
 | |
| 			return 1;
 | |
| 		}
 | |
| 		cnt++;
 | |
| 	}
 | |
| 
 | |
| 	SAFE_CLOSEDIR(dir);
 | |
| 
 | |
| 	if (cnt != nr_threads) {
 | |
| 		tst_res(TINFO, "%u threads sleeping, expected %u", cnt,
 | |
| 			nr_threads);
 | |
| 	}
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #endif /* FUTEX_UTILS_H__ */
 |