1/**********************************************************************
2
3  ruby/vm.h -
4
5  $Author: shyouhei $
6  created at: Sat May 31 15:17:36 2008
7
8  Copyright (C) 2008 Yukihiro Matsumoto
9
10**********************************************************************/
11
12#ifndef RUBY_VM_H
13#define RUBY_VM_H 1
14
15#if defined(__cplusplus)
16extern "C" {
17#if 0
18} /* satisfy cc-mode */
19#endif
20#endif
21
22#if defined __GNUC__ && __GNUC__ >= 4
23#pragma GCC visibility push(default)
24#endif
25
26/* Place holder.
27 *
28 * We will prepare VM creation/control APIs on 1.9.2 or later.
29 * If you have an interest about it, please see mvm branch.
30 * http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/mvm/
31 */
32
33/* VM type declaration */
34typedef struct rb_vm_struct ruby_vm_t;
35
36/* core API */
37int ruby_vm_destruct(ruby_vm_t *vm);
38
39/**
40 * ruby_vm_at_exit registers a function _func_ to be invoked when a VM
41 * passed away.  Functions registered this way runs in reverse order
42 * of registration, just like END {} block does.  The difference is
43 * its timing to be triggered. ruby_vm_at_exit functions runs when a
44 * VM _passed_ _away_, while END {} blocks runs just _before_ a VM
45 * _is_ _passing_ _away_.
46 *
47 * You cannot register a function to another VM than where you are in.
48 * So where to register is intuitive, omitted.  OTOH the argument
49 * _func_ cannot know which VM it is in because at the time of
50 * invocation, the VM has already died and there is no execution
51 * context.  The VM itself is passed as the first argument to it.
52 *
53 * @param[in] func the function to register.
54 */
55void ruby_vm_at_exit(void(*func)(ruby_vm_t *));
56
57#if defined __GNUC__ && __GNUC__ >= 4
58#pragma GCC visibility pop
59#endif
60
61#if defined(__cplusplus)
62#if 0
63{ /* satisfy cc-mode */
64#endif
65}  /* extern "C" { */
66#endif
67
68#endif /* RUBY_VM_H */
69