From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,FUZZY_XPILL autolearn=no autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684573217; x=1687165217; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=Hv0kIqY3J2OGIZeOBXFbf2XNxlAWKoK7BosqdQcqaUE=; b=G+uN0xy4rm5I9KokZaPutGX8qYGV8WYFGHwOKQX3xN4kf6lLM5Q9MnVaGO0HV0WzZG Xj6D6EAq0iqcZMOmlZfYT4plF6DfvGbw79YNkZNdiEsWj+bbmWgjBcx6zUrGU6thYAZZ b7eZ9kNGXecEDq8gNbigGkv2PoptcElhfNdyScKipb5fLq32KWB896wtz7SEVGsel9W+ hIvR7PtrKyIx0TTQZodWnY6jtxSRcg2B+CtWE3zI9XUdbrf/tS214QkSSssuQJeLO7xY YzG99inK18sCGBF5G7r8q65+vBliEJkEb1GIz5IBa7I/QYRHZspowTBz29TafsuzbCCb n5Uw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684573217; x=1687165217; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Hv0kIqY3J2OGIZeOBXFbf2XNxlAWKoK7BosqdQcqaUE=; b=bjIWndaQxovIOjZnh5UCWri+JVXWNQLkfWi/4kdTqdzD0r3lpJfjd3M+AdV6c7gZk5 cyeD5Judd1L41iFAQENdPnLRJMl3iyNnK6S8lhbSfK6ClKKZ2+dyApCqR2JLjodcMT+2 TqfgN59eqzEm2VE+urwEOO5LgZ9RP4bIpYuu33Tdwy6bslnZ7IB5X3KGpTZDaMuxs/oU pD/M9wGOpRFO89tWHUUEQlhkBvofUzpCsJAXJERF4D4KUroPihTbE2+JSoav2k8zdDWV c5SD9slhp4dz9nqgOyVDpKLkHFVGwnRh+BoumSfEyNclorcOPzS58csnF3lFjbSDISpO /GrA== X-Gm-Message-State: AC+VfDxmm9Yar/cITfWxrnQ2bCKurWaXountkRwAr9JwCzplXqIIgamB IjyT+qTiFT08aD9q0pX5OydQiD8o2P0= X-Google-Smtp-Source: ACHHUZ4+75cNJb6IS6i8rDS72mzrQLg9WCOB802ULMud/UPO7Mrjnl8ZIkQpnowiRHrPzrm3KHn5tA== X-Received: by 2002:ac2:48b1:0:b0:4de:e802:b7e3 with SMTP id u17-20020ac248b1000000b004dee802b7e3mr1476361lfg.19.1684573216631; Sat, 20 May 2023 02:00:16 -0700 (PDT) Message-ID: Date: Sat, 20 May 2023 12:00:14 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.11.0 To: make-initrd@lists.altlinux.org References: <6b444ed922286eb3df8f5322b1bddf9c55753eb8.1683200226.git.gladkov.alexey@gmail.com> Content-Language: ru, en-US From: Leonid Krivoshein In-Reply-To: <6b444ed922286eb3df8f5322b1bddf9c55753eb8.1683200226.git.gladkov.alexey@gmail.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [make-initrd] [PATCH 1/3] Reimplement ueventd X-BeenThere: make-initrd@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: make-initrd@lists.altlinux.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 20 May 2023 09:00:19 -0000 Archived-At: List-Archive: Привет! On 5/4/23 16:42, Alexey Gladkov wrote: > [...] > diff --git a/datasrc/ueventd/ueventd.c b/datasrc/ueventd/ueventd.c > new file mode 100644 > index 00000000..f5923367 > --- /dev/null > +++ b/datasrc/ueventd/ueventd.c > @@ -0,0 +1,551 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ Добрался до самого толстого партизана в этом лесу, неделю уже на него смотрю, но ничего такого страшного в нём пока не увидел, вроде бы вполне рабочий код. Eсть вопросы/предложения по упрощению, читабельности и оптимизации... > [...] > + > +typedef int (*fdhandler_t)(int); > + > +struct fd_handler { > + int fd; > + fdhandler_t fd_handler; > +}; > + > +struct fd_handler fd_list[FD_MAX]; Имена прототипа функции-обработчика (1), структуры (2) и её члена (3) можно оставить как есть, назвав почти одним именем, но только, если очень хочется кого-то запутать. :-) Имя fd_list[] тоже не очень подходящее, поскольку это не только список именно fd. Константа FD_MAX, хоть и не определена в использованных заголовочных файлах, это имя иногда встречается рядом с FD_SET(), FD_CLR() и им подобным макросам в других исходниках как функция FD_MAX(x). На всякий случай... > + > +enum { > + PIPE_READ, > + PIPE_WRITE, > + PIPE_MAX, > +}; > + > +int pipefd[PIPE_MAX]; Данным фрагментом ты как бы говоришь: "я точно знаю, во что это превратит компилятор", слишком безапелляционно. Тут define's или хотя бы явное указание значений вполне уместно, с учётом дальнейшего использования в строках 122 и 388. Кроме того, pipefd не объявлен как static, можно не засорять глобальное пространство имён. > [...] > + > +int main(int argc, char **argv) > +{ > [...] > + while (1) { Не любишь ты использовать for (;;).... > + struct epoll_event ev[EV_MAX]; > + int fdcount; > + > + errno = 0; > + fdcount = epoll_wait(epollfd, ev, EV_MAX, 250); Почему 250, а не -1? Напоминает не нужный в этом месте "sleep .25". Если бы демон перезапускался для дефрагментации через какое-то число событий или спустя сколько-то минут, а тут совсем холостой ход получается. > + > + if (fdcount < 0) { > + if (errno == EINTR) > + continue; > + fatal("epoll_wait: %m"); > + } > + > + for (i = 0; i < fdcount; i++) { > + if (!(ev[i].events & EPOLLIN)) > + continue; > + for (int k = 0; k < FD_MAX; k++) { > + if (ev[i].data.fd != fd_list[k].fd) > + continue; > + if (fd_list[k].fd_handler(fd_list[k].fd) != 0) Непонятно, почему из всей структуры Userdata используется только ev->data->fd и потом элементы перебираются в циклах для поиска и сопоставления, хотя в ev->data при epoll_ctl(..., EPOL_CTL_ADD, ...) вполне можно было бы разместить всё самое интересное для ускорения доступа. > + goto done; > + } > + } > + > + for (e = watch_list; e; e = e->next) { > + if (!(e->q_flags & F_QUEUE_DIR) || !(e->q_flags & F_DIRTY) || (e->q_pid != 0) || (e->q_flags & F_PAUSED)) > + continue; > + e->q_flags &= ~F_DIRTY; > + e->q_pid = spawn_worker(epollfd, e); > + } > + } > +done: > + for (e = watch_list, n = NULL; e; e = n) { > + n = e->next; > + if (e->q_pid) > + kill(e->q_pid, SIGKILL); > + inotify_rm_watch(fd_list[FD_INOTIFY].fd, e->q_watchfd); > + free(e); > + } > + > + for (i = 0; i < FD_MAX; i++) { > + if (fd_list[i].fd >= 0) { > + if (epoll_ctl(epollfd, EPOLL_CTL_DEL, fd_list[i].fd, NULL) < 0) > + err("epoll_ctl: %m"); > + close(fd_list[i].fd); > + } > + } > + close(epollfd); > + logging_close(); > + > + return EXIT_SUCCESS; > +} > [...] -- WBR, Leonid Krivoshein.