Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: src/shared/srpc/rpc_serialize.c

Issue 5622003: Restructure the structs/unions involved in SRPC argument passing. This will... (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2008 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 /* 7 /*
8 * NaCl simple RPC over IMC mechanism. 8 * NaCl simple RPC over IMC mechanism.
9 */ 9 */
10 10
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 #define BASIC_TYPE_IO_DECLARE(name, impl_type, field, format) \ 344 #define BASIC_TYPE_IO_DECLARE(name, impl_type, field, format) \
345 static int name##Get(NaClSrpcImcBuffer* buffer, \ 345 static int name##Get(NaClSrpcImcBuffer* buffer, \
346 int allocate_memory, \ 346 int allocate_memory, \
347 int read_value, \ 347 int read_value, \
348 NaClSrpcArg* arg) { \ 348 NaClSrpcArg* arg) { \
349 UNREFERENCED_PARAMETER(allocate_memory); \ 349 UNREFERENCED_PARAMETER(allocate_memory); \
350 if (read_value && \ 350 if (read_value && \
351 1 != __NaClSrpcImcRead(buffer, \ 351 1 != __NaClSrpcImcRead(buffer, \
352 sizeof(impl_type), \ 352 sizeof(impl_type), \
353 1, \ 353 1, \
354 &arg->u.field)) { \ 354 &arg->field)) { \
355 return 0; \ 355 return 0; \
356 } \ 356 } \
357 return 1; \ 357 return 1; \
358 } \ 358 } \
359 \ 359 \
360 static int name##Put(const NaClSrpcArg* arg, \ 360 static int name##Put(const NaClSrpcArg* arg, \
361 int write_value, \ 361 int write_value, \
362 NaClSrpcImcBuffer* buffer) { \ 362 NaClSrpcImcBuffer* buffer) { \
363 if (write_value) { \ 363 if (write_value) { \
364 return 1 == __NaClSrpcImcWrite(&arg->u.field, \ 364 return 1 == __NaClSrpcImcWrite(&arg->field, \
365 sizeof(impl_type), \ 365 sizeof(impl_type), \
366 1, \ 366 1, \
367 buffer); \ 367 buffer); \
368 } \ 368 } \
369 return 1; \ 369 return 1; \
370 } \ 370 } \
371 \ 371 \
372 static void name##Print(const NaClSrpcArg* arg) { \ 372 static void name##Print(const NaClSrpcArg* arg) { \
373 dprintf(("%"format"", arg->u.field)); \ 373 dprintf(("%"format"", arg->field)); \
374 } \ 374 } \
375 \ 375 \
376 static uint32_t name##Length(const NaClSrpcArg* arg, \ 376 static uint32_t name##Length(const NaClSrpcArg* arg, \
377 int write_value, \ 377 int write_value, \
378 int* handles) { \ 378 int* handles) { \
379 UNREFERENCED_PARAMETER(arg); \ 379 UNREFERENCED_PARAMETER(arg); \
380 *handles = 0; \ 380 *handles = 0; \
381 if (write_value) { \ 381 if (write_value) { \
382 return sizeof(impl_type); \ 382 return sizeof(impl_type); \
383 } else { \ 383 } else { \
384 return 0; \ 384 return 0; \
385 } \ 385 } \
386 } \ 386 } \
387 \ 387 \
388 static void name##Free(NaClSrpcArg* arg) { \ 388 static void name##Free(NaClSrpcArg* arg) { \
389 UNREFERENCED_PARAMETER(arg); \ 389 UNREFERENCED_PARAMETER(arg); \
390 } \ 390 } \
391 \ 391 \
392 static const ArgEltInterface k##name##IoInterface = { \ 392 static const ArgEltInterface k##name##IoInterface = { \
393 name##Get, name##Put, name##Print, name##Length, name##Free \ 393 name##Get, name##Put, name##Print, name##Length, name##Free \
394 }; 394 };
395 395
396 /* 396 /*
397 * The basic parameter types. 397 * The basic parameter types.
398 */ 398 */
399 BASIC_TYPE_IO_DECLARE(Bool, char, bval, "1d") 399 BASIC_TYPE_IO_DECLARE(Bool, char, u.bval, "1d")
400 BASIC_TYPE_IO_DECLARE(Double, double, dval, "f") 400 BASIC_TYPE_IO_DECLARE(Double, double, u.dval, "f")
401 BASIC_TYPE_IO_DECLARE(Int, int32_t, ival, NACL_PRId32) 401 BASIC_TYPE_IO_DECLARE(Int, int32_t, u.ival, NACL_PRId32)
402 BASIC_TYPE_IO_DECLARE(Long, int64_t, lval, NACL_PRId64) 402 BASIC_TYPE_IO_DECLARE(Long, int64_t, u.lval, NACL_PRId64)
403 403
404 #define ARRAY_TYPE_IO_DECLARE(name, impl_type, field, array) \ 404 #define ARRAY_TYPE_IO_DECLARE(name, impl_type, array) \
405 static int name##ArrGet(NaClSrpcImcBuffer* buffer, \ 405 static int name##ArrGet(NaClSrpcImcBuffer* buffer, \
406 int allocate_memory, \ 406 int allocate_memory, \
407 int read_value, \ 407 int read_value, \
408 NaClSrpcArg* arg) { \ 408 NaClSrpcArg* arg) { \
409 nacl_abi_size_t dim; \ 409 nacl_abi_size_t dim; \
410 \ 410 \
411 if (1 != __NaClSrpcImcRead(buffer, sizeof(dim), 1, &dim)) { \ 411 if (1 != __NaClSrpcImcRead(buffer, sizeof(dim), 1, &dim)) { \
412 return 0; \ 412 return 0; \
413 } \ 413 } \
414 if (allocate_memory) { \ 414 if (allocate_memory) { \
415 if (dim >= NACL_ABI_SIZE_T_MAX / sizeof(*arg->u.field.array)) { \ 415 if (dim >= NACL_ABI_SIZE_T_MAX / sizeof(*arg->array)) { \
416 return 0; \ 416 return 0; \
417 } \ 417 } \
418 arg->u.field.array = \ 418 arg->array = \
419 (impl_type*) malloc(dim * sizeof(*arg->u.field.array)); \ 419 (impl_type*) malloc(dim * sizeof(*arg->array)); \
420 if (NULL == arg->u.field.array) { \ 420 if (NULL == arg->array) { \
421 return 0; \ 421 return 0; \
422 } \ 422 } \
423 arg->u.field.count = dim; \ 423 arg->u.count = dim; \
424 } else if (arg->u.field.count < dim) { \ 424 } else if (arg->u.count < dim) { \
425 return 0; \ 425 return 0; \
426 } \ 426 } \
427 if (read_value && \ 427 if (read_value && \
428 dim != __NaClSrpcImcRead(buffer, \ 428 dim != __NaClSrpcImcRead(buffer, \
429 sizeof(impl_type), \ 429 sizeof(impl_type), \
430 dim, \ 430 dim, \
431 arg->u.field.array)) { \ 431 arg->array)) { \
432 return 0; \ 432 return 0; \
433 } \ 433 } \
434 return 1; \ 434 return 1; \
435 } \ 435 } \
436 \ 436 \
437 static int name##ArrPut(const NaClSrpcArg* arg, \ 437 static int name##ArrPut(const NaClSrpcArg* arg, \
438 int write_value, \ 438 int write_value, \
439 NaClSrpcImcBuffer* buffer) { \ 439 NaClSrpcImcBuffer* buffer) { \
440 if (1 != \ 440 if (1 != \
441 __NaClSrpcImcWrite(&arg->u.field.count, sizeof(uint32_t), 1, buffer)) { \ 441 __NaClSrpcImcWrite(&arg->u.count, sizeof(uint32_t), 1, buffer)) { \
442 return 0; \ 442 return 0; \
443 } \ 443 } \
444 if (write_value) { \ 444 if (write_value) { \
445 return arg->u.field.count == \ 445 return arg->u.count == \
446 __NaClSrpcImcWrite(arg->u.field.array, \ 446 __NaClSrpcImcWrite(arg->array, \
447 sizeof(impl_type), \ 447 sizeof(impl_type), \
448 arg->u.field.count, \ 448 arg->u.count, \
449 buffer); \ 449 buffer); \
450 } \ 450 } \
451 return 1; \ 451 return 1; \
452 } \ 452 } \
453 \ 453 \
454 static void name##ArrPrint(const NaClSrpcArg* arg) { \ 454 static void name##ArrPrint(const NaClSrpcArg* arg) { \
455 dprintf(("[%"NACL_PRIu32"], array = %p", \ 455 dprintf(("[%"NACL_PRIu32"], array = %p", \
456 arg->u.field.count, \ 456 arg->u.count, \
457 (void*) arg->u.field.array)); \ 457 (void*) arg->array)); \
458 } \ 458 } \
459 \ 459 \
460 static uint32_t name##ArrLength(const NaClSrpcArg* arg, \ 460 static uint32_t name##ArrLength(const NaClSrpcArg* arg, \
461 int write_value, \ 461 int write_value, \
462 int* handles) { \ 462 int* handles) { \
463 *handles = 0; \ 463 *handles = 0; \
464 if (write_value) { \ 464 if (write_value) { \
465 return sizeof(uint32_t) + sizeof(impl_type) * arg->u.field.count; \ 465 return sizeof(uint32_t) + sizeof(impl_type) * arg->u.count; \
466 } else { \ 466 } else { \
467 return sizeof(uint32_t); \ 467 return sizeof(uint32_t); \
468 } \ 468 } \
469 } \ 469 } \
470 \ 470 \
471 static void name##ArrFree(NaClSrpcArg* arg) { \ 471 static void name##ArrFree(NaClSrpcArg* arg) { \
472 free(arg->u.field.array); \ 472 free(arg->array); \
473 arg->u.field.array = NULL; \ 473 arg->array = NULL; \
474 } \ 474 } \
475 \ 475 \
476 static const ArgEltInterface k##name##ArrIoInterface = { \ 476 static const ArgEltInterface k##name##ArrIoInterface = { \
477 name##ArrGet, name##ArrPut, name##ArrPrint, name##ArrLength, name##ArrFree \ 477 name##ArrGet, name##ArrPut, name##ArrPrint, name##ArrLength, name##ArrFree \
478 }; 478 };
479 479
480 /* 480 /*
481 * The three array parameter types. 481 * The three array parameter types.
482 */ 482 */
483 ARRAY_TYPE_IO_DECLARE(Char, char, caval, carr) 483 ARRAY_TYPE_IO_DECLARE(Char, char, arrays.carr)
484 ARRAY_TYPE_IO_DECLARE(Double, double, daval, darr) 484 ARRAY_TYPE_IO_DECLARE(Double, double, arrays.darr)
485 ARRAY_TYPE_IO_DECLARE(Int, int32_t, iaval, iarr) 485 ARRAY_TYPE_IO_DECLARE(Int, int32_t, arrays.iarr)
486 ARRAY_TYPE_IO_DECLARE(Long, int64_t, laval, larr) 486 ARRAY_TYPE_IO_DECLARE(Long, int64_t, arrays.larr)
487 487
488 /* 488 /*
489 * Handle (descriptor) type I/O support. 489 * Handle (descriptor) type I/O support.
490 */ 490 */
491 static int HandleGet(NaClSrpcImcBuffer* buffer, 491 static int HandleGet(NaClSrpcImcBuffer* buffer,
492 int allocate_memory, 492 int allocate_memory,
493 int read_value, 493 int read_value,
494 NaClSrpcArg* arg) { 494 NaClSrpcArg* arg) {
495 UNREFERENCED_PARAMETER(allocate_memory); 495 UNREFERENCED_PARAMETER(allocate_memory);
496 if (read_value) { 496 if (read_value) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 if (1 != __NaClSrpcImcRead(buffer, sizeof(dim), 1, &dim)) { 552 if (1 != __NaClSrpcImcRead(buffer, sizeof(dim), 1, &dim)) {
553 return 0; 553 return 0;
554 } 554 }
555 /* 555 /*
556 * check if dim + 1 (in the malloc below) will result in an 556 * check if dim + 1 (in the malloc below) will result in an
557 * integer overflow 557 * integer overflow
558 */ 558 */
559 if (dim >= NACL_ABI_SIZE_T_MAX) { 559 if (dim >= NACL_ABI_SIZE_T_MAX) {
560 return 0; 560 return 0;
561 } 561 }
562 arg->u.sval.str = (char*) malloc(dim + 1); 562 arg->arrays.str = (char*) malloc(dim + 1);
563 if (NULL == arg->u.sval.str) { 563 if (NULL == arg->arrays.str) {
564 return 0; 564 return 0;
565 } 565 }
566 if (dim != __NaClSrpcImcRead(buffer, sizeof(char), dim, arg->u.sval.str)) { 566 if (dim != __NaClSrpcImcRead(buffer, sizeof(char), dim, arg->arrays.str)) {
567 return 0; 567 return 0;
568 } 568 }
569 arg->u.sval.str[dim] = '\0'; 569 arg->arrays.str[dim] = '\0';
570 } 570 }
571 return 1; 571 return 1;
572 } 572 }
573 573
574 static int StringPut(const NaClSrpcArg* arg, 574 static int StringPut(const NaClSrpcArg* arg,
575 int write_value, 575 int write_value,
576 NaClSrpcImcBuffer* buffer) { 576 NaClSrpcImcBuffer* buffer) {
577 if (write_value) { 577 if (write_value) {
578 uint32_t slen = (uint32_t) strlen(arg->u.sval.str); 578 uint32_t slen = (uint32_t) strlen(arg->arrays.str);
579 if (1 != __NaClSrpcImcWrite(&slen, sizeof(slen), 1, buffer) || 579 if (1 != __NaClSrpcImcWrite(&slen, sizeof(slen), 1, buffer) ||
580 slen != __NaClSrpcImcWrite(arg->u.sval.str, 1, 580 slen != __NaClSrpcImcWrite(arg->arrays.str, 1,
581 (nacl_abi_size_t) slen, buffer)) { 581 (nacl_abi_size_t) slen, buffer)) {
582 return 0; 582 return 0;
583 } 583 }
584 } 584 }
585 return 1; 585 return 1;
586 } 586 }
587 587
588 static void StringPrint(const NaClSrpcArg* arg) { 588 static void StringPrint(const NaClSrpcArg* arg) {
589 dprintf((", strlen %u, '%s'", (unsigned) strlen(arg->u.sval.str), 589 dprintf((", strlen %u, '%s'", (unsigned) strlen(arg->arrays.str),
590 arg->u.sval.str)); 590 arg->arrays.str));
591 } 591 }
592 592
593 static uint32_t StringLength(const NaClSrpcArg* arg, 593 static uint32_t StringLength(const NaClSrpcArg* arg,
594 int write_value, 594 int write_value,
595 int* handles) { 595 int* handles) {
596 *handles = 0; 596 *handles = 0;
597 if (write_value) { 597 if (write_value) {
598 uint32_t size = nacl_abi_size_t_saturate(sizeof(uint32_t) 598 uint32_t size = nacl_abi_size_t_saturate(sizeof(uint32_t)
599 + strlen(arg->u.sval.str)); 599 + strlen(arg->arrays.str));
600 return size; 600 return size;
601 } else { 601 } else {
602 return 0; 602 return 0;
603 } 603 }
604 } 604 }
605 605
606 static void StringFree(NaClSrpcArg* arg) { 606 static void StringFree(NaClSrpcArg* arg) {
607 free(arg->u.sval.str); 607 free(arg->arrays.str);
608 arg->u.sval.str = NULL; 608 arg->arrays.str = NULL;
609 } 609 }
610 610
611 static const ArgEltInterface kStringIoInterface = { 611 static const ArgEltInterface kStringIoInterface = {
612 StringGet, StringPut, StringPrint, StringLength, StringFree 612 StringGet, StringPut, StringPrint, StringLength, StringFree
613 }; 613 };
614 614
615 /* 615 /*
616 * Invalid type I/O support. 616 * Invalid type I/O support.
617 */ 617 */
618 static int InvalidGet(NaClSrpcImcBuffer* buffer, 618 static int InvalidGet(NaClSrpcImcBuffer* buffer,
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 rpc->is_request = 0; 1204 rpc->is_request = 0;
1205 if (!RpcWrite(buffer, rpc)) { 1205 if (!RpcWrite(buffer, rpc)) {
1206 dprintf((SIDE "SRPC: ResponseWrite: flush failed twice -- giving up\n")); 1206 dprintf((SIDE "SRPC: ResponseWrite: flush failed twice -- giving up\n"));
1207 return; 1207 return;
1208 } 1208 }
1209 __NaClSrpcImcFlush(buffer, channel); 1209 __NaClSrpcImcFlush(buffer, channel);
1210 } 1210 }
1211 dprintf((SIDE "SRPC: ResponseWrite: sent\n")); 1211 dprintf((SIDE "SRPC: ResponseWrite: sent\n"));
1212 rpc->ret_send_succeeded = 1; 1212 rpc->ret_send_succeeded = 1;
1213 } 1213 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698