Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

glib2.0 + libdnf #6

Open
fedya opened this issue Mar 21, 2023 · 4 comments
Open

glib2.0 + libdnf #6

fedya opened this issue Mar 21, 2023 · 4 comments

Comments

@fedya
Copy link

fedya commented Mar 21, 2023

Глянул патч для glib2.0, я так понял он добавляет возможность использовать всякие g_autoptr
в lcc
Однако вот пытаюсь собрать libdnf-0.70.0
и там лезет

lcc: "/home/omv/libdnf/BUILD/libdnf-0.70.0/libdnf/dnf-lock.cpp", line 226: error #254:
          type name is not allowed
      g_autoptr(GError) error_local = NULL;
                ^

lcc: "/home/omv/libdnf/BUILD/libdnf-0.70.0/libdnf/dnf-lock.cpp", line 226: error #20:
          identifier "g_autoptr" is undefined
      g_autoptr(GError) error_local = NULL;
      ^

в участках кода типа

static guint
dnf_lock_get_pid(DnfLock *lock, const gchar *filename, GError **error)
{
    gboolean ret;
    guint64 pid;
    gchar *endptr = NULL;
    g_autoptr(GError) error_local = NULL;
    g_autofree gchar *contents = NULL;

    g_return_val_if_fail(DNF_IS_LOCK(lock), FALSE);

    /* file doesn't exists */
    ret = g_file_test(filename, G_FILE_TEST_EXISTS);
    if (!ret) {
        g_set_error_literal(error,
                            DNF_ERROR,
                            DNF_ERROR_INTERNAL_ERROR,
                            "lock file not present");
        return 0;
    }

Можно подсказать куда копнуть тут? Проблема в glib2.0 или непосредственно в libdnf?

Пример упавшей сборки
https://file-store.rosalinux.ru/api/v1/file_stores/295646e84de0ec62a601993c58219e1509cd7b69

@ilyakurdyukov
Copy link
Owner

ilyakurdyukov commented Mar 21, 2023

__attribute__((cleanup(func))) это расширение, что в EDG приделали, или сами МЦСТ добавили, не знаю.

Суть в том, что поддержка его неполноценная, для С это работает. Для C++ этот cleanup как-то мешается с деструкторами и в C++ его поддерживать не стали. В итоге компилятор выводит ворнинг, что не знает такого атрибута. А в программе будут утечки памяти, ведь ресурсы не освобождаются.

Из-за того как сделан g_autofree - исправить это невозможно. Я сделал макросы для помощи в исправлении, надо через sed фильтры исходники пропускать. А вместо ворнинга на cleanup будет уже ошибка, так что можно будет найти и исправить утечки памяти.

В Альте сейчас 8 пакетов с такими патчами:

mate-system-monitor
packagekit
eiskaltdcpp
appstream
libcamera
cherrytree
gnome-commander
libdnf

Примеры sed патчей:

sed -i "s|g_autofree char \*|g_autofree_edg(char) |" src/sysinfo.cpp
sed -i "/g_autofree gchar/{s|g_autofree gchar|g_autofree_edg(gchar)|;s|\*||g}" src/load-graph.cpp

sed -i "s|g_autofree gchar \*|g_autofree_edg_ex(gchar,std::string) |" eiskaltdcpp-gtk/src/{adlsearch,hub,mainwindow,uploadqueue}.cc

sed -i "s|g_autofree gchar\*|g_autofree_edg_ex(gchar,Glib::ustring) |" src/ct/ct_{misc_utils,storage_xml}.cc
sed -i "s|g_autofree gchar\*|g_autofree_edg_ex(gchar,std::string) |" src/ct/ct_*.cc
sed -i "s|pConverted+|(gchar*)&|" src/ct/ct_misc_utils.cc
sed -i "s|save_to_buffer(|&(gchar*\&)|" src/ct/ct_{imports,image,parser_html}.cc
sed -i "s|filename(pOutStr|filename((gchar*)pOutStr|" src/ct/ct_filesystem.cc

@ilyakurdyukov
Copy link
Owner

Вот спека libdnf-0.60.0, где можно патч посмотреть:

https://packages.altlinux.org/ru/sisyphus_e2k/srpms/libdnf/specfiles/

Пришлось потрудиться это пропатчить, там еще и свой макрос придумали с cleanup под названием hy_autoquery.

@fedya
Copy link
Author

fedya commented Mar 21, 2023

Попробовал применить
все равно лезет

lcc: "/home/omv/libdnf/BUILD/libdnf-0.70.0/libdnf/hy-iutil.cpp", строка 446: ошибка #254:
          имя типа недопустимо
      g_autoptr(GFile) src = g_file_new_for_path(srcPath.c_str());

В коде патча к glib2.0 вижу такое

+#define g_autoptr_free(TypeName, var) _GLIB_AUTOPTR_FUNC_NAME(TypeName)(&var)
+#define g_autoptr(TypeName) EDG_CLEANUP_HELPER<TypeName, TypeName*, _GLIB_AUTOPTR_FUNC_NAME(TypeName)>

Но от чего-то все равно не работает

@ilyakurdyukov
Copy link
Owner

У вас версия 0.70, а я исправлял 0.60. Так что дорабатывайте исправления.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants