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

Side by Side Diff: native_client_sdk/src/examples/dlopen/dlopen.cc

Issue 13488007: [NaCl SDK] Make the SDK examples buildable as a packaged app. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix license headers Created 7 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /// @file 5 /// @file
6 /// This example demonstrates building a dynamic library which is loaded by the 6 /// This example demonstrates building a dynamic library which is loaded by the
7 /// NaCl module. To load the NaCl module, the browser first looks for the 7 /// NaCl module. To load the NaCl module, the browser first looks for the
8 /// CreateModule() factory method (at the end of this file). It calls 8 /// CreateModule() factory method (at the end of this file). It calls
9 /// CreateModule() once to load the module code from your .nexe. After the 9 /// CreateModule() once to load the module code from your .nexe. After the
10 /// .nexe code is loaded, CreateModule() is not called again. 10 /// .nexe code is loaded, CreateModule() is not called again.
(...skipping 12 matching lines...) Expand all
23 23
24 #include <ppapi/cpp/completion_callback.h> 24 #include <ppapi/cpp/completion_callback.h>
25 #include <ppapi/cpp/instance.h> 25 #include <ppapi/cpp/instance.h>
26 #include <ppapi/cpp/module.h> 26 #include <ppapi/cpp/module.h>
27 #include <ppapi/cpp/var.h> 27 #include <ppapi/cpp/var.h>
28 28
29 #include "eightball.h" 29 #include "eightball.h"
30 #include "nacl_io/nacl_io.h" 30 #include "nacl_io/nacl_io.h"
31 #include "reverse.h" 31 #include "reverse.h"
32 32
33 #if defined(NACL_SDK_DEBUG)
34 #define CONFIG_NAME "Debug"
35 #else
36 #define CONFIG_NAME "Release"
37 #endif
38
39 #define XSTRINGIFY(x) STRINGIFY(x)
40 #define STRINGIFY(x) #x
41 #define NACL_ARCH_STRING XSTRINGIFY(NACL_ARCH)
42
33 43
34 class DlopenInstance : public pp::Instance { 44 class DlopenInstance : public pp::Instance {
35 public: 45 public:
36 explicit DlopenInstance(PP_Instance instance) 46 explicit DlopenInstance(PP_Instance instance)
37 : pp::Instance(instance), 47 : pp::Instance(instance),
38 eightball_so_(NULL), 48 eightball_so_(NULL),
39 reverse_so_(NULL), 49 reverse_so_(NULL),
40 eightball_(NULL), 50 eightball_(NULL),
41 reverse_(NULL), 51 reverse_(NULL),
42 tid_(NULL) {} 52 tid_(NULL) {}
43 53
44 virtual ~DlopenInstance(){}; 54 virtual ~DlopenInstance(){};
45 55
46 // Helper function to post a message back to the JS and stdout functions. 56 // Helper function to post a message back to the JS and stdout functions.
47 void logmsg(const char* pStr){ 57 void logmsg(const char* pStr){
48 PostMessage(pp::Var(std::string("log:") + pStr)); 58 PostMessage(pp::Var(std::string("log:") + pStr));
49 fprintf(stdout, pStr); 59 fprintf(stdout, pStr);
50 } 60 }
51 61
52 // Initialize the module, staring a worker thread to load the shared object. 62 // Initialize the module, staring a worker thread to load the shared object.
53 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]){ 63 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]){
54 nacl_io_init_ppapi(pp_instance(), 64 nacl_io_init_ppapi(pp_instance(),
55 pp::Module::Get()->get_browser_interface()); 65 pp::Module::Get()->get_browser_interface());
56 // Mount a HTTP mount at /http. All reads from /http/* will read from the 66 // Mount a HTTP mount at /http. All reads from /http/* will read from the
57 // server. 67 // server.
58 mount("", "/http", "httpfs", 0, ""); 68 mount("", "/http", "httpfs", 0, "");
59 69
60 logmsg("Spawning thread to cache .so files..."); 70 logmsg("Spawning thread to cache .so files...\n");
61 if (pthread_create(&tid_, NULL, LoadLibrariesOnWorker, this)) { 71 if (pthread_create(&tid_, NULL, LoadLibrariesOnWorker, this)) {
62 logmsg("ERROR; pthread_create() failed.\n"); 72 logmsg("ERROR; pthread_create() failed.\n");
63 return false; 73 return false;
64 } 74 }
65 return true; 75 return true;
66 } 76 }
67 77
68 // This function is called on a worker thread, and will call dlopen to load 78 // This function is called on a worker thread, and will call dlopen to load
69 // the shared object. In addition, note that this function does NOT call 79 // the shared object. In addition, note that this function does NOT call
70 // dlclose, which would close the shared object and unload it from memory. 80 // dlclose, which would close the shared object and unload it from memory.
71 void LoadLibrary() { 81 void LoadLibrary() {
82 const char reverse_so_path[] =
83 "/http/glibc/" CONFIG_NAME "/libreverse_" NACL_ARCH_STRING ".so";
72 const int32_t IMMEDIATELY = 0; 84 const int32_t IMMEDIATELY = 0;
73 eightball_so_ = dlopen("libeightball.so", RTLD_LAZY); 85 eightball_so_ = dlopen("libeightball.so", RTLD_LAZY);
74 reverse_so_ = dlopen("/http/glibc/Debug/libreverse_x86_64.so", RTLD_LAZY); 86 reverse_so_ = dlopen(reverse_so_path, RTLD_LAZY);
75 pp::CompletionCallback cc(LoadDoneCB, this); 87 pp::CompletionCallback cc(LoadDoneCB, this);
76 pp::Module::Get()->core()->CallOnMainThread(IMMEDIATELY, cc , 0); 88 pp::Module::Get()->core()->CallOnMainThread(IMMEDIATELY, cc , 0);
77 } 89 }
78 90
79 // This function will run on the main thread and use the handle it stored by 91 // This function will run on the main thread and use the handle it stored by
80 // the worker thread, assuming it successfully loaded, to get a pointer to the 92 // the worker thread, assuming it successfully loaded, to get a pointer to the
81 // message function in the shared object. 93 // message function in the shared object.
82 void UseLibrary() { 94 void UseLibrary() {
83 if (eightball_so_ != NULL) { 95 if (eightball_so_ != NULL) {
84 intptr_t offset = (intptr_t) dlsym(eightball_so_, "Magic8Ball"); 96 intptr_t offset = (intptr_t) dlsym(eightball_so_, "Magic8Ball");
85 eightball_ = (TYPE_eightball) offset; 97 eightball_ = (TYPE_eightball) offset;
86 if (NULL == eightball_) { 98 if (NULL == eightball_) {
87 std::string message = "dlsym() returned NULL: "; 99 std::string message = "dlsym() returned NULL: ";
88 message += dlerror(); 100 message += dlerror();
89 message += "\n"; 101 message += "\n";
90 logmsg(message.c_str()); 102 logmsg(message.c_str());
91 return; 103 return;
92 } 104 }
93 105
94 logmsg("Loaded libeightball.so"); 106 logmsg("Loaded libeightball.so\n");
95 } else { 107 } else {
96 logmsg("libeightball.so did not load"); 108 logmsg("libeightball.so did not load\n");
97 } 109 }
98 110
99 111
100 if (reverse_so_ != NULL) { 112 if (reverse_so_ != NULL) {
101 intptr_t offset = (intptr_t) dlsym(reverse_so_, "Reverse"); 113 intptr_t offset = (intptr_t) dlsym(reverse_so_, "Reverse");
102 reverse_ = (TYPE_reverse) offset; 114 reverse_ = (TYPE_reverse) offset;
103 if (NULL == reverse_) { 115 if (NULL == reverse_) {
104 std::string message = "dlsym() returned NULL: "; 116 std::string message = "dlsym() returned NULL: ";
105 message += dlerror(); 117 message += dlerror();
106 message += "\n"; 118 message += "\n";
107 logmsg(message.c_str()); 119 logmsg(message.c_str());
108 return; 120 return;
109 } 121 }
110 logmsg("Loaded libreverse.so"); 122 logmsg("Loaded libreverse.so\n");
111 } else { 123 } else {
112 logmsg("libreverse.so did not load"); 124 logmsg("libreverse.so did not load\n");
113 } 125 }
114 } 126 }
115 127
116 // Called by the browser to handle the postMessage() call in Javascript. 128 // Called by the browser to handle the postMessage() call in Javascript.
117 virtual void HandleMessage(const pp::Var& var_message) { 129 virtual void HandleMessage(const pp::Var& var_message) {
118 if (!var_message.is_string()) { 130 if (!var_message.is_string()) {
119 logmsg("Message is not a string."); 131 logmsg("Message is not a string.\n");
120 return; 132 return;
121 } 133 }
122 134
123 std::string message = var_message.AsString(); 135 std::string message = var_message.AsString();
124 if (message == "eightball") { 136 if (message == "eightball") {
125 if (NULL == eightball_){ 137 if (NULL == eightball_){
126 logmsg("Eightball library not loaded"); 138 logmsg("Eightball library not loaded\n");
127 return; 139 return;
128 } 140 }
129 141
130 std::string ballmessage = "The Magic 8-Ball says: "; 142 std::string ballmessage = "The Magic 8-Ball says: ";
131 ballmessage += eightball_(); 143 ballmessage += eightball_();
132 ballmessage += "!"; 144 ballmessage += "!\n";
133 145
134 logmsg(ballmessage.c_str()); 146 logmsg(ballmessage.c_str());
135 } else if (message.find("reverse:") == 0) { 147 } else if (message.find("reverse:") == 0) {
136 if (NULL == reverse_) { 148 if (NULL == reverse_) {
137 logmsg("Reverse library not loaded"); 149 logmsg("Reverse library not loaded\n");
138 return; 150 return;
139 } 151 }
140 152
141 std::string s = message.substr(strlen("reverse:")); 153 std::string s = message.substr(strlen("reverse:"));
142 char* result = reverse_(s.c_str()); 154 char* result = reverse_(s.c_str());
143 155
144 std::string message = "Your string reversed: \""; 156 std::string message = "Your string reversed: \"";
145 message += result; 157 message += result;
146 message += "\""; 158 message += "\"\n";
147 159
148 free(result); 160 free(result);
149 161
150 logmsg(message.c_str()); 162 logmsg(message.c_str());
151 } else { 163 } else {
152 std::string errormsg = "Unexpected message: "; 164 std::string errormsg = "Unexpected message: ";
153 errormsg += message + "\n"; 165 errormsg += message + "\n";
154 logmsg(errormsg.c_str()); 166 logmsg(errormsg.c_str());
155 } 167 }
156 } 168 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 // The browser keeps a singleton of this module. It calls the 205 // The browser keeps a singleton of this module. It calls the
194 // CreateInstance() method on the object you return to make instances. There 206 // CreateInstance() method on the object you return to make instances. There
195 // is one instance per <embed> tag on the page. This is the main binding 207 // is one instance per <embed> tag on the page. This is the main binding
196 // point for your NaCl module with the browser. 208 // point for your NaCl module with the browser.
197 namespace pp { 209 namespace pp {
198 Module* CreateModule() { 210 Module* CreateModule() {
199 return new dlOpenModule(); 211 return new dlOpenModule();
200 } 212 }
201 } // namespace pp 213 } // namespace pp
202 214
OLDNEW
« no previous file with comments | « native_client_sdk/src/examples/debugging/example.dsc ('k') | native_client_sdk/src/examples/dlopen/example.dsc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698