Re: Public virErrorPreserveLast()/virErrorRestore()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Dec 14, 2023 at 05:55:41PM +0100, Peter Krempa wrote:

> If you need any form of more complex logic in your application for error
> reporting (ab)using libvirt's thread local variable to store the error

I'm a bit lost on the "abuse" claim here.  Is this abuse in your eyes:

```
 int saved_errno = errno;
 close(fd);
 errno = saved_errno;
```

since "errno" is libc's thread local variable that stores the error?

> for other functions in your application will not bring too much
> simplification of the logic itself.

Excuse the pseudocode:

```
int func() {
	...
	cleanup:
		err = virErrorSaveLast(error);
		virDomainFree(domain);
		virErrorRestore(error);
		return ret;
}

func2() {
	ret = func();
	fprintf(stderr, "%s\n", virGetLastErrorMessage());
```

versus:

```
int func() {
	...
	cleanup:
		err = pthread_getspecific(global->pthread_key_libvirt_error);
		*err = virSaveLastError();
		virDomainFree(domain);
		pthread_setspecific(global->pthread_key_libvirt_error, err);
		return ret;
}

func2() {
	ret = func();
	err = pthread_getspecific(global->pthread_key_libvirt_error);
	fprintf(stderr, "%s\n", err->message);

```

If your argument is that the second version is somehow better, I don't think
we're going to agree, and we'll just keep another local patch. Thanks for the
discussion!

> Using the global error handler function is not a very good idea in
> multithreaded applications

Side note: there's little point in me going into it, but been there, earned the
scars. Due to, for example, various connection failures showing up as
VIR_ERR_INTERNAL_ERROR, there's no reliable way to use the close callback with
multiple threads sharing a connection and correctly differentiating between a
need to reconnect and an actual API failure.

Although, it sounds like you know of a counter-example piece of code: is it
something you could share?

regards
john
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux