ilyakurdyukov / e2k-ports

Performance patches and build fixes for Elbrus 2000 (e2k) architecture.
43 stars 5 forks source link

glib2.0 + libdnf #6

Open fedya opened 1 year ago

fedya commented 1 year ago

Глянул патч для 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 commented 1 year ago

__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 commented 1 year ago

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

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

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

fedya commented 1 year ago

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

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 commented 1 year ago

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