From 7962f5d6210a2059b4a0d34412dbc908de213977 Mon Sep 17 00:00:00 2001 From: glasser Date: Sun, 20 Apr 2008 20:23:38 +0000 Subject: [PATCH] Minor unbenchmarked optimization to svnserve: use a hash for commands instead of looping over a list of 28 commands every time. * subversion/libsvn_ra_svn/marshal.c (svn_ra_svn_handle_commands): Put command list into a hash. Adjust some pool usage to match. git-svn-id: http://svn.collab.net/repos/svn/trunk@30722 612f8ebc-c883-4be0-9ee0-a4e9ef946e3a --- subversion/libsvn_ra_svn/marshal.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/subversion/libsvn_ra_svn/marshal.c b/subversion/libsvn_ra_svn/marshal.c index 8ac13adae..e01ebe845 100644 --- a/subversion/libsvn_ra_svn/marshal.c +++ b/subversion/libsvn_ra_svn/marshal.c @@ -883,22 +883,24 @@ svn_error_t *svn_ra_svn_handle_commands(svn_ra_svn_conn_t *conn, void *baton) { apr_pool_t *subpool = svn_pool_create(pool); + apr_pool_t *iterpool = svn_pool_create(subpool); const char *cmdname; - int i; + const svn_ra_svn_cmd_entry_t *command; svn_error_t *err, *write_err; apr_array_header_t *params; + apr_hash_t *cmd_hash = apr_hash_make(subpool); + + for (command = commands; command->cmdname; command++) + apr_hash_set(cmd_hash, command->cmdname, APR_HASH_KEY_STRING, command); while (1) { - svn_pool_clear(subpool); - SVN_ERR(svn_ra_svn_read_tuple(conn, subpool, "wl", &cmdname, ¶ms)); - for (i = 0; commands[i].cmdname; i++) - { - if (strcmp(cmdname, commands[i].cmdname) == 0) - break; - } - if (commands[i].cmdname) - err = (*commands[i].handler)(conn, subpool, params, baton); + svn_pool_clear(iterpool); + SVN_ERR(svn_ra_svn_read_tuple(conn, iterpool, "wl", &cmdname, ¶ms)); + command = apr_hash_get(cmd_hash, cmdname, APR_HASH_KEY_STRING); + + if (command) + err = (*command->handler)(conn, iterpool, params, baton); else { err = svn_error_createf(SVN_ERR_RA_SVN_UNKNOWN_CMD, NULL, @@ -908,7 +910,7 @@ svn_error_t *svn_ra_svn_handle_commands(svn_ra_svn_conn_t *conn, if (err && err->apr_err == SVN_ERR_RA_SVN_CMD_ERR) { - write_err = svn_ra_svn_write_cmd_failure(conn, subpool, err->child); + write_err = svn_ra_svn_write_cmd_failure(conn, iterpool, err->child); svn_error_clear(err); if (write_err) return write_err; @@ -916,9 +918,10 @@ svn_error_t *svn_ra_svn_handle_commands(svn_ra_svn_conn_t *conn, else if (err) return err; - if (commands[i].terminate) + if (command && command->terminate) break; } + svn_pool_destroy(iterpool); svn_pool_destroy(subpool); return SVN_NO_ERROR; } -- 2.11.4.GIT