From: Steven Rostedt <rostedt@goodmis.org>
To: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com>
Cc: linux-trace-devel@vger.kernel.org
Subject: Re: [PATCH v17 16/18] trace-cmd: Basic infrastructure for host - guest timestamp synchronization
Date: Tue, 10 Dec 2019 12:04:58 -0500 [thread overview]
Message-ID: <20191210120458.38f98bed@gandalf.local.home> (raw)
In-Reply-To: <20191203103522.482684-17-tz.stoyanov@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 653 bytes --]
On Tue, 3 Dec 2019 12:35:20 +0200
"Tzvetomir Stoyanov (VMware)" <tz.stoyanov@gmail.com> wrote:
> +struct tracecmd_time_sync {
> + unsigned int sync_proto;
> + int loop_interval;
> + sem_t sem;
Ug, semaphores are a horrible construct. I believe you can do the same
thing here with pthread_cond variables. I attached a small program that
uses pthread_cond and pthread_mutex to do interval times like this.
Note, another thing is, you can just have a global "end" variable that
can be set and checked (as I did in my program here).
-- Steve
> + char *clock_str;
> + struct tracecmd_msg_handle *msg_handle;
> + void *context;
> +};
> +
[-- Attachment #2: pthread_condwait.c --]
[-- Type: text/x-c++src, Size: 2171 bytes --]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdarg.h>
#include <errno.h>
#include <stdbool.h>
#include <pthread.h>
#define gettid() syscall(__NR_gettid)
static bool end;
static void __vdie(const char *fmt, va_list ap, int err)
{
int ret = errno;
if (err && errno)
perror("bmp-read");
else
ret = -1;
fprintf(stderr, " ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
exit(ret);
}
void pdie(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
__vdie(fmt, ap, 1);
va_end(ap);
}
#define NR_THREADS 8
static int nr_threads = NR_THREADS;
static pthread_t *threads;
static pthread_barrier_t threads_started;
struct t_info {
int id;
int interval;
pthread_mutex_t lock;
pthread_cond_t cond;
};
static void *thread_func(void *arg)
{
struct t_info *t = arg;
pthread_mutex_t *this_mutex = &t->lock;
pthread_cond_t *this_cond = &t->cond;
struct timespec ts;
int cnt = 0;
pthread_barrier_wait(&threads_started);
while (true) {
pthread_mutex_lock(this_mutex);
printf("task %d running %d\n", t->id, ++cnt);
if (end)
break;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += t->id + 1;
pthread_cond_timedwait(this_cond, this_mutex, &ts);
pthread_mutex_unlock(this_mutex);
}
pthread_mutex_unlock(this_mutex);
printf("Task %d finished\n", t->id);
return NULL;
}
int main (int argc, char **argv)
{
struct t_info *infos;
int ret;
int i;
infos = calloc(nr_threads, sizeof(*infos));
if (!infos)
pdie("calloc");
threads = calloc(nr_threads, sizeof(*threads));
if (!threads)
pdie("calloc");
pthread_barrier_init(&threads_started, NULL, nr_threads + 1);
for (i = 0; i < nr_threads; i++) {
infos[i].id = i;
if (pthread_mutex_init(&infos[i].lock, NULL))
pdie("pthread_mutex_init");
ret = pthread_create(&threads[i], NULL, thread_func, &infos[i]);
if (ret < 0)
pdie("creating thread %d", i);
}
pthread_barrier_wait(&threads_started);
sleep(30);
end = true;
for (i = 0; i < nr_threads; i++) {
pthread_mutex_lock(&infos[i].lock);
pthread_cond_signal(&infos[i].cond);
pthread_mutex_unlock(&infos[i].lock);
pthread_join(threads[i], NULL);
}
return 0;
}
next prev parent reply other threads:[~2019-12-10 17:05 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-03 10:35 [PATCH v17 00/18]Timestamp synchronization of host - guest tracing session Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 01/18] trace-cmd: Implement new lib API: tracecmd_local_events_system() Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 02/18] trace-cmd: Add support for negative time offsets in trace.dat file Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 03/18] trace-cmd: Add implementations of htonll() and ntohll() Tzvetomir Stoyanov (VMware)
2019-12-20 13:50 ` Steven Rostedt
2020-01-06 14:30 ` Tzvetomir Stoyanov
2019-12-03 10:35 ` [PATCH v17 04/18] trace-cmd: Add new library APIs for ftrace instances Tzvetomir Stoyanov (VMware)
2019-12-04 16:17 ` Steven Rostedt
2019-12-05 14:40 ` Tzvetomir Stoyanov
2019-12-03 10:35 ` [PATCH v17 05/18] trace-cmd: Add new library API for local CPU count Tzvetomir Stoyanov (VMware)
2019-12-04 20:09 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 06/18] trace-cmd: Add new library API for reading ftrace buffers Tzvetomir Stoyanov (VMware)
2019-12-04 21:10 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 07/18] trace-cmd: Find and store pids of tasks, which run virtual CPUs of given VM Tzvetomir Stoyanov (VMware)
2019-12-04 21:35 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 08/18] trace-cmd: Implement new API tracecmd_add_option_v() Tzvetomir Stoyanov (VMware)
2019-12-04 21:47 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 09/18] trace-cmd: Add new API to generate a unique ID of the tracing session Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 10/18] trace-cmd: Store the session tracing ID in the trace.dat file Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 11/18] trace-cmd: Exchange tracing IDs between host and guest Tzvetomir Stoyanov (VMware)
2019-12-04 22:03 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 12/18] trace-cmd: Implement new option in trace.dat file: TRACECMD_OPTION_TIME_SHIFT Tzvetomir Stoyanov (VMware)
2019-12-05 0:46 ` Steven Rostedt
2019-12-05 15:09 ` Tzvetomir Stoyanov
2019-12-03 10:35 ` [PATCH v17 13/18] trace-cmd: Add guest information in host's trace.dat file Tzvetomir Stoyanov (VMware)
2019-12-05 0:59 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 14/18] trace-cmd: Add host trace clock as guest trace argument Tzvetomir Stoyanov (VMware)
2019-12-09 19:31 ` Steven Rostedt
2019-12-10 8:49 ` Tzvetomir Stoyanov
2019-12-10 15:48 ` Steven Rostedt
2019-12-11 8:21 ` Tzvetomir Stoyanov
2019-12-11 15:01 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 15/18] trace-cmd: Refactor few trace-cmd internal functions Tzvetomir Stoyanov (VMware)
2019-12-09 19:32 ` Steven Rostedt
2019-12-03 10:35 ` [PATCH v17 16/18] trace-cmd: Basic infrastructure for host - guest timestamp synchronization Tzvetomir Stoyanov (VMware)
2019-12-10 17:04 ` Steven Rostedt [this message]
2019-12-10 18:39 ` Steven Rostedt
2019-12-12 12:34 ` Tzvetomir Stoyanov
2019-12-12 14:54 ` Steven Rostedt
2019-12-12 14:00 ` Tzvetomir Stoyanov
2019-12-03 10:35 ` [PATCH v17 17/18] trace-cmd: [POC] PTP-like algorithm " Tzvetomir Stoyanov (VMware)
2019-12-03 10:35 ` [PATCH v17 18/18] trace-cmd: Debug scripts for " Tzvetomir Stoyanov (VMware)
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=20191210120458.38f98bed@gandalf.local.home \
--to=rostedt@goodmis.org \
--cc=linux-trace-devel@vger.kernel.org \
--cc=tz.stoyanov@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).