Преглед на файлове

callback 相关接口调整;jerry_main.c 调整;

Signed-off-by: yangfasheng <yangfasheng@rt-thread.com>
yangfasheng преди 7 години
родител
ревизия
56f9cce168
променени са 3 файла, в които са добавени 126 реда и са изтрити 35 реда
  1. 11 2
      rtthread-port/jerry_callbacks.c
  2. 2 1
      rtthread-port/jerry_callbacks.h
  3. 113 32
      rtthread-port/jerry_main.c

+ 11 - 2
rtthread-port/jerry_callbacks.c

@@ -27,6 +27,9 @@ static void remove_callback(struct js_callback *callback)
 {
     struct js_callback *_callback_free, *_callback = _js_callback;
 
+    if (_js_callback == NULL)
+        return;
+
     if (_js_callback == callback)
     {
         _js_callback = _js_callback->next;
@@ -52,7 +55,7 @@ static rt_bool_t has_callback(struct js_callback *callback)
 {
     struct js_callback *_callback = _js_callback;
 
-    if (callback == NULL)
+    if (callback == NULL || _js_callback == NULL)
     {
         return RT_FALSE;
     }
@@ -147,7 +150,13 @@ rt_bool_t js_send_callback(struct js_callback *callback, const void *args, uint3
     return ret;
 }
 
-void js_mq_func_set(js_mq_func signal)
+void js_mq_func_init(js_mq_func signal)
 {
     _js_mq_func = signal;
 }
+
+void js_mq_func_deinit(void)
+{
+    _js_mq_func = NULL;
+    js_remove_all_callbacks();
+}

+ 2 - 1
rtthread-port/jerry_callbacks.h

@@ -32,7 +32,8 @@ void js_remove_callback(struct js_callback *callback);
 void js_remove_all_callbacks(void);
 void js_call_callback(struct js_callback *callback, const void *data, uint32_t size);
 rt_bool_t js_send_callback(struct js_callback *callback, const void *args, uint32_t size);
-void js_mq_func_set(js_mq_func signal);
+void js_mq_func_init(js_mq_func signal);
+void js_mq_func_deinit(void);
 
 #ifdef __cplusplus
 }

+ 113 - 32
rtthread-port/jerry_main.c

@@ -7,72 +7,153 @@
 #include <jerryscript.h>
 #include <jerry_util.h>
 #include <jerry_module.h>
+#include <jerry_callbacks.h>
 
-int jerry_main(int argc, char** argv)
+#define malloc	rt_malloc
+#define free	rt_free
+
+extern void jerry_port_default_set_instance(jerry_instance_t *instance_p);
+
+static rt_mq_t _js_mq = NULL;
+
+static void *instance_alloc(size_t size, void *cb_data_p)
 {
-    char *script = NULL;
+    return rt_calloc(1, size);
+}
 
-    if (argc != 2) return -1;
+rt_bool_t js_mq_send(void *parameter)
+{
+    rt_err_t ret = -RT_ERROR;
 
-    jerry_init(JERRY_INIT_EMPTY);
+    if (_js_mq)
+    {
+        ret = rt_mq_send(_js_mq, parameter, sizeof(void *));
+    }
 
-    /* Register 'print' function from the extensions */
-    jerryx_handler_register_global((const jerry_char_t *)"print",
-                                   jerryx_handler_print);
-    js_util_init();
+    if (ret == RT_EOK)
+    {
+        return RT_TRUE;
+    }
+    else
+    {
+        return RT_FALSE;
+    }
+}
+
+static void jerry_thread_entry(void* parameter)
+{
+    char *script;
+    size_t length;
 
-    size_t length = js_read_file(argv[1], &script);
+    if (parameter == NULL)
+    {
+        printf("jerry_thread_entry (parameter == NULL)\n");
+        return;
+    }
+
+    length = js_read_file((const char*)parameter, &script);
+    printf("jerry read file : %s\n", (const char*)parameter);
     if (length > 0)
     {
+        /* JERRY_ENABLE_EXTERNAL_CONTEXT */
+        jerry_port_default_set_instance(jerry_create_instance(32 * 1024, instance_alloc, NULL));
+
+        /* Initialize engine */
+        jerry_init(JERRY_INIT_EMPTY);
+
+        /* Register 'print' function from the extensions */
+        jerryx_handler_register_global((const jerry_char_t *)"print", jerryx_handler_print);
+
+        js_util_init();
+
         /* add __filename, __dirname */
-        jerry_value_t global_obj  = jerry_get_global_object();
+        jerry_value_t global_obj = jerry_get_global_object();
         char *full_path = NULL;
-        char *full_dir  = NULL;
+        char *full_dir = NULL;
 
-        full_path = js_module_normalize_path(NULL, argv[1]);
-        full_dir  = js_module_dirname(full_path);
+        full_path = js_module_normalize_path(NULL, (const char*)parameter);
+        full_dir = js_module_dirname(full_path);
 
-        js_set_string_property(global_obj, "__dirname",  full_dir);
+        js_set_string_property(global_obj, "__dirname", full_dir);
         js_set_string_property(global_obj, "__filename", full_path);
         jerry_release_value(global_obj);
 
+        /* Setup Global scope code */
         jerry_value_t parsed_code = jerry_parse(NULL, 0, (jerry_char_t*)script, length, JERRY_PARSE_NO_OPTS);
         if (jerry_value_is_error(parsed_code))
         {
-            printf("JavaScript parse failed!\n");
+            printf("jerry parse failed!\n");
         }
         else
         {
-            /* Execute the parsed source code in the Global scope */
-            jerry_value_t ret = jerry_run(parsed_code);
-            if (jerry_value_is_error (ret))
+            _js_mq = rt_mq_create("js_mq", sizeof(void *), 128, RT_IPC_FLAG_FIFO);
+            if (_js_mq)
             {
-                jerry_value_t err_str_val = jerry_value_to_string (ret);
-                char *err_string = js_value_to_string(err_str_val);
-                if (err_string)
+                js_mq_func_init(js_mq_send);
+
+                /* Execute the parsed source code in the Global scope */
+                jerry_value_t ret = jerry_run(parsed_code);
+                if (jerry_value_is_error(ret))
                 {
-                    printf("%s\n", err_string);
-                    free(err_string);
+                    jerry_value_t err_str_val = jerry_value_to_string(ret);
+                    char *err_string = js_value_to_string(err_str_val);
+                    if (err_string)
+                    {
+                        printf("jerry run err : %s\n", err_string);
+                        free(err_string);
+                    }
+                    jerry_release_value(err_str_val);
                 }
-                jerry_release_value (err_str_val);
-            }
+                else
+                {
+                    while (1)
+                    {
+                        void *buffer = 0;
 
-            /* Returned value must be freed */
-            jerry_release_value(ret);
+                        if (rt_mq_recv(_js_mq, &buffer, sizeof(void *), RT_WAITING_FOREVER) == RT_EOK)
+                        {
+                            if (buffer)
+                            {
+                                struct js_mq_callback *jmc = (struct js_mq_callback *)buffer;
+                                js_call_callback(jmc->callback, jmc->args, jmc->size);
+                            }
+                        }
+                        rt_thread_delay(rt_tick_from_millisecond(10));
+                    }
+                }
+
+                rt_mq_delete(_js_mq);
+                js_mq_func_deinit();
+                /* Returned value must be freed */
+                jerry_release_value(ret);
+            }
         }
 
         /* Parsed source code must be freed */
         jerry_release_value(parsed_code);
+
+        rt_free(script);
+
         js_util_cleanup();
+        /* Cleanup engine */
         jerry_cleanup();
 
-        free(full_path);
-        free(full_dir );
-        free(script);
+        rt_free((void *)jerry_port_get_current_instance());
     }
-    else
+
+    return 0;
+}
+
+int jerry_main(int argc, char** argv)
+{
+    rt_thread_t tid;
+
+    if (argc != 2) return -1;
+
+    tid = rt_thread_create("jerry", jerry_thread_entry, (void*)rt_strdup((const char*)argv[1]), 1024 * 32, 20, 10);
+    if (tid)
     {
-        printf("read file:%s failed!\n", argv[1]);
+        rt_thread_startup(tid);
     }
 
     return 0;