Print this page
XXX keith II
Split |
Close |
Expand all |
Collapse all |
--- old/./v8plus_glue.h
+++ new/./v8plus_glue.h
1 1 /*
2 2 * Copyright (c) 2012 Joyent, Inc. All rights reserved.
3 3 */
4 4
5 5 #ifndef _V8PLUS_GLUE_H
↓ open down ↓ |
5 lines elided |
↑ open up ↑ |
6 6 #define _V8PLUS_GLUE_H
7 7
8 8 #include <stdarg.h>
9 9 #include <libnvpair.h>
10 10 #include "v8plus_errno.h"
11 11
12 12 #ifdef __cplusplus
13 13 extern "C" {
14 14 #endif /* __cplusplus */
15 15
16 +#define __UNUSED __attribute__((__unused__))
17 +
16 18 #define V8PLUS_ARG_F_NOEXTRA 0x01
17 19
18 20 #define V8PLUS_ERRMSG_LEN 512
19 21 #define V8PLUS_JSF_COOKIE ".__v8plus_jsfunc_cookie"
20 22
21 23 typedef enum v8plus_type {
22 24 V8PLUS_TYPE_NONE = 0, /* N/A */
23 25 V8PLUS_TYPE_STRING, /* char * */
24 26 V8PLUS_TYPE_NUMBER, /* double */
25 27 V8PLUS_TYPE_BOOLEAN, /* boolean_t */
26 28 V8PLUS_TYPE_JSFUNC, /* v8plus_jsfunc_t */
27 29 V8PLUS_TYPE_OBJECT, /* nvlist_t * */
28 30 V8PLUS_TYPE_NULL, /* -- */
29 31 V8PLUS_TYPE_UNDEFINED, /* -- */
30 32 V8PLUS_TYPE_INVALID, /* data_type_t */
31 33 V8PLUS_TYPE_ANY, /* nvpair_t * */
32 34 V8PLUS_TYPE_STRNUMBER64, /* uint64_t */
33 35 V8PLUS_TYPE_INL_OBJECT /* ... */
34 36 } v8plus_type_t;
35 37
36 38 typedef uint64_t v8plus_jsfunc_t;
37 39
38 40 /*
39 41 * C constructor, destructor, and method prototypes. See README.md.
40 42 */
41 43 typedef nvlist_t *(*v8plus_c_ctor_f)(const nvlist_t *, void **);
42 44 typedef nvlist_t *(*v8plus_c_static_f)(const nvlist_t *);
43 45 typedef nvlist_t *(*v8plus_c_method_f)(void *, const nvlist_t *);
44 46 typedef void (*v8plus_c_dtor_f)(void *);
45 47
46 48 typedef struct v8plus_method_descr {
47 49 const char *md_name;
48 50 v8plus_c_method_f md_c_func;
49 51 } v8plus_method_descr_t;
50 52
51 53 typedef struct v8plus_static_descr {
52 54 const char *sd_name;
53 55 v8plus_c_static_f sd_c_func;
54 56 } v8plus_static_descr_t;
55 57
56 58 extern __thread v8plus_errno_t _v8plus_errno;
57 59 extern __thread char _v8plus_errmsg[V8PLUS_ERRMSG_LEN];
58 60
59 61 /*
60 62 * Set the errno and message, indicating an error. The code and
61 63 * printf-formatted message, if one is given, will be used in constructing
62 64 * an exception to be thrown in JavaScript if your method later returns NULL
63 65 * or an nvlist with an "err" member.
64 66 */
65 67 extern nvlist_t *v8plus_verror(v8plus_errno_t, const char *, va_list);
66 68 extern nvlist_t *v8plus_error(v8plus_errno_t, const char *, ...);
67 69
68 70 /*
69 71 * Suicide. It's always an option. Try to avoid using this as it's not
70 72 * very nice to kill the entire node process; if at all possible we need
71 73 * to throw a JavaScript exception instead.
72 74 */
73 75 extern void v8plus_panic(const char *, ...) __PRINTFLIKE(1) __NORETURN;
74 76
75 77 /*
76 78 * As above, this convenience function sets the error code and message based
77 79 * on the nvlist-generated error code in its first argument. The second
78 80 * argument, which may be NULL, should contain the name of the member on
79 81 * which the error occurred.
80 82 */
81 83 extern nvlist_t *v8plus_nverr(int, const char *);
82 84
83 85 /*
84 86 * Similarly, for system errors. Not all possible errno values are handled.
85 87 */
86 88 extern nvlist_t *v8plus_syserr(int, const char *, ...);
87 89
88 90 /*
89 91 * Clear the errno and message. This is needed only when one wishes to return
90 92 * NULL from a C method whose return type is effectively void. The idiom is
91 93 *
92 94 * return (v8plus_void());
93 95 */
94 96 extern nvlist_t *v8plus_void(void);
95 97
96 98 /*
97 99 * Find the named V8 function in the nvlist. Analogous to other lookup
98 100 * routines; see libnvpair(3lib), with an important exception: the
99 101 * nvlist_lookup_v8plus_jsfunc() and nvpair_value_v8plus_jsfunc() functions
100 102 * place a hold on the underlying function object, which must be released by C
101 103 * code when it is no longer needed. See the documentation to understand how
102 104 * this works. The add routine is of very limited utility because there is no
103 105 * mechanism for creating a JS function from C. It can however be used to
104 106 * return a function (or object containing one, etc.) from a deferred
105 107 * completion routine in which a JS function has been invoked that returned
106 108 * such a thing to us.
107 109 */
108 110 extern int nvlist_lookup_v8plus_jsfunc(const nvlist_t *, const char *,
109 111 v8plus_jsfunc_t *);
110 112 extern int nvpair_value_v8plus_jsfunc(const nvpair_t *, v8plus_jsfunc_t *);
111 113 extern void v8plus_jsfunc_hold(v8plus_jsfunc_t);
112 114 extern void v8plus_jsfunc_rele(v8plus_jsfunc_t);
113 115
114 116 /*
115 117 * Place or release a hold on the V8 representation of the specified C object.
116 118 * This is rarely necessary; v8plus_defer() performs this action for you, but
117 119 * other asynchronous mechanisms may require it. If you are returning from
118 120 * a method call but have stashed a reference to the object somewhere and are
119 121 * not calling v8plus_defer(), you must call this first. Holds and releases
120 122 * must be balanced. Use of the object within a thread after releasing is a
121 123 * bug.
122 124 */
123 125 extern void v8plus_obj_hold(const void *);
124 126 extern void v8plus_obj_rele(const void *);
125 127
126 128 /*
127 129 * Convenience functions for dealing with JS arguments.
128 130 */
129 131 extern v8plus_type_t v8plus_typeof(const nvpair_t *);
130 132 extern int v8plus_args(const nvlist_t *, uint_t, v8plus_type_t t, ...);
131 133 extern nvlist_t *v8plus_obj(v8plus_type_t, ...);
132 134 extern int v8plus_obj_setprops(nvlist_t *, v8plus_type_t, ...);
133 135
134 136 /*
135 137 * Perform a background, possibly blocking and/or expensive, task. First,
136 138 * the worker function will be enqueued for execution on another thread; its
137 139 * first argument is a pointer to the C object on which to operate, and the
138 140 * second is arbitrary per-call context, arguments, etc. defined by the caller.
139 141 * When that worker function has completed execution, the completion function
140 142 * will be invoked in the main thread. Its arguments are the C object, the
141 143 * original context pointer, and the return value from the worker function.
142 144 * See the documentation for a typical use case.
143 145 */
144 146 typedef void *(*v8plus_worker_f)(void *, void *);
145 147 typedef void (*v8plus_completion_f)(void *, void *, void *);
146 148
147 149 extern void v8plus_defer(void *, void *, v8plus_worker_f, v8plus_completion_f);
148 150
149 151 /*
150 152 * Call an opaque JavaScript function from C. The caller is responsible for
151 153 * freeing the returned list. The first argument is not const because it is
152 154 * possible for the JS code to modify the function represented by the cookie.
153 155 */
154 156 extern nvlist_t *v8plus_call(v8plus_jsfunc_t, const nvlist_t *);
155 157
↓ open down ↓ |
130 lines elided |
↑ open up ↑ |
156 158 /*
157 159 * Call the named JavaScript function in the context of the JS object
158 160 * represented by the native object. Calling and return conventions are the
159 161 * same as for the C interfaces; i.e., the nvlist will be converted into JS
160 162 * objects and the return value or exception will be in the "res" or "err"
161 163 * members of the nvlist that is returned, respectively. If an internal
162 164 * error occurs, NULL is returned and _v8plus_errno set accordingly. The
163 165 * results of calling a method implemented in C via this interface are
164 166 * undefined.
165 167 *
166 - * This can be used in concert with JS code to emit events asynchronously;
167 - * see the documentation.
168 + * These methods can be used in concert with JS code to emit events
169 + * asynchronously; see the documentation.
170 + *
171 + * Note: As JavaScript functions must be called from the event loop thread,
172 + * v8plus_method_call() contains logic to determine whether we are in the
173 + * correct context or not. If we are running on some other thread we will
174 + * queue the request and sleep, waiting for the event loop thread to make the
175 + * call. In the simple case, where we are already in the correct thread,
176 + * we make the call directly. v8plus_method_call_direct() assumes we are
177 + * on the correct thread and always makes the call directly.
168 178 */
169 179 extern nvlist_t *v8plus_method_call(void *, const char *, const nvlist_t *);
180 +extern nvlist_t *v8plus_method_call_direct(void *, const char *,
181 + const nvlist_t *);
170 182
171 183 /*
172 184 * These methods are analogous to strerror(3c) and similar functions; they
173 185 * translate among error names, codes, and default messages. There is
174 186 * normally little need for these functions in C methods, as everything
175 187 * necessary to construct a JavaScript exception is done by v8+, but these
176 188 * may be useful in the construction of supplementary exception decorations
177 189 * for debugging purposes.
178 190 */
179 191 extern const char *v8plus_strerror(v8plus_errno_t);
180 192 extern const char *v8plus_errname(v8plus_errno_t);
181 193 extern const char *v8plus_excptype(v8plus_errno_t);
182 194
183 195 /*
184 196 * Provided by C code. See README.md.
↓ open down ↓ |
5 lines elided |
↑ open up ↑ |
185 197 */
186 198 extern const v8plus_c_ctor_f v8plus_ctor;
187 199 extern const v8plus_c_dtor_f v8plus_dtor;
188 200 extern const char *v8plus_js_factory_name;
189 201 extern const char *v8plus_js_class_name;
190 202 extern const v8plus_method_descr_t v8plus_methods[];
191 203 extern const uint_t v8plus_method_count;
192 204 extern const v8plus_static_descr_t v8plus_static_methods[];
193 205 extern const uint_t v8plus_static_method_count;
194 206
207 +/*
208 + * Private methods.
209 + */
210 +extern boolean_t v8plus_in_event_thread(void);
211 +extern void v8plus_crossthread_init(void);
212 +
195 213 #ifdef __cplusplus
196 214 }
197 215 #endif /* __cplusplus */
198 216
199 217 #endif /* _V8PLUS_GLUE_H */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX