Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

Location:
EcnlProtoTool/trunk/mruby-1.3.0
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-fiber/src/fiber.c

    r321 r331  
    1 #include "mruby.h"
    2 #include "mruby/array.h"
    3 #include "mruby/class.h"
    4 #include "mruby/proc.h"
     1#include <mruby.h>
     2#include <mruby/array.h>
     3#include <mruby/class.h>
     4#include <mruby/proc.h>
    55
    66#define fiber_ptr(o) ((struct RFiber*)mrb_ptr(o))
     
    88#define FIBER_STACK_INIT_SIZE 64
    99#define FIBER_CI_INIT_SIZE 8
     10#define CI_ACC_RESUMED -3
    1011
    1112/*
     
    7475  mrb_get_args(mrb, "&", &blk);
    7576
     77  if (f->cxt) {
     78    mrb_raise(mrb, E_RUNTIME_ERROR, "cannot initialize twice");
     79  }
    7680  if (mrb_nil_p(blk)) {
    7781    mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Fiber object without a block");
     
    8286  }
    8387
    84   f->cxt = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
    85   *f->cxt = mrb_context_zero;
    86   c = f->cxt;
     88  c = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
     89  *c = mrb_context_zero;
     90  f->cxt = c;
    8791
    8892  /* initialize VM stack */
     
    156160#define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
    157161
    158 static mrb_value
    159 fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume)
    160 {
    161   struct mrb_context *c = fiber_check(mrb, self);
     162static void
     163fiber_check_cfunc(mrb_state *mrb, struct mrb_context *c)
     164{
    162165  mrb_callinfo *ci;
    163166
     
    167170    }
    168171  }
     172}
     173
     174static void
     175fiber_switch_context(mrb_state *mrb, struct mrb_context *c)
     176{
     177  if (mrb->c->fib) {
     178    mrb_write_barrier(mrb, (struct RBasic*)mrb->c->fib);
     179  }
     180  c->status = MRB_FIBER_RUNNING;
     181  mrb->c = c;
     182}
     183
     184static mrb_value
     185fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mrb_bool resume, mrb_bool vmexec)
     186{
     187  struct mrb_context *c = fiber_check(mrb, self);
     188  struct mrb_context *old_c = mrb->c;
     189  mrb_value value;
     190
     191  fiber_check_cfunc(mrb, c);
    169192  if (resume && c->status == MRB_FIBER_TRANSFERRED) {
    170193    mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber");
    171194  }
    172   if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMING) {
    173     mrb_raise(mrb, E_FIBER_ERROR, "double resume");
     195  if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMED) {
     196    mrb_raise(mrb, E_FIBER_ERROR, "double resume (fib)");
    174197  }
    175198  if (c->status == MRB_FIBER_TERMINATED) {
    176199    mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber");
    177200  }
    178   mrb->c->status = resume ? MRB_FIBER_RESUMING : MRB_FIBER_TRANSFERRED;
     201  mrb->c->status = resume ? MRB_FIBER_RESUMED : MRB_FIBER_TRANSFERRED;
    179202  c->prev = resume ? mrb->c : (c->prev ? c->prev : mrb->root_c);
    180203  if (c->status == MRB_FIBER_CREATED) {
    181     mrb_value *b = c->stack+1;
    182     mrb_value *e = b + len;
    183 
     204    mrb_value *b, *e;
     205
     206    if (len >= c->stend - c->stack) {
     207      mrb_raise(mrb, E_FIBER_ERROR, "too many arguments to fiber");
     208    }
     209    b = c->stack+1;
     210    e = b + len;
    184211    while (b<e) {
    185212      *b++ = *a++;
    186213    }
    187214    c->cibase->argc = len;
    188     if (c->prev->fib)
    189       mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
    190     mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    191     c->status = MRB_FIBER_RUNNING;
    192     mrb->c = c;
    193 
     215    value = c->stack[0] = c->ci->proc->env->stack[0];
     216  }
     217  else {
     218    value = fiber_result(mrb, a, len);
     219  }
     220  fiber_switch_context(mrb, c);
     221
     222  if (vmexec) {
     223    c->vmexec = TRUE;
     224    value = mrb_vm_exec(mrb, c->ci[-1].proc, c->ci->pc);
     225    mrb->c = old_c;
     226  }
     227  else {
    194228    MARK_CONTEXT_MODIFY(c);
    195     return c->ci->proc->env->stack[0];
    196   }
    197   MARK_CONTEXT_MODIFY(c);
    198   if (c->prev->fib)
    199     mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
    200   mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    201   c->status = MRB_FIBER_RUNNING;
    202   mrb->c = c;
    203   return fiber_result(mrb, a, len);
     229  }
     230  return value;
    204231}
    205232
     
    224251  mrb_value *a;
    225252  mrb_int len;
     253  mrb_bool vmexec = FALSE;
    226254
    227255  mrb_get_args(mrb, "*", &a, &len);
    228   return fiber_switch(mrb, self, len, a, TRUE);
     256  if (mrb->c->ci->acc < 0) {
     257    vmexec = TRUE;
     258  }
     259  return fiber_switch(mrb, self, len, a, TRUE, vmexec);
    229260}
    230261
     
    233264mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int len, const mrb_value *a)
    234265{
    235   return fiber_switch(mrb, fib, len, a, TRUE);
     266  return fiber_switch(mrb, fib, len, a, TRUE, TRUE);
    236267}
    237268
     
    281312  mrb_int len;
    282313
     314  fiber_check_cfunc(mrb, mrb->c);
    283315  mrb_get_args(mrb, "*", &a, &len);
    284316
    285317  if (c == mrb->root_c) {
    286318    mrb->c->status = MRB_FIBER_TRANSFERRED;
    287     mrb->c = c;
    288     c->status = MRB_FIBER_RUNNING;
     319    fiber_switch_context(mrb, c);
    289320    MARK_CONTEXT_MODIFY(c);
    290     mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    291321    return fiber_result(mrb, a, len);
    292322  }
     
    296326  }
    297327
    298   return fiber_switch(mrb, self, len, a, FALSE);
     328  return fiber_switch(mrb, self, len, a, FALSE, FALSE);
    299329}
    300330
     
    305335{
    306336  struct mrb_context *c = mrb->c;
    307   mrb_callinfo *ci;
    308 
    309   for (ci = c->ci; ci >= c->cibase; ci--) {
    310     if (ci->acc < 0) {
    311       mrb_raise(mrb, E_FIBER_ERROR, "can't cross C function boundary");
    312     }
    313   }
     337
    314338  if (!c->prev) {
    315339    mrb_raise(mrb, E_FIBER_ERROR, "can't yield from root fiber");
    316340  }
    317341
     342  fiber_check_cfunc(mrb, c);
    318343  c->prev->status = MRB_FIBER_RUNNING;
    319344  c->status = MRB_FIBER_SUSPENDED;
    320   mrb->c = c->prev;
     345  fiber_switch_context(mrb, c->prev);
    321346  c->prev = NULL;
     347  if (c->vmexec) {
     348    c->vmexec = FALSE;
     349    mrb->c->ci->acc = CI_ACC_RESUMED;
     350  }
    322351  MARK_CONTEXT_MODIFY(mrb->c);
    323   mrb_write_barrier(mrb, (struct RBasic*)c->fib);
    324352  return fiber_result(mrb, a, len);
    325353}
     
    333361 *  processing at this point when <code>resume</code> is called next.
    334362 *  Any arguments passed to the next <code>resume</code> will be the
    335  *  value that this <code>Fiber.yield</code> expression evaluates to.
     363 *
     364 *  mruby limitation: Fiber resume/yield cannot cross C function boundary.
     365 *  thus you cannot yield from #initialize which is called by mrb_funcall().
    336366 */
    337367static mrb_value
Note: See TracChangeset for help on using the changeset viewer.