On Mon, Jul 10, 2017 at 01:52:59PM +0200, Pino Toscano wrote:
On Tuesday, 27 June 2017 13:55:54 CEST Richard W.M. Jones wrote:
> Previously posted in 2015:
> v1:
https://www.redhat.com/archives/libguestfs/2015-June/msg00048.html
> v2:
https://www.redhat.com/archives/libguestfs/2015-June/msg00118.html
>
> I have rebased and tidied up the patches, fixing a few spelling
> mistakes, but they are broadly the same as before. I also ran all the
> tests, which pass.
>
> As with the previous versions, this makes a change to the API, where
> you can no longer pass a handle between threads and expect
> guestfs_last_error() to work. I'm somewhat more sanguine about this
> change, since using the API like that is abstruse and no one should be
> expecting that to have worked.
A general question on this: does enabling locking for all the handle
operation cause any noticeable performance issue in single-thread
handle usages?
Because we're using the gnulib wrapper, if the program is not linked
to pthread then TLS is not used at all. Instead a simple pointer is
substituted with the key.
However this is no longer a very realistic scenario. You would have
to disable libvirt and probably other libraries, to be sure that
pthread is not being linked to your libguestfs-using program.
Would it be worth making it opt-in somehow, so only users of the API
that require this kind of thread-safety would enable it?
I would be surprised if it was noticable. The overhead of calling
guestfs_set_verbose just to set an integer flag is already large, see
below. I think making the API usable from threads without requiring
any thought is better.
Rich.
GUESTFS_DLL_PUBLIC int
guestfs_set_verbose (guestfs_h *g,
int verbose)
{
int trace_flag = g->trace;
struct trace_buffer trace_buffer;
int r;
// This function iterates i = 0 .. nr_events-1.
guestfs_int_call_callbacks_message (g, GUESTFS_EVENT_ENTER,
"set_verbose", 11);
if (trace_flag) {
guestfs_int_trace_open (&trace_buffer);
fprintf (trace_buffer.fp, "%s", "set_verbose");
fputs (verbose ? " true" : " false", trace_buffer.fp);
guestfs_int_trace_send_line (g, &trace_buffer);
}
r = guestfs_impl_set_verbose (g, verbose);
if (r != -1) {
if (trace_flag) {
guestfs_int_trace_open (&trace_buffer);
fprintf (trace_buffer.fp, "%s = ", "set_verbose");
fprintf (trace_buffer.fp, "%d", r);
guestfs_int_trace_send_line (g, &trace_buffer);
}
} else {
if (trace_flag)
guestfs_int_trace (g, "%s = %s (error)",
"set_verbose", "-1");
}
return r;
}
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/