From patchwork Wed May 5 12:33:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12239883 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77503C433B4 for ; Wed, 5 May 2021 12:33:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 44AE7613C1 for ; Wed, 5 May 2021 12:33:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233393AbhEEMek (ORCPT ); Wed, 5 May 2021 08:34:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40238 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233381AbhEEMef (ORCPT ); Wed, 5 May 2021 08:34:35 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 346E6C061763 for ; Wed, 5 May 2021 05:33:39 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id s8so1638362wrw.10 for ; Wed, 05 May 2021 05:33:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Iq1rBCQ8oR2AJbExXwjG9+20T8p6nYThXxil8xmDcoU=; b=JefSNKxVD+SGNZvlvqxFGHoxhks2jpXxrucsLcuKpGayafalE4LLWrg507AX83E77R 8+3iJftKt2ATD6SrrSuB68K33xwduviY7BJVTin7xd8ASZNfD8lIDR0amulWtgu3Fjvt wQrig0jzjwu5Ii0Gv5CrOMGSxQbOfKziqQ0o7QH9FEk7EBx89nSEgkwGu/2fSnWU6tSz bLMN5X+o6WQKWQIzSyuG9P8L1T76T9WHjbIDpA+oZb1f+k6oPR/cLwTl/HEgnViguURu giuk72dMvc+rno38dz9xZrTsqTXaZoVuda7ap9UoHwAHF8DhOojM5cfvuhw/S8dg7MDj wsfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Iq1rBCQ8oR2AJbExXwjG9+20T8p6nYThXxil8xmDcoU=; b=B8X4278yLwrbSEXbFnVcCqYf4C+MTTIEO0cC6N3O9+yLlEtfpCyWepCejBD/ktc3gZ adX96isv8tFxdkcbxMYTXzi3iiKlonfgRbzXvfaHU+L12vyk/ARIWUhdJIELUvNy/izS nysY+tBS90/jYIGqadxBpCBoQU1D1j8amUsCHyYuZhPmgDVw91Np6982m722nGEzOIH7 n7IzMvybDmeYPRe1SJH3UQ+Ey6s8whVa7JKQa9HF8RjflE7xbxfmOwCxm73zyfGgAm6Z +ZIzy6NdCsH4wBTBvhc3Gw/BEvZrLT7Q8M+9n1FKUx02g0lcBdWxyyvDgs5rdFEKtJHG +Mbg== X-Gm-Message-State: AOAM531PByaqzSzmuyiyxyaZVWuzI2ulhnGPMbLRDtqD5ncf3gyjpqlM qdYLGK5S+aSO9VYIUvMo5Nu8afQEmRSWow== X-Google-Smtp-Source: ABdhPJzIEQ2p04FK5bRozyX9maC/+PMPjmhIbli3LoXei7DOePVVf0EF+G8ufpa6cTlavS/a6RzhPw== X-Received: by 2002:a5d:6b88:: with SMTP id n8mr34845157wrx.274.1620218017634; Wed, 05 May 2021 05:33:37 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id q16sm5858755wmj.24.2021.05.05.05.33.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 May 2021 05:33:36 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH 1/5] streaming.c: avoid forward declarations Date: Wed, 5 May 2021 14:33:28 +0200 Message-Id: X-Mailer: git-send-email 2.31.1.838.g7ac6e98bb53 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change code added in 46bf043807c (streaming: a new API to read from the object store, 2011-05-11) to avoid forward declarations of the functions it uses. We can instead move this code to the bottom of the file, and thus avoid the open_method_decl() calls. Aside from the addition of the "static helpers[...]" comment being added here, and the removal of the forward declarations this is a move-only change. The style of the added "static helpers[...]" comment isn't in line with our usual coding style, but is consistent with several other comments used in this file, so let's use that style consistently here. Signed-off-by: Ævar Arnfjörð Bjarmason --- streaming.c | 171 +++++++++++++++++++++++++--------------------------- 1 file changed, 83 insertions(+), 88 deletions(-) diff --git a/streaming.c b/streaming.c index 800f07a52cc..b0d439e47a7 100644 --- a/streaming.c +++ b/streaming.c @@ -42,20 +42,6 @@ struct stream_vtbl { ssize_t read_istream_ ##name \ (struct git_istream *st, char *buf, size_t sz) -/* forward declaration */ -static open_method_decl(incore); -static open_method_decl(loose); -static open_method_decl(pack_non_delta); -static struct git_istream *attach_stream_filter(struct git_istream *st, - struct stream_filter *filter); - - -static open_istream_fn open_istream_tbl[] = { - open_istream_incore, - open_istream_loose, - open_istream_pack_non_delta, -}; - #define FILTER_BUFFER (1024*16) struct filtered_istream { @@ -97,80 +83,6 @@ struct git_istream { } u; }; -int close_istream(struct git_istream *st) -{ - int r = st->vtbl->close(st); - free(st); - return r; -} - -ssize_t read_istream(struct git_istream *st, void *buf, size_t sz) -{ - return st->vtbl->read(st, buf, sz); -} - -static enum input_source istream_source(struct repository *r, - const struct object_id *oid, - enum object_type *type, - struct object_info *oi) -{ - unsigned long size; - int status; - - oi->typep = type; - oi->sizep = &size; - status = oid_object_info_extended(r, oid, oi, 0); - if (status < 0) - return stream_error; - - switch (oi->whence) { - case OI_LOOSE: - return loose; - case OI_PACKED: - if (!oi->u.packed.is_delta && big_file_threshold < size) - return pack_non_delta; - /* fallthru */ - default: - return incore; - } -} - -struct git_istream *open_istream(struct repository *r, - const struct object_id *oid, - enum object_type *type, - unsigned long *size, - struct stream_filter *filter) -{ - struct git_istream *st; - struct object_info oi = OBJECT_INFO_INIT; - const struct object_id *real = lookup_replace_object(r, oid); - enum input_source src = istream_source(r, real, type, &oi); - - if (src < 0) - return NULL; - - st = xmalloc(sizeof(*st)); - if (open_istream_tbl[src](st, r, &oi, real, type)) { - if (open_istream_incore(st, r, &oi, real, type)) { - free(st); - return NULL; - } - } - if (filter) { - /* Add "&& !is_null_stream_filter(filter)" for performance */ - struct git_istream *nst = attach_stream_filter(st, filter); - if (!nst) { - close_istream(st); - return NULL; - } - st = nst; - } - - *size = st->size; - return st; -} - - /***************************************************************** * * Common helpers @@ -508,11 +420,94 @@ static open_method_decl(incore) return st->u.incore.buf ? 0 : -1; } +/***************************************************************************** + * static helpers variables and functions for users of streaming interface + *****************************************************************************/ + +static open_istream_fn open_istream_tbl[] = { + open_istream_incore, + open_istream_loose, + open_istream_pack_non_delta, +}; + +static enum input_source istream_source(struct repository *r, + const struct object_id *oid, + enum object_type *type, + struct object_info *oi) +{ + unsigned long size; + int status; + + oi->typep = type; + oi->sizep = &size; + status = oid_object_info_extended(r, oid, oi, 0); + if (status < 0) + return stream_error; + + switch (oi->whence) { + case OI_LOOSE: + return loose; + case OI_PACKED: + if (!oi->u.packed.is_delta && big_file_threshold < size) + return pack_non_delta; + /* fallthru */ + default: + return incore; + } +} + /**************************************************************** * Users of streaming interface ****************************************************************/ +int close_istream(struct git_istream *st) +{ + int r = st->vtbl->close(st); + free(st); + return r; +} + +ssize_t read_istream(struct git_istream *st, void *buf, size_t sz) +{ + return st->vtbl->read(st, buf, sz); +} + +struct git_istream *open_istream(struct repository *r, + const struct object_id *oid, + enum object_type *type, + unsigned long *size, + struct stream_filter *filter) +{ + struct git_istream *st; + struct object_info oi = OBJECT_INFO_INIT; + const struct object_id *real = lookup_replace_object(r, oid); + enum input_source src = istream_source(r, real, type, &oi); + + if (src < 0) + return NULL; + + st = xmalloc(sizeof(*st)); + if (open_istream_tbl[src](st, r, &oi, real, type)) { + if (open_istream_incore(st, r, &oi, real, type)) { + free(st); + return NULL; + } + } + if (filter) { + /* Add "&& !is_null_stream_filter(filter)" for performance */ + struct git_istream *nst = attach_stream_filter(st, filter); + if (!nst) { + close_istream(st); + return NULL; + } + st = nst; + } + + *size = st->size; + return st; +} + int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter *filter, int can_seek) { From patchwork Wed May 5 12:33:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12239887 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B07D8C43461 for ; Wed, 5 May 2021 12:33:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 766E8613AA for ; Wed, 5 May 2021 12:33:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233406AbhEEMen (ORCPT ); Wed, 5 May 2021 08:34:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40246 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229793AbhEEMei (ORCPT ); Wed, 5 May 2021 08:34:38 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EABDDC0613ED for ; Wed, 5 May 2021 05:33:39 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id i128so1317061wma.5 for ; Wed, 05 May 2021 05:33:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=D5HaJcf0F22eGItLU1MmLWIMVGvb/JwDIgHHC+WO49U=; b=HQ7Lryb3ex541HH1l7sQJwkJwfPIjn4LMqDMwc1Iu0FE7dLiWt9G4aOAmyMoYPcBNE fKIwBSx4/RZByjOhNERcb4zJg8P0jHoMT83KtC0NijqhW4Z0Sd0hFKigdujoamqyLuRv 0NiJJEyTq8JfWQU3KOqFb92ZHPsx1ktP5/s+43Jj1z7tyVSCN5DpHVWNvxoe7eWin2KE bzZOZawp/Y03EpWNdHJps1mkcruxl2UF4FY9sAyeCPqfW8N7tb4IqC+jQB1XUG3ryYgy 0x2vNiV/6hcsuM3goj1bPkcl0tXOdTeHNT+z1HINphokyHstO7pe0zqIT7omHpaeK77X I60w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=D5HaJcf0F22eGItLU1MmLWIMVGvb/JwDIgHHC+WO49U=; b=oozjU1uNGM3eiriKPZ+kDi56RQ/jknq08Tq9pL5l68zJhVjA5betPzHlw7nuIU6f6u rlkbrpVRktwDaevvuFTqOE1ehdl3+Uv1GPKKFAVdMVUgeQOQToq4A7epSWb9xNfCpk3I ceYZuzNSuzjyS3iBMTuFbJM5i95oIuvjQtibhLVCnO0UZFMnEVyKpBfDYAsFdEsshuqm gQpYdYspYq/zN0q3ZGm/xFsePUsxLn1eq2gkUjxMekla5cPXmI5mNN8L9I84ifpwnHLg 6staOAmBmBuXtxZFWnhsQPFZHWyAEQ4YHv9bbh5V+l1YP3bfV8ZBG7wqQr/z0Puwev8R 8HWA== X-Gm-Message-State: AOAM530GOr1SM6nlw0TuUWlGFXLP72PCx+QR/1bc5Rch+9DMdLkHGiM8 f04jTCH4vl7LQjtkMWztZJdw0jvI0K7dgg== X-Google-Smtp-Source: ABdhPJzWsQnwkI2/fjpNuGzAqKMTNEnY2tJjAWpDcGTiaC2UGl3K1BXvmsYfiirsI+Ap5c06DrO3aw== X-Received: by 2002:a7b:c217:: with SMTP id x23mr9530170wmi.26.1620218018388; Wed, 05 May 2021 05:33:38 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id q16sm5858755wmj.24.2021.05.05.05.33.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 May 2021 05:33:37 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH 2/5] streaming.c: remove enum/function/vtbl indirection Date: Wed, 5 May 2021 14:33:29 +0200 Message-Id: X-Mailer: git-send-email 2.31.1.838.g7ac6e98bb53 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Remove the indirection of discovering a function pointer to use via an enum and virtual table. This refactors code added in 46bf043807c (streaming: a new API to read from the object store, 2011-05-11). We can instead simply return an "open_istream_fn" for use from the "istream_source()" selector function directly. This allows us to get rid of the "incore", "loose" and "pack_non_delta" enum variables. We'll return the functions instead. The "stream_error" variable in that enum can likewise go in favor of returning NULL, which is what the open_istream() was doing when it got that value anyway. We can thus remove the entire enum, and the "open_istream_tbl" virtual table that (indirectly) referenced it. Signed-off-by: Ævar Arnfjörð Bjarmason --- streaming.c | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/streaming.c b/streaming.c index b0d439e47a7..628369519b9 100644 --- a/streaming.c +++ b/streaming.c @@ -8,13 +8,6 @@ #include "replace-object.h" #include "packfile.h" -enum input_source { - stream_error = -1, - incore = 0, - loose = 1, - pack_non_delta = 2 -}; - typedef int (*open_istream_fn)(struct git_istream *, struct repository *, struct object_info *, @@ -424,16 +417,10 @@ static open_method_decl(incore) * static helpers variables and functions for users of streaming interface *****************************************************************************/ -static open_istream_fn open_istream_tbl[] = { - open_istream_incore, - open_istream_loose, - open_istream_pack_non_delta, -}; - -static enum input_source istream_source(struct repository *r, - const struct object_id *oid, - enum object_type *type, - struct object_info *oi) +static open_istream_fn istream_source(struct repository *r, + const struct object_id *oid, + enum object_type *type, + struct object_info *oi) { unsigned long size; int status; @@ -442,21 +429,20 @@ static enum input_source istream_source(struct repository *r, oi->sizep = &size; status = oid_object_info_extended(r, oid, oi, 0); if (status < 0) - return stream_error; + return NULL; switch (oi->whence) { case OI_LOOSE: - return loose; + return open_istream_loose; case OI_PACKED: if (!oi->u.packed.is_delta && big_file_threshold < size) - return pack_non_delta; + return open_istream_pack_non_delta; /* fallthru */ default: - return incore; + return open_istream_incore; } } - /**************************************************************** * Users of streaming interface ****************************************************************/ @@ -482,13 +468,13 @@ struct git_istream *open_istream(struct repository *r, struct git_istream *st; struct object_info oi = OBJECT_INFO_INIT; const struct object_id *real = lookup_replace_object(r, oid); - enum input_source src = istream_source(r, real, type, &oi); + open_istream_fn open_fn = istream_source(r, real, type, &oi); - if (src < 0) + if (!open_fn) return NULL; st = xmalloc(sizeof(*st)); - if (open_istream_tbl[src](st, r, &oi, real, type)) { + if (open_fn(st, r, &oi, real, type)) { if (open_istream_incore(st, r, &oi, real, type)) { free(st); return NULL; From patchwork Wed May 5 12:33:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12239885 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2496C43460 for ; Wed, 5 May 2021 12:33:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B6988613BE for ; Wed, 5 May 2021 12:33:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233384AbhEEMel (ORCPT ); Wed, 5 May 2021 08:34:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233387AbhEEMeh (ORCPT ); Wed, 5 May 2021 08:34:37 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA9ADC06138A for ; Wed, 5 May 2021 05:33:40 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id y124-20020a1c32820000b029010c93864955so3318050wmy.5 for ; Wed, 05 May 2021 05:33:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Snpc7WZvEIiWB8Tl7eSrsd6dzVa7zl1ilnakmrGxZtw=; b=dxu61NGKZpeJ2TIE8dH47T2w83nUk6ah4T/seDxw2BRagjPAC3I9BH1j6VJtn0Y6G0 d0XiK4y2pfEjAE7dJ1SWwUJjaju/xo57M1pgL8Zc3xcwFTdNMBIuSk19pkS9B2WqZ/Oz hpoGyhDJmmcIP5hPdcKuOIcICRjGwlzuah648WfRcXfvyYhLg4Bv18QMCShIEiYxJE8G IsjESRqEqgcypkGQsxQOnPFfO8+rp0BpT36tFhRDXxO9g0iFWmdrccOw0wTmksbDFhf0 fKKZWbejURS+5GZj5UVebgIjOHvj6lGrpidLbyRXnqvaIABnuh+pCygZziRFGXGM6sNb Jo9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Snpc7WZvEIiWB8Tl7eSrsd6dzVa7zl1ilnakmrGxZtw=; b=AanEte4MfKKqa+wXnapECoWFuBhwjApvw7u6Ja4yJHQDaDTe9L+smR3SgwJ6fVMoc7 4EsykeFSqQoLzhrEVY1Pa9hKHp9Y48lUzTwfSbCAtqi5S6pi2k7t5Wmz4wtHBQboNn+l g6T0TubKjADaq5z94bzdBhYMRf+gFWgX3zo4XbZQV19Y60dbaNz57H0gcZkuKKOjWcTW YkAi9IVo1I+Ua20zgavCibKRDK84deY8RhKEm/yk8Zz3svjUKr48dqp+nDVu6gFsLGaM CbtCao+b6/NX1HQpekOdi548tyiyX3O9mYHBKQ3Ka11HF6wSwl14R8y8za/pEzH0KBXv bziQ== X-Gm-Message-State: AOAM532rnAoPWoZ0cQ/HzXc/ic5IWa69N5/9XTUA9hPPsIn4I6FJm3Fr pN/fGhAcAU8P0Z2OifnlqeNrmeIxYcRPYg== X-Google-Smtp-Source: ABdhPJyBNyGF3TWVG36UrPRrtS0Sxfq6bTB6EHagUosg8Exy/TZmmspeKFvdemwufa2773HDXhaApg== X-Received: by 2002:a05:600c:22c9:: with SMTP id 9mr33335538wmg.85.1620218019230; Wed, 05 May 2021 05:33:39 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id q16sm5858755wmj.24.2021.05.05.05.33.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 May 2021 05:33:38 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH 3/5] streaming.c: remove {open,close,read}_method_decl() macros Date: Wed, 5 May 2021 14:33:30 +0200 Message-Id: X-Mailer: git-send-email 2.31.1.838.g7ac6e98bb53 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Remove the {open,close,read}_method_decl() macros added in 46bf043807c (streaming: a new API to read from the object store, 2011-05-11) in favor of inlining the definition of the arguments of these functions. Since we'll end up using them via the "{open,close,read}_istream_fn" types we don't gain anything in the way of compiler checking by using these macros, and as of preceding commits we no longer need to declare these argument lists twice. So declaring them at a distance just serves to make the code less readable. Signed-off-by: Ævar Arnfjörð Bjarmason --- streaming.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/streaming.c b/streaming.c index 628369519b9..7e039df388b 100644 --- a/streaming.c +++ b/streaming.c @@ -21,20 +21,6 @@ struct stream_vtbl { read_istream_fn read; }; -#define open_method_decl(name) \ - int open_istream_ ##name \ - (struct git_istream *st, struct repository *r, \ - struct object_info *oi, const struct object_id *oid, \ - enum object_type *type) - -#define close_method_decl(name) \ - int close_istream_ ##name \ - (struct git_istream *st) - -#define read_method_decl(name) \ - ssize_t read_istream_ ##name \ - (struct git_istream *st, char *buf, size_t sz) - #define FILTER_BUFFER (1024*16) struct filtered_istream { @@ -95,13 +81,14 @@ static void close_deflated_stream(struct git_istream *st) * *****************************************************************/ -static close_method_decl(filtered) +static int close_istream_filtered(struct git_istream *st) { free_stream_filter(st->u.filtered.filter); return close_istream(st->u.filtered.upstream); } -static read_method_decl(filtered) +static ssize_t read_istream_filtered(struct git_istream *st, char *buf, + size_t sz) { struct filtered_istream *fs = &(st->u.filtered); size_t filled = 0; @@ -187,7 +174,7 @@ static struct git_istream *attach_stream_filter(struct git_istream *st, * *****************************************************************/ -static read_method_decl(loose) +static ssize_t read_istream_loose(struct git_istream *st, char *buf, size_t sz) { size_t total_read = 0; @@ -232,7 +219,7 @@ static read_method_decl(loose) return total_read; } -static close_method_decl(loose) +static int close_istream_loose(struct git_istream *st) { close_deflated_stream(st); munmap(st->u.loose.mapped, st->u.loose.mapsize); @@ -244,7 +231,10 @@ static struct stream_vtbl loose_vtbl = { read_istream_loose, }; -static open_method_decl(loose) +static int open_istream_loose(struct git_istream *st, struct repository *r, + struct object_info *oi, + const struct object_id *oid, + enum object_type *type) { st->u.loose.mapped = map_loose_object(r, oid, &st->u.loose.mapsize); if (!st->u.loose.mapped) @@ -275,7 +265,8 @@ static open_method_decl(loose) * *****************************************************************/ -static read_method_decl(pack_non_delta) +static ssize_t read_istream_pack_non_delta(struct git_istream *st, char *buf, + size_t sz) { size_t total_read = 0; @@ -333,7 +324,7 @@ static read_method_decl(pack_non_delta) return total_read; } -static close_method_decl(pack_non_delta) +static int close_istream_pack_non_delta(struct git_istream *st) { close_deflated_stream(st); return 0; @@ -344,7 +335,11 @@ static struct stream_vtbl pack_non_delta_vtbl = { read_istream_pack_non_delta, }; -static open_method_decl(pack_non_delta) +static int open_istream_pack_non_delta(struct git_istream *st, + struct repository *r, + struct object_info *oi, + const struct object_id *oid, + enum object_type *type) { struct pack_window *window; enum object_type in_pack_type; @@ -379,13 +374,13 @@ static open_method_decl(pack_non_delta) * *****************************************************************/ -static close_method_decl(incore) +static int close_istream_incore(struct git_istream *st) { free(st->u.incore.buf); return 0; } -static read_method_decl(incore) +static ssize_t read_istream_incore(struct git_istream *st, char *buf, size_t sz) { size_t read_size = sz; size_t remainder = st->size - st->u.incore.read_ptr; @@ -404,7 +399,9 @@ static struct stream_vtbl incore_vtbl = { read_istream_incore, }; -static open_method_decl(incore) +static int open_istream_incore(struct git_istream *st, struct repository *r, + struct object_info *oi, const struct object_id *oid, + enum object_type *type) { st->u.incore.buf = read_object_file_extended(r, oid, type, &st->size, 0); st->u.incore.read_ptr = 0; From patchwork Wed May 5 12:33:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12239891 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6BC69C433B4 for ; Wed, 5 May 2021 12:33:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EC8B7613AA for ; Wed, 5 May 2021 12:33:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233400AbhEEMeo (ORCPT ); Wed, 5 May 2021 08:34:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233155AbhEEMej (ORCPT ); Wed, 5 May 2021 08:34:39 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D41DAC06174A for ; Wed, 5 May 2021 05:33:41 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id a4so1658025wrr.2 for ; Wed, 05 May 2021 05:33:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZfGO7RIJIAYOuLDD8giuOt3vjmla9SsBk2AKjeg9+CQ=; b=vR+h+lknHXetk/XTE5Whh5U+AG8iKWzx8jULqe9eqg09DNMlr682IvBJLyqilDGeSi JkViOgN5YcarpwNR4ePQ5SuYxrmQ1sgQD1hiEpo6GE9DOh0Vwgaj6Tca8EfCpqV1kF2W 7lijs7rvsuYtDHy2DqGK5VOEfb/JfFxb13krp6tKpmHAvF5BfrhluWXcHsB0KeTzd7jO GlFHBrZ4QARsPSV+TpiDnECaXU6rfH31OQtNEQAhwsnubLMswq6P/Mh0ncdfBgFtGWsz J/aics37CakGeo68HY91qydJLVzyiOpMEiVo/LRzgX8jl2JEFdbM+zfLlJBv1DLsFshi JQLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZfGO7RIJIAYOuLDD8giuOt3vjmla9SsBk2AKjeg9+CQ=; b=CDafI8FEYBX5tAl7Ac70NOhSgxDKlaNBta1uu6PaHSTC6RbX2ebqFq0rJ8+siNWod3 RLI2gkgTGjCV9oAvU3Bs1gEKEBRrqjntsYThiyuYZySKlGNl5fcBJsKFpMWZkmpWxTxe DrchLobXOd9hNuSbp+vClhSwv9kgUjK0j/b3mURijx/0eXIPH38VH/xbUmocLmfcsEtM Zz4W3qlbgG9QF5EwxxiVa/E/UGkpesiI27fZ0qxercH3XIftDN+2oqkuCrqw4pUKG/k3 K/PFyY33F7xgllBf//QtZHKL8OFTKGFrwdvDkq9XZHye2fS2yQlPiYH172HVceOgMmUP xmTA== X-Gm-Message-State: AOAM533PLMC0tfs2x8Qfr4uXJsfdw0sLv1iL8ClBkJgqMTSOhf+8CrzK T+m4B1vVgygO+nGHCVq79pET1GvXsEJnzw== X-Google-Smtp-Source: ABdhPJxwYr9wGZXZbXZsg9oIbJzGgkTE5udjei7mfTesAEupGg51ja8m3RWgl45GKi8adZm1snkLbA== X-Received: by 2002:a5d:58d8:: with SMTP id o24mr38785141wrf.288.1620218020364; Wed, 05 May 2021 05:33:40 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id q16sm5858755wmj.24.2021.05.05.05.33.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 May 2021 05:33:39 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH 4/5] streaming.c: stop passing around "object_info *" to open() Date: Wed, 5 May 2021 14:33:31 +0200 Message-Id: X-Mailer: git-send-email 2.31.1.838.g7ac6e98bb53 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Change the streaming interface to stop passing around the "struct object_info" the open() functions. As seen in 7ef2d9a2604 (streaming: read non-delta incrementally from a pack, 2011-05-13) which introduced the "st->u.in_pack" assignments being changed here only the open_istream_pack_non_delta() path need these. So let's instead do this when preparing the selected callback in the istream_source() function. This might also allow the compiler to reduce the lifetime of the "oi" variable, as we've moved it from "git_istream()" to "istream_source()". Signed-off-by: Ævar Arnfjörð Bjarmason --- streaming.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/streaming.c b/streaming.c index 7e039df388b..f6059ee828e 100644 --- a/streaming.c +++ b/streaming.c @@ -10,7 +10,6 @@ typedef int (*open_istream_fn)(struct git_istream *, struct repository *, - struct object_info *, const struct object_id *, enum object_type *); typedef int (*close_istream_fn)(struct git_istream *); @@ -232,7 +231,6 @@ static struct stream_vtbl loose_vtbl = { }; static int open_istream_loose(struct git_istream *st, struct repository *r, - struct object_info *oi, const struct object_id *oid, enum object_type *type) { @@ -337,15 +335,12 @@ static struct stream_vtbl pack_non_delta_vtbl = { static int open_istream_pack_non_delta(struct git_istream *st, struct repository *r, - struct object_info *oi, const struct object_id *oid, enum object_type *type) { struct pack_window *window; enum object_type in_pack_type; - st->u.in_pack.pack = oi->u.packed.pack; - st->u.in_pack.pos = oi->u.packed.offset; window = NULL; in_pack_type = unpack_object_header(st->u.in_pack.pack, @@ -400,8 +395,7 @@ static struct stream_vtbl incore_vtbl = { }; static int open_istream_incore(struct git_istream *st, struct repository *r, - struct object_info *oi, const struct object_id *oid, - enum object_type *type) + const struct object_id *oid, enum object_type *type) { st->u.incore.buf = read_object_file_extended(r, oid, type, &st->size, 0); st->u.incore.read_ptr = 0; @@ -414,26 +408,30 @@ static int open_istream_incore(struct git_istream *st, struct repository *r, * static helpers variables and functions for users of streaming interface *****************************************************************************/ -static open_istream_fn istream_source(struct repository *r, +static open_istream_fn istream_source(struct git_istream *st, + struct repository *r, const struct object_id *oid, - enum object_type *type, - struct object_info *oi) + enum object_type *type) { unsigned long size; int status; + struct object_info oi = OBJECT_INFO_INIT; - oi->typep = type; - oi->sizep = &size; - status = oid_object_info_extended(r, oid, oi, 0); + oi.typep = type; + oi.sizep = &size; + status = oid_object_info_extended(r, oid, &oi, 0); if (status < 0) return NULL; - switch (oi->whence) { + switch (oi.whence) { case OI_LOOSE: return open_istream_loose; case OI_PACKED: - if (!oi->u.packed.is_delta && big_file_threshold < size) + if (!oi.u.packed.is_delta && big_file_threshold < size) { + st->u.in_pack.pack = oi.u.packed.pack; + st->u.in_pack.pos = oi.u.packed.offset; return open_istream_pack_non_delta; + } /* fallthru */ default: return open_istream_incore; @@ -462,17 +460,17 @@ struct git_istream *open_istream(struct repository *r, unsigned long *size, struct stream_filter *filter) { - struct git_istream *st; - struct object_info oi = OBJECT_INFO_INIT; + struct git_istream *st = xmalloc(sizeof(*st)); const struct object_id *real = lookup_replace_object(r, oid); - open_istream_fn open_fn = istream_source(r, real, type, &oi); + open_istream_fn open_fn = istream_source(st, r, real, type); - if (!open_fn) + if (!open_fn) { + free(st); return NULL; + } - st = xmalloc(sizeof(*st)); - if (open_fn(st, r, &oi, real, type)) { - if (open_istream_incore(st, r, &oi, real, type)) { + if (open_fn(st, r, real, type)) { + if (open_istream_incore(st, r, real, type)) { free(st); return NULL; } From patchwork Wed May 5 12:33:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= X-Patchwork-Id: 12239889 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EFCBEC43462 for ; Wed, 5 May 2021 12:33:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CB8C6613BE for ; Wed, 5 May 2021 12:33:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233418AbhEEMen (ORCPT ); Wed, 5 May 2021 08:34:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40248 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233399AbhEEMej (ORCPT ); Wed, 5 May 2021 08:34:39 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBE56C061574 for ; Wed, 5 May 2021 05:33:42 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id d4so1641180wru.7 for ; Wed, 05 May 2021 05:33:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ek6G0MydXgGdu/+TAt33SAdsI0PRSiHLVrE+3DvM2pI=; b=UChTKcBRuYGd0MjyUBFvsQrjVnnpSHMjII9Wdcq4Q6B4yajRmIX/7YJNYiUkIZ/ntA KB9lpCAweebXkowdfniUlG4f6BYqltNjCTDWvsPUqZcaTkDySGYp6XYQurKJ+AxxYfNM N3xS0KbblI5uQl9fjegCFVpYKl+Ui+8txR2v4bdf0bqfWHH17VXwIRMl114zPZ4yGrLn /h/UKn+qOivVLNg4KIB4beLrZAUbiBtJpo2Fd0q/liL35jRz6Xq5lOepKSUbw1UcWeG9 tFNsOKIyhM+L7u3OKYYClyE5C2zqtbf0zLZ9LpM7S4+3KnO6sOcPesl6ow/IjJTAINDG /+oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Ek6G0MydXgGdu/+TAt33SAdsI0PRSiHLVrE+3DvM2pI=; b=e+6/xDmTQk8a0zkcW5pMJ3zeyUX+tObDw1C4DeEUvqsc7UaogDxiolPW+cXfCZGviP gnPJHfrz1RkG7zfYIKCo+TBr3y/23E9DU3zjiviWYnLcVBfR1ED3WWAttrj4iPM7BRUP FT5ww6w5NwUe1xaIJNtcZQ5aycvC1iRGR8Wu86yylVJ1TlpC3o7gQ67jqXJhMcXioy+D TmDlB6l1/QfwwhBfbZCqylF05TUH3DSaDt5nF00pufbxVIu4JqEpaE5RF+eTfux7V2vP g/ze+81LSQ9bhCdgp96yiAo08ZP7svM2tFcHmx0Nfd2O/ONb+HB5Uu9jg81i9lpBWx1K gXyQ== X-Gm-Message-State: AOAM530SFLjUXX9C1AAi9rhv+9T9DjJB0BDdwfPvDGlAP64sKXVROFdL 0IjhsD8gpp0JerLOz7aApZw5kJRyz8UtRg== X-Google-Smtp-Source: ABdhPJwg2tgEnpP9kiMKjeMHCVFpb39JjGDDc6AXxarbxm6/jyN2uV7yNDAT7CfSi5LcVOkyFgrYQg== X-Received: by 2002:a5d:6687:: with SMTP id l7mr38812181wru.235.1620218021135; Wed, 05 May 2021 05:33:41 -0700 (PDT) Received: from vm.nix.is (vm.nix.is. [2a01:4f8:120:2468::2]) by smtp.gmail.com with ESMTPSA id q16sm5858755wmj.24.2021.05.05.05.33.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 May 2021 05:33:40 -0700 (PDT) From: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= To: git@vger.kernel.org Cc: Junio C Hamano , Jeff King , =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsCBCamFybWFzb24=?= Subject: [PATCH 5/5] streaming.c: move {open,close,read} from vtable to "struct git_istream" Date: Wed, 5 May 2021 14:33:32 +0200 Message-Id: X-Mailer: git-send-email 2.31.1.838.g7ac6e98bb53 In-Reply-To: References: MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Move the definition of the structure around the open/close/read functions introduced in 46bf043807c (streaming: a new API to read from the object store, 2011-05-11) to instead populate "close" and "read" members in the "struct git_istream". This gets us rid of an extra pointer deference, and I think makes more sense. The "close" and "read" functions are the primary interface to the stream itself. Let's also populate a "open" callback in the same struct. That's now used by open_istream() after istream_source() decides what "open" function should be used. This isn't needed to get rid of the "stream_vtbl" variables, but makes sense for consistency. Signed-off-by: Ævar Arnfjörð Bjarmason --- streaming.c | 72 +++++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/streaming.c b/streaming.c index f6059ee828e..5f480ad50c4 100644 --- a/streaming.c +++ b/streaming.c @@ -15,11 +15,6 @@ typedef int (*open_istream_fn)(struct git_istream *, typedef int (*close_istream_fn)(struct git_istream *); typedef ssize_t (*read_istream_fn)(struct git_istream *, char *, size_t); -struct stream_vtbl { - close_istream_fn close; - read_istream_fn read; -}; - #define FILTER_BUFFER (1024*16) struct filtered_istream { @@ -33,7 +28,10 @@ struct filtered_istream { }; struct git_istream { - const struct stream_vtbl *vtbl; + open_istream_fn open; + close_istream_fn close; + read_istream_fn read; + unsigned long size; /* inflated size of full object */ git_zstream z; enum { z_unused, z_used, z_done, z_error } z_state; @@ -146,18 +144,14 @@ static ssize_t read_istream_filtered(struct git_istream *st, char *buf, return filled; } -static struct stream_vtbl filtered_vtbl = { - close_istream_filtered, - read_istream_filtered, -}; - static struct git_istream *attach_stream_filter(struct git_istream *st, struct stream_filter *filter) { struct git_istream *ifs = xmalloc(sizeof(*ifs)); struct filtered_istream *fs = &(ifs->u.filtered); - ifs->vtbl = &filtered_vtbl; + ifs->close = close_istream_filtered; + ifs->read = read_istream_filtered; fs->upstream = st; fs->filter = filter; fs->i_end = fs->i_ptr = 0; @@ -225,11 +219,6 @@ static int close_istream_loose(struct git_istream *st) return 0; } -static struct stream_vtbl loose_vtbl = { - close_istream_loose, - read_istream_loose, -}; - static int open_istream_loose(struct git_istream *st, struct repository *r, const struct object_id *oid, enum object_type *type) @@ -251,8 +240,9 @@ static int open_istream_loose(struct git_istream *st, struct repository *r, st->u.loose.hdr_used = strlen(st->u.loose.hdr) + 1; st->u.loose.hdr_avail = st->z.total_out; st->z_state = z_used; + st->close = close_istream_loose; + st->read = read_istream_loose; - st->vtbl = &loose_vtbl; return 0; } @@ -328,11 +318,6 @@ static int close_istream_pack_non_delta(struct git_istream *st) return 0; } -static struct stream_vtbl pack_non_delta_vtbl = { - close_istream_pack_non_delta, - read_istream_pack_non_delta, -}; - static int open_istream_pack_non_delta(struct git_istream *st, struct repository *r, const struct object_id *oid, @@ -358,7 +343,9 @@ static int open_istream_pack_non_delta(struct git_istream *st, break; } st->z_state = z_unused; - st->vtbl = &pack_non_delta_vtbl; + st->close = close_istream_pack_non_delta; + st->read = read_istream_pack_non_delta; + return 0; } @@ -389,17 +376,13 @@ static ssize_t read_istream_incore(struct git_istream *st, char *buf, size_t sz) return read_size; } -static struct stream_vtbl incore_vtbl = { - close_istream_incore, - read_istream_incore, -}; - static int open_istream_incore(struct git_istream *st, struct repository *r, const struct object_id *oid, enum object_type *type) { st->u.incore.buf = read_object_file_extended(r, oid, type, &st->size, 0); st->u.incore.read_ptr = 0; - st->vtbl = &incore_vtbl; + st->close = close_istream_incore; + st->read = read_istream_incore; return st->u.incore.buf ? 0 : -1; } @@ -408,10 +391,10 @@ static int open_istream_incore(struct git_istream *st, struct repository *r, * static helpers variables and functions for users of streaming interface *****************************************************************************/ -static open_istream_fn istream_source(struct git_istream *st, - struct repository *r, - const struct object_id *oid, - enum object_type *type) +static int istream_source(struct git_istream *st, + struct repository *r, + const struct object_id *oid, + enum object_type *type) { unsigned long size; int status; @@ -421,20 +404,23 @@ static open_istream_fn istream_source(struct git_istream *st, oi.sizep = &size; status = oid_object_info_extended(r, oid, &oi, 0); if (status < 0) - return NULL; + return status; switch (oi.whence) { case OI_LOOSE: - return open_istream_loose; + st->open = open_istream_loose; + return 0; case OI_PACKED: if (!oi.u.packed.is_delta && big_file_threshold < size) { st->u.in_pack.pack = oi.u.packed.pack; st->u.in_pack.pos = oi.u.packed.offset; - return open_istream_pack_non_delta; + st->open = open_istream_pack_non_delta; + return 0; } /* fallthru */ default: - return open_istream_incore; + st->open = open_istream_incore; + return 0; } } @@ -444,14 +430,14 @@ static open_istream_fn istream_source(struct git_istream *st, int close_istream(struct git_istream *st) { - int r = st->vtbl->close(st); + int r = st->close(st); free(st); return r; } ssize_t read_istream(struct git_istream *st, void *buf, size_t sz) { - return st->vtbl->read(st, buf, sz); + return st->read(st, buf, sz); } struct git_istream *open_istream(struct repository *r, @@ -462,14 +448,14 @@ struct git_istream *open_istream(struct repository *r, { struct git_istream *st = xmalloc(sizeof(*st)); const struct object_id *real = lookup_replace_object(r, oid); - open_istream_fn open_fn = istream_source(st, r, real, type); + int ret = istream_source(st, r, real, type); - if (!open_fn) { + if (ret) { free(st); return NULL; } - if (open_fn(st, r, real, type)) { + if (st->open(st, r, real, type)) { if (open_istream_incore(st, r, real, type)) { free(st); return NULL;