All of lore.kernel.org
 help / color / mirror / Atom feed
From: chrubis@suse.cz
To: Jan Stancek <jstancek@redhat.com>
Cc: ltp-list@lists.sourceforge.net
Subject: Re: [LTP] [PATCH] add clock_gettime04
Date: Wed, 10 Sep 2014 17:18:05 +0200	[thread overview]
Message-ID: <20140910151804.GA16633@rei> (raw)
In-Reply-To: <8a36059fe9afea205712b2a1c9a0ca678b22b927.1410353116.git.jstancek@redhat.com>

Hi!
> +#define SAFE_PTHREAD(fn, ...) do { \
> +	int ret = fn(__VA_ARGS__); \
> +	if (ret) { \
> +		TEST_ERRNO = ret; \
> +		tst_brkm(TBROK | TTERRNO, cleanup, #fn); \
                                   ^
				 We have TRERRNO for the case of pthread
				 functions.
> +	} \
> +} while (0)
> +
> +char *TCID = "clock_gettime04";
> +int TST_TOTAL = 1;
> +
> +static volatile sig_atomic_t done_testing;
> +static int opt_testtime;
> +static char *opt_testtimestr;
> +static option_t options[] = {
> +	{"T:", &opt_testtime, &opt_testtimestr},

There is no need to use both opt_testtime and opt_testtimestr, you can
do just:

	if (opt_testtimestr) {
		...
	}

> +	{NULL, NULL, NULL}
> +};
> +static pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
> +
> +static void setup(void);
> +static void cleanup(void);
> +
> +static void sigproc(int sig)
> +{
> +	(void) sig;
> +	done_testing = 1;
> +}

Shouldn't we rather do:

	if (!done_testing)
		done_testing = 1;

Because as far as I can see the alarm may stil fire between
one of the threads set done_testing to 2 and the if (done_testing == 1)
message.

> +int64_t get_thread_cpu_time(pthread_t thread)
> +{
> +	clockid_t clockid;
> +	int ret;
> +	struct timespec tp;
> +
> +	SAFE_PTHREAD(pthread_getcpuclockid, thread, &clockid);
> +
> +	ret = clock_gettime(clockid, &tp);
> +	if (ret)
> +		tst_brkm(TBROK | TERRNO, cleanup, "clock_gettime: %d", ret);
> +
> +	return (tp.tv_sec * NANOSECS_PER_SEC) + tp.tv_nsec;
> +}
> +
> +static void *child(void *arg)
> +{
> +	struct timespec tim;
> +	int64_t t, t_last = 0;
> +	int check_own_cpu_time = *(int *)arg;
> +
> +	tim.tv_sec = 0;
> +	tim.tv_nsec = 5000;
> +
> +	while (!done_testing) {
> +		nanosleep(&tim, NULL);
> +
> +		if (!check_own_cpu_time)
> +			continue;
> +
> +		t = get_thread_cpu_time(pthread_self());
> +		if (t < t_last) {
> +			tst_resm(TFAIL, "t: %" PRId64 " < t_last: %"
> +				PRId64,	t, t_last);
> +			done_testing = 2;
> +		} else {
> +			t_last = t;
> +		}
> +	}
> +
> +	SAFE_PTHREAD(pthread_mutex_lock, &exit_mutex);
> +	SAFE_PTHREAD(pthread_mutex_unlock, &exit_mutex);
> +
> +	return NULL;
> +}
> +
> +static void test(int seconds)
> +{
> +	int i, child_check_cpu_time[] = { 0, 1 };
> +	pthread_t thread[THREAD_COUNT];
> +	clockid_t clockid[THREAD_COUNT];
> +	int64_t thread_time[THREAD_COUNT], cur_time;
> +
> +	done_testing = 0;
> +	alarm(seconds);
> +
> +	/* create children and make every 2nd child check its own
> +	 * cpu time as well. */
> +	for (i = 0; i < THREAD_COUNT; i++) {
> +		SAFE_PTHREAD(pthread_create, &thread[i], NULL, child,
> +			&child_check_cpu_time[i % 2]);
> +		SAFE_PTHREAD(pthread_getcpuclockid, thread[i], &clockid[i]);
> +		tst_resm(TINFO, "thread no.: %d clockid: %d", i, clockid[i]);
> +	}
> +
> +	for (i = 0; i < THREAD_COUNT; i++)
> +		thread_time[i] = get_thread_cpu_time(thread[i]);
> +
> +	SAFE_PTHREAD(pthread_mutex_lock, &exit_mutex);

Hmm, shouldn't this mutex be locked before we create the threads
because otherwise some threads may have exited allready.

> +	/* check periodically that cpu time of each thread
> +	 * doesn't go backwards */
> +	while (!done_testing) {
> +		for (i = 0; i < THREAD_COUNT; i++) {
> +			cur_time = get_thread_cpu_time(thread[i]);
> +			if (cur_time < thread_time[i]) {
> +				tst_resm(TFAIL, "cpu clock time went backwards "
> +						"thread no. %d, clock id: %d"
> +						" previous value: %" PRId64
> +						" current value: %" PRId64,
> +						i, clockid[i], thread_time[i],
> +						cur_time);
> +				done_testing = 2;
> +				break;
> +			}
> +			thread_time[i] = cur_time;
> +		}
> +	}
> +
> +	/* allow children to exit now */
> +	SAFE_PTHREAD(pthread_mutex_unlock, &exit_mutex);
> +
> +	for (i = 0; i < THREAD_COUNT; i++)
> +		SAFE_PTHREAD(pthread_join, thread[i], NULL);
> +
> +	if (done_testing == 1)
> +		tst_resm(TPASS, "Test completed, cpu times of all "
> +				"thread clocks were monotonic");
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	int testtime = DEFAULT_TEST_TIME;
> +	const char *msg = NULL;
> +
> +	msg = parse_opts(argc, argv, options, NULL);
> +	if (msg)
> +		tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
> +
> +	if (opt_testtime) {
> +		testtime = atoi(opt_testtimestr);
> +		if (testtime <= 0) {
> +			tst_brkm(TBROK, NULL, "Invalid arg for -T: %s",
> +				opt_testtimestr);
> +		}
> +	}
> +
> +	setup();
> +
> +	test(testtime);

Shouldn't the test(testtime) be still inside the for () loop with
TEST_LOOPING() because otherwise the test will gladly accept and ignore
the standard parameters (-i -I etc).

Otherwise it looks OK to me.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  reply	other threads:[~2014-09-10 15:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-10 12:46 [LTP] [PATCH] add clock_gettime04 Jan Stancek
2014-09-10 15:18 ` chrubis [this message]
     [not found]   ` <1162485694.20768561.1410363325469.JavaMail.zimbra@redhat.com>
2014-09-10 16:32     ` chrubis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140910151804.GA16633@rei \
    --to=chrubis@suse.cz \
    --cc=jstancek@redhat.com \
    --cc=ltp-list@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.