Index: src/shared/srpc/nacl_srpc.h |
=================================================================== |
--- src/shared/srpc/nacl_srpc.h (revision 3898) |
+++ src/shared/srpc/nacl_srpc.h (working copy) |
@@ -127,140 +127,79 @@ |
NACL_SRPC_ARG_TYPE_VARIANT_ARRAY = 'A' /**< array of NaClSrpcArg structs */ |
}; |
-/** |
- * Argument data type for passing arrays of NaClSrpcArg. |
- */ |
-struct NaClSrpcVariantArray { |
- /** The number of elements in the array */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> NaClSrpcArg structures */ |
- struct NaClSrpcArg *varr; |
-}; |
- |
-/** |
- * Argument data type for passing arrays of char. |
- * @see NaClSrpcArg |
- */ |
-struct NaClSrpcCharArray { |
- /** The number of characters in the array */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> characters */ |
- char *carr; |
-}; |
- |
-/** |
- * Argument data type for passing arrays of double. |
- * @see NaClSrpcArg |
- */ |
-struct NaClSrpcDoubleArray { |
- /** The number of doubles in the array */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> doubles */ |
- double *darr; |
-}; |
- |
-/** |
- * Argument data type for passing arrays of int32_t. |
- * @see NaClSrpcArg |
- */ |
-struct NaClSrpcIntArray { |
- /** The number of integers in the array */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> int32_t */ |
- int32_t *iarr; |
-}; |
- |
-/** |
- * Argument data type for passing arrays of int64_t. |
- * @see NaClSrpcArg |
- */ |
-struct NaClSrpcLongArray { |
- /** The number of doubles in the array */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> int64_t */ |
- int64_t *larr; |
-}; |
- |
-/** |
- * Argument data type for passing character strings. |
- * @see NaClSrpcArg |
- */ |
-struct NaClSrpcString { |
- /** The number of characters in the string. |
- * (Only guaranteed to be valid during serialization.) |
- */ |
- nacl_abi_size_t count; |
- /** A chunk of memory containing <code>count</code> char */ |
- char *str; |
-}; |
- |
#ifdef __cplusplus |
namespace nacl_srpc { |
class ScriptableHandleBase; |
} |
#endif |
+#define NACL_SRPC_ARG_SERIALIZED_FIELDS \ |
+ /** \ |
+ * Determines which type this argument contains. Its value determines \ |
+ * which element of union <code>u</code> may be validly referred to. \ |
+ */ \ |
+ enum NaClSrpcArgType tag; \ |
+ /** \ |
+ * Padding (unused) to ensure 8-byte alignment of the union u. \ |
+ */ \ |
+ uint32_t reserved_pad; \ |
+ /* \ |
+ * For efficiency, doubles should be 8-byte aligned so that \ |
+ * loading them would require a single bus cycle, and arrays of \ |
+ * NaClSrpcArgs will have to be 8-byte aligned as well, so it's \ |
+ * either a 4 byte padding between the tag and the union or \ |
+ * (implicitly) at the end. gcc does not (by default) enforce \ |
+ * 8-byte alignment but visual studio does, so we explicitly pad \ |
+ * so that both compilers will use the same memory layout, even if \ |
+ * the gcc -malign-double flag were omitted. \ |
+ */ \ |
+ /** \ |
+ * A union containing the value of the argument. The element containing \ |
+ * the valid data is determined by <code>tag</code>. \ |
+ */ \ |
+ union { \ |
+ /** A boolean scalar value */ \ |
+ int bval; \ |
+ /** An array size (count) value */ \ |
+ nacl_abi_size_t count; \ |
+ /** A double-precision floating point scalar value */ \ |
+ double dval; \ |
+ /** A handle used to pass descriptors */ \ |
+ NaClSrpcImcDescType hval; \ |
+ /** An integer scalar value */ \ |
+ int32_t ival; \ |
+ /** A int64_t scalar value */ \ |
+ int64_t lval; \ |
+ /** An object value that can be exported to the browser as is */ \ |
+ } u |
+ |
/** |
* Used to convey parameters to and from RPC invocations. It is a variant |
* type, with the <code>tag</code> telling whether to treat the parameter as |
* a bool or an array of characters, etc. |
*/ |
struct NaClSrpcArg { |
- /** |
- * Determines which type this argument contains. Its value determines |
- * which element of union <code>u</code> may be validly referred to. |
- */ |
- enum NaClSrpcArgType tag; |
- /** |
- * Padding (unused) to ensure 8-byte alignment of the union u. |
- */ |
- uint32_t reserved_pad; |
- /* |
- * For efficiency, doubles should be 8-byte aligned so that |
- * loading them would require a single bus cycle, and arrays of |
- * NaClSrpcArgs will have to be 8-byte aligned as well, so it's |
- * either a 4 byte padding between the tag and the union or |
- * (implicitly) at the end. gcc does not (by default) enforce |
- * 8-byte alignment but visual studio does, so we explicitly pad |
- * so that both compilers will use the same memory layout, even if |
- * the gcc -malign-double flag were omitted. |
- */ |
- /** |
- * A union containing the value of the argument. The element containing |
- * the valid data is determined by <code>tag</code>. |
- */ |
+ /* Data that is serialized for a value or template, regardless of type. */ |
+ NACL_SRPC_ARG_SERIALIZED_FIELDS; |
+ /* Data that used to represent an array value, but is not serialized. */ |
union { |
- /** A boolean value */ |
- int bval; |
- /** An integer value */ |
- int32_t ival; |
- /** A int64_t value */ |
- int64_t lval; |
- /** A double-precision floating point value */ |
- double dval; |
- /** An array of character values */ |
- struct NaClSrpcCharArray caval; |
- /** An array of double-precision floating point values */ |
- struct NaClSrpcDoubleArray daval; |
- /** An array of int32_t values */ |
- struct NaClSrpcIntArray iaval; |
- /** An array of int64_t values */ |
- struct NaClSrpcLongArray laval; |
- /** A string value */ |
- struct NaClSrpcString sval; |
- /** A handle used to pass descriptors */ |
- NaClSrpcImcDescType hval; |
- /** An object value that can be exported to the browser as is */ |
- /** This field is only used with predeclared methods, never for |
- * communicating with nexes. TODO(polina): where can one assert for this? |
- * This usually points to an object scriptable by |
- * the browser, i.e. NPAPI's NPObject or PPAPI's ScriptableObject. |
- * Declaring it as void* to avoid including browser specific stuff here. |
+ char *carr; |
+ double *darr; |
+ int32_t *iarr; |
+ int64_t *larr; |
+ /** This field is ordinarily used with predeclared methods, and is never |
+ * used directly for communicating with nexes. It usually points to an |
+ * object scriptable by the browser, i.e. NPAPI's NPObject or PPAPI's |
+ * ScriptableObject. Declaring it as void* to avoid including browser |
+ * specific types here. |
+ * TODO(polina): where can one assert for this? |
+ * Also, as these pointers are overlaid, oval is used in array object |
+ * serialization to avoid repeated type checks. |
*/ |
- void *oval; |
- /** An array of variant type values. @see NaClSrpcArg */ |
- struct NaClSrpcVariantArray vaval; |
- } u; |
+ void *oval; |
+ char *str; |
+ struct NaClSrpcArg *varr; |
+ } arrays; |
}; |
/** |
@@ -268,15 +207,19 @@ |
*/ |
typedef struct NaClSrpcArg NaClSrpcArg; |
+#define NACL_SRPC_RPC_SERIALIZED_FIELDS \ |
+ uint32_t protocol_version; \ |
+ uint64_t request_id; \ |
+ uint8_t is_request; \ |
+ uint32_t rpc_number; \ |
+ NaClSrpcError result \ |
+ |
/** |
* Remote procedure call state structure. |
*/ |
struct NaClSrpcRpc { |
- uint32_t protocol_version; |
- uint64_t request_id; |
- uint8_t is_request; |
- uint32_t rpc_number; |
- NaClSrpcError result; |
+ /* State that is serialized. */ |
+ NACL_SRPC_RPC_SERIALIZED_FIELDS; |
/* State maintained for transmission/reception, but not serialized */ |
struct NaClSrpcChannel* channel; |
const char* ret_types; |