Johannes Schindelin <johannes.schindelin@xxxxxx> writes: > +#ifdef SHA1_DC_AND_OPENSSL > +void (*SHA1_Init_func)(SHA_CTX_union *ctx) = (void *)SHA1DCInit; > +void (*SHA1_Update_func)(SHA_CTX_union *ctx, const void *pointer, size_t size) = > + (void *)git_SHA1DCUpdate; > +int (*SHA1_Final_func)(unsigned char sha1[20], SHA_CTX_union *ctx) = > + (void *)git_SHA1DCFinal; > + > +void toggle_sha1dc(int enable) > +{ > + if (enable) { > + SHA1_Init_func = (void *)SHA1DCInit; > + SHA1_Update_func = (void *)git_SHA1DCUpdate; > + SHA1_Final_func = (void *)git_SHA1DCFinal; > + } else { > + SHA1_Init_func = (void *)SHA1_Init; > + SHA1_Update_func = (void *)SHA1_Update; > + SHA1_Final_func = (void *)SHA1_Final; > + } > +} > +#endif As I understand that this is a demonstration series, the approach above is OK as an expedite way to illustrate one way how run-time switching could be done. The approach however is not very thread friendly, though. > diff --git a/sha1dc/sha1.h b/sha1dc/sha1.h > index bd8bd928fb3..243c2fe0b6b 100644 > --- a/sha1dc/sha1.h > +++ b/sha1dc/sha1.h > @@ -110,10 +110,26 @@ void git_SHA1DCFinal(unsigned char [20], SHA1_CTX *); > */ > void git_SHA1DCUpdate(SHA1_CTX *ctx, const void *data, unsigned long len); > > +#ifdef SHA1_DC_AND_OPENSSL > +extern void toggle_sha1dc(int enable); > + > +typedef union { > + SHA1_CTX dc; > + SHA_CTX openssl; > +} SHA_CTX_union; The use of union is a good ingredient for a solution. I would have chosen to do this slightly differently if I were doing it. typedef struct { int safe; union { SHA1_CTX_SAFE safe; SHA1_CTX_FAST fast; } u; } git_SHA_CTX; void git_SHA1_Init(git_SHA_CTX *ctx, int safe); void git_SHA1_Update(git_SHA_CTX *ctx, const void *, unsigned long); git_SHA1_Final(uchar [20], git_SHA_CTX *ctx); where SHA1_CTX_FAST may be chosen from the Makefile just like we currently choose platform_SHA_CTX. SHA1_CTX_SAFE could also be made configurable but it may be OK to hardcode it to refer to SHA1_CTX of DC's. As you already know, I am assuming that each codepath pretty much knows if it needs safe or fast one (e.g. the one used in csum-file.c knows it does not have to), so each git_SHA_CTX is told which one to use when it gets initialized.