1 /*
   2  * Copyright (c) 2012 Joyent, Inc.  All rights reserved.
   3  */
   4 
   5 #ifndef _V8PLUS_IMPL_H
   6 #define _V8PLUS_IMPL_H
   7 
   8 #include <sys/ccompile.h>
   9 #include <stdarg.h>
  10 #include <libnvpair.h>
  11 #include <v8.h>
  12 #include <uv.h>
  13 #include <queue>
  14 #include <unordered_map>
  15 #include "v8plus_glue.h"
  16 
  17 /*
  18  * STOP!
  19  *
  20  * Do not #include this header in code that consumes v8+.  This is a private
  21  * implementation header for use by v8+ internal C++ code.  It cannot be
  22  * included from C code and contains nothing usable by consumers.
  23  */
  24 
  25 #define V8PLUS_THROW(_t, _e, _f, _args...) \
  26     v8::ThrowException(v8plus::exception((_t), (_e), (_f), ## _args))
  27 #define V8PLUS_THROW_DEFAULT()          V8PLUS_THROW(NULL, NULL, NULL)
  28 #define V8PLUS_THROW_DECORATED(_e)      V8PLUS_THROW(NULL, (_e), NULL)
  29 
  30 #if NODE_MINOR_VERSION > 7 || NODE_MAJOR_VERSION > 0
  31 #define NODE_MAKECALLBACK_RETURN
  32 #endif
  33 
  34 typedef struct v8plus_async_call {
  35         void *ac_cop;
  36         const char *ac_name;
  37         const nvlist_t *ac_lp;
  38 
  39         pthread_cond_t ac_cv;
  40         pthread_mutex_t ac_mtx;
  41 
  42         boolean_t ac_run;
  43         nvlist_t *ac_return;
  44 } v8plus_async_call_t;
  45 
  46 extern "C" void v8plus_async_callback(uv_async_t *, int);
  47 
  48 namespace v8plus {
  49 
  50 
  51 class ObjectWrap;
  52 
  53 class ObjectWrap : public node::ObjectWrap {
  54 public:
  55         static void init(v8::Handle<v8::Object>);
  56         static v8::Handle<v8::Value> cons(const v8::Arguments &);
  57         static ObjectWrap *objlookup(const void *);
  58         v8::Handle<v8::Value> call(const char *, int, v8::Handle<v8::Value>[]);
  59         void public_Ref(void);
  60         void public_Unref(void);
  61         static v8plus_async_call_t *next_async_call(void);
  62         static void post_async_call(v8plus_async_call_t *);
  63         static boolean_t in_event_thread(void);
  64 
  65 private:
  66         static v8::Persistent<v8::Function> _constructor;
  67         static v8plus_method_descr_t *_mtbl;
  68         static v8plus_static_descr_t *_stbl;
  69         static std::unordered_map<void *, ObjectWrap *> _objhash;
  70         void *_c_impl;
  71 
  72         static uv_async_t _uv_async;
  73         static pthread_mutex_t _callq_mutex;
  74         static std::queue<v8plus_async_call_t *> _callq;
  75         static boolean_t _crossthread_init_done;
  76         static unsigned long _uv_event_thread;
  77 
  78         ObjectWrap() : _c_impl(NULL) {};
  79         ~ObjectWrap();
  80 
  81         static v8::Handle<v8::Value> _new(const v8::Arguments &);
  82         static v8::Handle<v8::Value> _entry(const v8::Arguments &);
  83         static v8::Handle<v8::Value> _static_entry(const v8::Arguments &);
  84 };
  85 
  86 extern nvlist_t *v8_Arguments_to_nvlist(const v8::Arguments &);
  87 extern v8::Handle<v8::Value> nvpair_to_v8_Value(const nvpair_t *);
  88 extern v8::Local<v8::Value> exception(const char *, const nvlist_t *,
  89     const char *, ...) __PRINTFLIKE(3);
  90 
  91 }; /* namespace v8plus */
  92 
  93 #endif  /* _V8PLUS_IMPL_H */