# HG changeset patch # User Josef 'Jeff' Sipek # Date 1445198021 14400 # Node ID 2a8c2cf486743595d091bde440be8f13d8b28bb0 # Parent 3bf63abd5bd9c0d0fdad3344d5f2e688eeaac7cd common: XDR nvclock code needs to allocate an nvclock at times Since we're always dealing with nvclocks as pointers, we need to deal with them as double-pointers here. This allows us to properly allocate a new nvclock during a decode operation. Signed-off-by: Josef 'Jeff' Sipek diff -r 3bf63abd5bd9 -r 2a8c2cf48674 src/common/include/nomad/vclock.h --- a/src/common/include/nomad/vclock.h Sun Oct 18 15:50:48 2015 -0400 +++ b/src/common/include/nomad/vclock.h Sun Oct 18 15:53:41 2015 -0400 @@ -62,6 +62,6 @@ extern int nvclock_set(struct nvclock *clock, uint64_t seq); extern int nvclock_inc(struct nvclock *clock); -extern bool_t xdr_nvclock(XDR *xdrs, struct nvclock *clock); +extern bool_t xdr_nvclock(XDR *xdrs, struct nvclock **clock); #endif diff -r 3bf63abd5bd9 -r 2a8c2cf48674 src/common/oid.c --- a/src/common/oid.c Sun Oct 18 15:50:48 2015 -0400 +++ b/src/common/oid.c Sun Oct 18 15:53:41 2015 -0400 @@ -57,7 +57,7 @@ { if (!xdr_noid(xdrs, &hndl->oid)) return FALSE; - if (!xdr_nvclock(xdrs, hndl->clock)) + if (!xdr_nvclock(xdrs, &hndl->clock)) return FALSE; return TRUE; } diff -r 3bf63abd5bd9 -r 2a8c2cf48674 src/common/vclock.c --- a/src/common/vclock.c Sun Oct 18 15:50:48 2015 -0400 +++ b/src/common/vclock.c Sun Oct 18 15:53:41 2015 -0400 @@ -412,21 +412,54 @@ return 0xbad; /* pacify gcc */ } -bool_t xdr_nvclock(XDR *xdrs, struct nvclock *clock) +bool_t xdr_nvclock(XDR *xdrs, struct nvclock **arg) { + bool shouldfree = false; + struct nvclock dummy; + struct nvclock *clock; int i; + clock = *arg; + if (xdrs->x_op == XDR_FREE) { nvclock_free(clock); return TRUE; } + /* + * If we don't have clock... + */ + if (!clock && (xdrs->x_op == XDR_ENCODE)) { + /* + * ...send one filled with zeros. + */ + memset(&dummy, 0, sizeof(struct nvclock)); + clock = &dummy; + } else if (!clock && (xdrs->x_op == XDR_DECODE)) { + /* + * ...recieve into a newly allocated one. + */ + clock = nvclock_alloc(); + if (!clock) + return FALSE; + *arg = clock; + shouldfree = true; + } + for (i = 0; i < NVCLOCK_NUM_NODES; i++) { if (!xdr_uint64_t(xdrs, &clock->ent[i].node)) - return FALSE; + goto err; if (!xdr_uint64_t(xdrs, &clock->ent[i].seq)) - return FALSE; + goto err; } return TRUE; + +err: + if (shouldfree) { + nvclock_free(clock); + *arg = NULL; + } + + return FALSE; }