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

Side by Side Diff: ppapi/native_client/src/trusted/plugin/srpc_params.cc

Issue 876483002: NaCl: Move src/trusted/plugin/ to components/nacl/renderer/plugin/ (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Update #include guards Created 5 years, 10 months 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
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file.
5 */
6
7
8 #include "ppapi/native_client/src/trusted/plugin/srpc_params.h"
9
10 #include <stdlib.h>
11
12 #include "native_client/src/shared/srpc/nacl_srpc.h"
13
14
15 namespace plugin {
16
17 namespace {
18
19 bool FillVec(NaClSrpcArg* vec[], const char* types) {
20 const size_t kLength = strlen(types);
21 if (kLength > NACL_SRPC_MAX_ARGS) {
22 return false;
23 }
24 // We use malloc/new here rather than new/delete, because the SRPC layer
25 // is written in C and hence will use malloc/free.
26 // This array will get deallocated by FreeArguments().
27 if (kLength > 0) {
28 NaClSrpcArg* args =
29 reinterpret_cast<NaClSrpcArg*>(malloc(kLength * sizeof(*args)));
30 if (NULL == args) {
31 return false;
32 }
33
34 memset(static_cast<void*>(args), 0, kLength * sizeof(*args));
35 for (size_t i = 0; i < kLength; ++i) {
36 vec[i] = &args[i];
37 args[i].tag = static_cast<NaClSrpcArgType>(types[i]);
38 }
39 }
40 vec[kLength] = NULL;
41 return true;
42 }
43
44 void FreeSrpcArg(NaClSrpcArg* arg) {
45 switch (arg->tag) {
46 case NACL_SRPC_ARG_TYPE_CHAR_ARRAY:
47 free(arg->arrays.carr);
48 break;
49 case NACL_SRPC_ARG_TYPE_DOUBLE_ARRAY:
50 free(arg->arrays.darr);
51 break;
52 case NACL_SRPC_ARG_TYPE_HANDLE:
53 break;
54 case NACL_SRPC_ARG_TYPE_INT_ARRAY:
55 free(arg->arrays.iarr);
56 break;
57 case NACL_SRPC_ARG_TYPE_LONG_ARRAY:
58 free(arg->arrays.larr);
59 break;
60 case NACL_SRPC_ARG_TYPE_STRING:
61 // All strings that are passed in SrpcArg must be allocated using
62 // malloc! We cannot use browser's allocation API
63 // since some of SRPC arguments is handled outside of the plugin code.
64 free(arg->arrays.str);
65 break;
66 case NACL_SRPC_ARG_TYPE_VARIANT_ARRAY:
67 if (arg->arrays.varr) {
68 for (uint32_t i = 0; i < arg->u.count; i++) {
69 FreeSrpcArg(&arg->arrays.varr[i]);
70 }
71 }
72 break;
73 case NACL_SRPC_ARG_TYPE_OBJECT:
74 // This is a pointer to a scriptable object and should be released
75 // by the browser
76 break;
77 case NACL_SRPC_ARG_TYPE_BOOL:
78 case NACL_SRPC_ARG_TYPE_DOUBLE:
79 case NACL_SRPC_ARG_TYPE_INT:
80 case NACL_SRPC_ARG_TYPE_LONG:
81 case NACL_SRPC_ARG_TYPE_INVALID:
82 default:
83 break;
84 }
85 }
86
87 void FreeArguments(NaClSrpcArg* vec[]) {
88 if (NULL == vec[0]) {
89 return;
90 }
91 for (NaClSrpcArg** argp = vec; *argp; ++argp) {
92 FreeSrpcArg(*argp);
93 }
94 // Free the vector containing the arguments themselves that was
95 // allocated with FillVec().
96 free(vec[0]);
97 }
98
99 } // namespace
100
101 bool SrpcParams::Init(const char* in_types, const char* out_types) {
102 if (!FillVec(ins_, in_types)) {
103 return false;
104 }
105 if (!FillVec(outs_, out_types)) {
106 FreeArguments(ins_);
107 return false;
108 }
109 return true;
110 }
111
112 void SrpcParams::FreeAll() {
113 FreeArguments(ins_);
114 FreeArguments(outs_);
115 memset(ins_, 0, sizeof(ins_));
116 memset(outs_, 0, sizeof(outs_));
117 }
118
119 } // namespace plugin
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698