Lua的Pluto库的线程持久性是什么?

时间:2012-01-10 01:42:03

标签: lua persistence

在Lua'Pluto库的description中,它表示lib持久存在函数和线程。

Can persist any Lua function
Can persist threads
Works with any Lua chunkreader/chunkwriter
Support for "invariant" permanent objects, of all datatypes

嗯,我无法想象如何保持函数和线程。我可以对此功能有一些解释吗?

2 个答案:

答案 0 :(得分:2)

source code相对容易理解并且非常评论。

lib的作用是确定构成函数和/或线程的部分,然后分别存储每个部分。

如果您跳过代码并只阅读注释,以下是两个相关功能的外观:

static void persistfunction(PersistInfo *pi)
{
  ...
  if(cl->c.isC) {
  /* It's a C function. For now, we aren't going to allow
   * persistence of C closures, even if the "C proto" is
   * already in the permanents table. */
    lua_pushstring(pi->L, "Attempt to persist a C function");
    lua_error(pi->L);
  } else { /* It's a Lua closure. */
    /* Persist prototype */
    ...
    /* Persist upvalue values (not the upvalue objects themselves) */
    ...
    /* Persist function environment */
    ...
  }
}

static void persistthread(PersistInfo *pi)
{
  ...
  /* Persist the stack */
  ... 
  /* Now, persist the CallInfo stack. */
  ...
  /* Serialize the state's other parameters, with the exception of upval stuff */
  ...
  /* Finally, record upvalues which need to be reopened */
  ...
}

因此,正如您所看到的,函数可以被视为原型,一组upvalues和一个环境(一个表)的组合。一个线程是两个“堆栈”(我认为是调用堆栈和内存堆栈),状态信息(不包括upvalues),它基本上是在定义线程时变量具有哪些值,以及upvalues。

您可以在PiL 27.3.3

中阅读有关upvalues的更多信息

答案 1 :(得分:0)

  

可以保留任何Lua函数

这意味着Pluto可以通过持久化它的字节码和所有必需的upval来保留任何Lua函数。有关来源,请参阅herehere。当您取消它时,您可以照常调用该功能。请注意,它不能持久保存在Lua中注册的C函数。

  

可以坚持线程

它会持久保存线程的堆栈和激活记录,因此当您取消它时,您可以继续执行堆栈的位置。代码为here