[svn:parrot] r44632 - in branches/rm_cflags: . compilers/imcc config/gen/makefiles include/parrot lib/Parrot lib/Parrot/Docs/Section lib/Parrot/Ops2c runtime/parrot/library/HTTP src src/interp src/ops src/runcore t/codingstd t/native_pbc t/pmc t/src tools/dev
coke at svn.parrot.org
coke at svn.parrot.org
Thu Mar 4 20:51:47 UTC 2010
Author: coke
Date: Thu Mar 4 20:51:45 2010
New Revision: 44632
URL: https://trac.parrot.org/parrot/changeset/44632
Log:
merge latest changes from trunk.
Deleted:
branches/rm_cflags/include/parrot/events.h
branches/rm_cflags/include/parrot/tsq.h
branches/rm_cflags/src/events.c
branches/rm_cflags/src/tsq.c
Modified:
branches/rm_cflags/ (props changed)
branches/rm_cflags/MANIFEST
branches/rm_cflags/MANIFEST.SKIP
branches/rm_cflags/PBC_COMPAT
branches/rm_cflags/compilers/imcc/parser_util.c
branches/rm_cflags/config/gen/makefiles/root.in
branches/rm_cflags/include/parrot/op.h
branches/rm_cflags/include/parrot/parrot.h
branches/rm_cflags/include/parrot/runcore_api.h
branches/rm_cflags/include/parrot/runcore_trace.h (props changed)
branches/rm_cflags/lib/Parrot/Docs/Section/C.pm
branches/rm_cflags/lib/Parrot/Ops2c/Utils.pm
branches/rm_cflags/lib/Parrot/OpsFile.pm
branches/rm_cflags/runtime/parrot/library/HTTP/Daemon.pir
branches/rm_cflags/src/interp/inter_create.c (props changed)
branches/rm_cflags/src/ops/core.ops
branches/rm_cflags/src/ops/ops.num
branches/rm_cflags/src/runcore/cores.c (props changed)
branches/rm_cflags/src/runcore/main.c
branches/rm_cflags/src/runcore/trace.c (props changed)
branches/rm_cflags/t/codingstd/c_function_docs.t
branches/rm_cflags/t/codingstd/perlcritic.t
branches/rm_cflags/t/native_pbc/annotations.pbc
branches/rm_cflags/t/native_pbc/integer_1.pbc
branches/rm_cflags/t/native_pbc/number_1.pbc
branches/rm_cflags/t/native_pbc/string_1.pbc
branches/rm_cflags/t/pmc/signal.t
branches/rm_cflags/t/src/embed.t (props changed)
branches/rm_cflags/tools/dev/mk_gitignore.pl (props changed)
Modified: branches/rm_cflags/MANIFEST
==============================================================================
--- branches/rm_cflags/MANIFEST Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/MANIFEST Thu Mar 4 20:51:45 2010 (r44632)
@@ -1018,7 +1018,6 @@
include/parrot/embed.h [main]include
include/parrot/encoding.h [main]include
include/parrot/enums.h [main]include
-include/parrot/events.h [main]include
include/parrot/exceptions.h [main]include
include/parrot/exit.h [main]include
include/parrot/extend.h [main]include
@@ -1063,7 +1062,6 @@
include/parrot/thr_pthread.h [main]include
include/parrot/thr_windows.h [main]include
include/parrot/thread.h [main]include
-include/parrot/tsq.h [main]include
include/parrot/vtables.h [main]include
include/parrot/warnings.h [main]include
include/pmc/dummy [main]include
@@ -1324,7 +1322,6 @@
src/dynpmc/rotest.pmc [devel]src
src/dynpmc/subproxy.pmc [devel]src
src/embed.c []
-src/events.c []
src/exceptions.c []
src/exit.c []
src/extend.c []
@@ -1516,7 +1513,6 @@
src/string/unicode.h []
src/sub.c []
src/thread.c []
-src/tsq.c []
src/utils.c []
src/vtable.tbl [devel]src
src/vtables.c []
Modified: branches/rm_cflags/MANIFEST.SKIP
==============================================================================
--- branches/rm_cflags/MANIFEST.SKIP Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/MANIFEST.SKIP Thu Mar 4 20:51:45 2010 (r44632)
@@ -1,6 +1,6 @@
# ex: set ro:
# $Id$
-# generated by tools/dev/mk_manifest_and_skip.pl Thu Feb 25 23:56:41 2010 UT
+# generated by tools/dev/mk_manifest_and_skip.pl Thu Mar 4 20:45:33 2010 UT
#
# This file should contain a transcript of the svn:ignore properties
# of the directories in the Parrot subversion repository. (Needed for
Modified: branches/rm_cflags/PBC_COMPAT
==============================================================================
--- branches/rm_cflags/PBC_COMPAT Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/PBC_COMPAT Thu Mar 4 20:51:45 2010 (r44632)
@@ -27,6 +27,7 @@
# please insert tab separated entries at the top of the list
+6.4 2010.03.02 cotto remove prederef__ and reserved
6.3 2010.02.16 whiteknight Add OpLib and Opcode PMCs
6.2 2010.01.31 cotto serialization-related changes to ParrotInterpreter
6.1 2010.01.30 whiteknight remove Array PMC
Modified: branches/rm_cflags/compilers/imcc/parser_util.c
==============================================================================
--- branches/rm_cflags/compilers/imcc/parser_util.c Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/compilers/imcc/parser_util.c Thu Mar 4 20:51:45 2010 (r44632)
@@ -548,7 +548,7 @@
}
}
- if (op_info->jump && op_info->jump != PARROT_JUMP_ENEXT) {
+ if (op_info->jump) {
ins->type |= ITBRANCH;
/* TODO use opnum constants */
if (STREQ(name, "branch")
Modified: branches/rm_cflags/config/gen/makefiles/root.in
==============================================================================
--- branches/rm_cflags/config/gen/makefiles/root.in Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/config/gen/makefiles/root.in Thu Mar 4 20:51:45 2010 (r44632)
@@ -192,7 +192,6 @@
runtime/parrot/include/datatypes.pasm \
runtime/parrot/include/iterator.pasm \
runtime/parrot/include/call_bits.pasm \
- runtime/parrot/include/io_thr_msg.pasm \
runtime/parrot/include/timer.pasm \
runtime/parrot/include/except_types.pasm \
runtime/parrot/include/except_severity.pasm \
@@ -376,7 +375,6 @@
$(INC_DIR)/io.h \
$(INC_DIR)/op.h \
$(INC_DIR)/pmc.h \
- $(INC_DIR)/events.h \
$(INC_DIR)/gc_api.h \
$(INC_DIR)/string_funcs.h \
$(INC_DIR)/misc.h \
@@ -387,7 +385,6 @@
$(INC_DIR)/nci.h \
$(INC_DIR)/thread.h \
$(INC_DIR)/scheduler.h \
- $(INC_DIR)/tsq.h \
$(INC_DIR)/longopt.h \
$(INC_DIR)/oo.h \
$(INC_DIR)/vtables.h \
@@ -449,7 +446,6 @@
src/dynext$(O) \
src/embed$(O) \
src/string/encoding$(O) \
- src/events$(O) \
src/exceptions$(O) \
src/exit$(O) \
src/extend$(O) \
@@ -497,7 +493,6 @@
src/sub$(O) \
src/thread$(O) \
src/runcore/trace$(O) \
- src/tsq$(O) \
src/utils$(O) \
src/vtables$(O) \
src/warnings$(O) \
@@ -644,7 +639,6 @@
STR_FILES = \
src/debug.str \
src/dynext.str \
- src/events.str \
src/exceptions.str \
src/global.str \
src/global_setup.str \
@@ -1082,9 +1076,6 @@
runtime/parrot/include/socket.pasm : $(INC_DIR)/io.h $(H2INC)
$(PERL) $(H2INC) $(INC_DIR)/io.h $@
-runtime/parrot/include/io_thr_msg.pasm : $(INC_DIR)/events.h $(H2INC)
- $(PERL) $(H2INC) $(INC_DIR)/events.h $@
-
runtime/parrot/include/hash_key_type.pasm : $(INC_DIR)/hash.h $(H2INC)
$(PERL) $(H2INC) $(INC_DIR)/hash.h $@
@@ -1258,8 +1249,6 @@
src/exceptions.str \
include/pmc/pmc_continuation.h
-src/events$(O) : $(PARROT_H_HEADERS) src/events.str
-
src/thread$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/atomic.h \
include/pmc/pmc_sub.h \
include/pmc/pmc_parrotinterpreter.h
@@ -1382,10 +1371,6 @@
$(INC_DIR)/runcore_api.h $(INC_DIR)/runcore_trace.h \
$(PARROT_H_HEADERS)
-## SUFFIX OVERRIDE
-src/tsq$(O) : $(PARROT_H_HEADERS) src/tsq.c
- $(CC) $(CFLAGS) @optimize::src/tsq.c@ @ccwarn::src/tsq.c@ @cc_shared@ -I$(@D) @cc_o_out@ $@ -c src/tsq.c
-
src/embed$(O) : $(PARROT_H_HEADERS) $(INC_DIR)/embed.h \
$(INC_DIR)/oplib/ops.h $(INC_DIR)/runcore_api.h \
compilers/imcc/imc.h \
Deleted: branches/rm_cflags/include/parrot/events.h
==============================================================================
--- branches/rm_cflags/include/parrot/events.h Thu Mar 4 20:51:45 2010 (r44631)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,226 +0,0 @@
-/* events.h
- * Copyright (C) 2001-2008, Parrot Foundation.
- * SVN Info
- * $Id$
- * Overview:
- * This api will handle parrot events
- * Data Structure and Algorithms:
- * History:
- * Notes:
- * References:
- */
-
-#ifndef PARROT_EVENTS_H_GUARD
-#define PARROT_EVENTS_H_GUARD
-
-#include "parrot/compiler.h"
-
-typedef void* (*event_func_t)(Parrot_Interp, void*);
-
-typedef enum {
- EVENT_TYPE_NONE,
- EVENT_TYPE_EVENT,
- EVENT_TYPE_IO,
- EVENT_TYPE_MSG,
- EVENT_TYPE_TIMER,
- EVENT_TYPE_CALL_BACK,
- EVENT_TYPE_SLEEP,
- EVENT_TYPE_TERMINATE,
- EVENT_TYPE_EVENT_TERMINATE,
- EVENT_TYPE_CLASS_CHANGED,
- EVENT_TYPE_SIGNAL,
- EVENT_TYPE_SUSPEND_FOR_GC
-} parrot_event_type_enum;
-
-/*
- * any timer event has 2 time fields in front
- */
-typedef struct parrot_timer_event {
- FLOATVAL abs_time;
- FLOATVAL interval;
- int repeat; /* 0 = once, -1 = forever */
- PMC* sub; /* handler sub */
- PMC* timer; /* a .Timer PMC */
-} parrot_timer_event;
-
-/* TODO export to pasm */
-typedef enum {
- EV_IO_NONE, /* invalidated */
- EV_IO_SELECT_RD, /* rd is ready for read */
- EV_IO_SELECT_WR /* rd is ready for write */
-} parrot_io_event_enum;
-
-typedef struct parrot_io_event {
- parrot_io_event_enum action; /* read, write, ... */
- PMC* pio;
- PMC* handler;
- PMC* user_data;
-} parrot_io_event;
-
-typedef struct _call_back_info {
- PMC* cbi; /* callback info */
- char* external_data;
-} _call_back_info;
-
-typedef struct parrot_event {
- parrot_event_type_enum type;
- Parrot_Interp interp;
- /* event_func_t event_func; unused */
- union {
- STRING* msg; /* for testing only */
- int signal; /* for EVENT_TYPE_SIGNAL */
- parrot_timer_event timer_event; /* for EVENT_TYPE_TIMER */
- _call_back_info call_back; /* CALL_BACKs */
- parrot_io_event io_event; /* EVENT_TYPE_IO */
- } u;
-} parrot_event;
-
-struct QUEUE_ENTRY;
-
-#define CHECK_EVENTS(i, n) (opcode_t *)Parrot_do_check_events((i), (n))
-#define HANDLE_EVENTS(i, n) (opcode_t *)Parrot_do_handle_events((i), 1, (n))
-
-/* HEADERIZER BEGIN: src/events.c */
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-
-PARROT_EXPORT
-void Parrot_del_timer_event(PARROT_INTERP, ARGIN(const PMC *timer))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2);
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t * Parrot_do_check_events(PARROT_INTERP,
- ARGIN_NULLOK(opcode_t *next))
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t * Parrot_do_handle_events(PARROT_INTERP,
- int restore,
- ARGIN_NULLOK(opcode_t *next))
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_event_add_io_event(PARROT_INTERP,
- ARGIN_NULLOK(PMC *pio),
- ARGIN_NULLOK(PMC *sub),
- ARGIN_NULLOK(PMC *data),
- INTVAL which)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_init_events(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_init_signals(void);
-
-PARROT_EXPORT
-void Parrot_kill_event_loop(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_new_cb_event(PARROT_INTERP, ARGIN(PMC *cbi), ARGIN(char *ext))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- __attribute__nonnull__(3);
-
-PARROT_EXPORT
-void Parrot_new_suspend_for_gc_event(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_new_terminate_event(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_new_timer_event(PARROT_INTERP,
- ARGIN_NULLOK(PMC *timer),
- FLOATVAL diff,
- FLOATVAL interval,
- int repeat,
- ARGIN_NULLOK(PMC *sub),
- parrot_event_type_enum typ)
- __attribute__nonnull__(1);
-
-PARROT_EXPORT
-void Parrot_schedule_event(PARROT_INTERP, ARGMOD(parrot_event* ev))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(* ev);
-
-PARROT_EXPORT
-void Parrot_schedule_interp_qentry(PARROT_INTERP,
- ARGIN(struct QUEUE_ENTRY *entry))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2);
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t * Parrot_sleep_on_event(PARROT_INTERP,
- FLOATVAL t,
- ARGIN_NULLOK(opcode_t *next))
- __attribute__nonnull__(1);
-
-void Parrot_schedule_broadcast_qentry(ARGIN(struct QUEUE_ENTRY *entry))
- __attribute__nonnull__(1);
-
-#define ASSERT_ARGS_Parrot_del_timer_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(timer))
-#define ASSERT_ARGS_Parrot_do_check_events __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_do_handle_events __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_event_add_io_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_init_events __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_init_signals __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_Parrot_kill_event_loop __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_new_cb_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(cbi) \
- , PARROT_ASSERT_ARG(ext))
-#define ASSERT_ARGS_Parrot_new_suspend_for_gc_event \
- __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_new_terminate_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_new_timer_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_schedule_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(ev))
-#define ASSERT_ARGS_Parrot_schedule_interp_qentry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_Parrot_sleep_on_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_Parrot_schedule_broadcast_qentry \
- __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(entry))
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-/* HEADERIZER END: src/events.c */
-
-/* &gen_from_enum(io_thr_msg.pasm) */
-typedef enum {
- IO_THR_MSG_NONE,
- IO_THR_MSG_TERMINATE,
- IO_THR_MSG_ADD_SELECT_RD
-} io_thread_msg_type;
-/* &end_gen */
-
-#endif /* PARROT_EVENTS_H_GUARD */
-
-/*
- * Local variables:
- * c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
Modified: branches/rm_cflags/include/parrot/op.h
==============================================================================
--- branches/rm_cflags/include/parrot/op.h Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/include/parrot/op.h Thu Mar 4 20:51:45 2010 (r44632)
@@ -51,13 +51,7 @@
/* See lib/Parrot/OpsFile.pm if the names of these values change */
typedef enum {
- PARROT_JUMP_RELATIVE = 1,
- PARROT_JUMP_ADDRESS = 2,
- PARROT_JUMP_POP = 4,
- PARROT_JUMP_ENEXT = 8,
- PARROT_JUMP_GNEXT = 16,
- PARROT_JUMP_UNPREDICTABLE = 32,
- PARROT_JUMP_RESTART = 64
+ PARROT_JUMP_RELATIVE = 1
} op_jump_t;
/* NOTE: Sure wish we could put the types here... */
@@ -82,7 +76,6 @@
arg_type_t types[PARROT_MAX_ARGS]; /* arg_type_t, 0 = 1st arg */
arg_dir_t dirs[PARROT_MAX_ARGS]; /* arg_dir_t 0 = 1st arg */
char labels[PARROT_MAX_ARGS]; /* 0/1 0 = 1st arg */
- unsigned int flags;
} op_info_t;
Modified: branches/rm_cflags/include/parrot/parrot.h
==============================================================================
--- branches/rm_cflags/include/parrot/parrot.h Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/include/parrot/parrot.h Thu Mar 4 20:51:45 2010 (r44632)
@@ -269,7 +269,6 @@
#include "parrot/io.h"
#include "parrot/op.h"
#include "parrot/pmc.h"
-#include "parrot/events.h"
#include "parrot/gc_api.h"
#include "parrot/string_funcs.h"
#include "parrot/misc.h"
@@ -280,7 +279,6 @@
#include "parrot/nci.h"
#include "parrot/thread.h"
#include "parrot/scheduler.h"
-#include "parrot/tsq.h"
#include "parrot/longopt.h"
#include "parrot/oo.h"
#include "parrot/vtables.h"
Modified: branches/rm_cflags/include/parrot/runcore_api.h
==============================================================================
--- branches/rm_cflags/include/parrot/runcore_api.h Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/include/parrot/runcore_api.h Thu Mar 4 20:51:45 2010 (r44632)
@@ -97,14 +97,6 @@
__attribute__nonnull__(1)
__attribute__nonnull__(2);
-void do_prederef(
- ARGIN(void **pc_prederef),
- PARROT_INTERP,
- ARGIN(Parrot_runcore_t *runcore))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- __attribute__nonnull__(3);
-
void dynop_register(PARROT_INTERP, ARGIN(PMC *lib_pmc))
__attribute__nonnull__(1)
__attribute__nonnull__(2);
@@ -134,10 +126,6 @@
#define ASSERT_ARGS_Parrot_runcore_switch __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(name))
-#define ASSERT_ARGS_do_prederef __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(pc_prederef) \
- , PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(runcore))
#define ASSERT_ARGS_dynop_register __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(lib_pmc))
Deleted: branches/rm_cflags/include/parrot/tsq.h
==============================================================================
--- branches/rm_cflags/include/parrot/tsq.h Thu Mar 4 20:51:45 2010 (r44631)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,167 +0,0 @@
-/* tsq.h
- * Copyright (C) 2001-2007, Parrot Foundation.
- * SVN Info
- * $Id$
- * Overview:
- * Defines the thread-safe queue system
- * Data Structure and Algorithms:
- * History:
- * Notes:
- * References:
- */
-
-#ifndef PARROT_TSQ_H_GUARD
-#define PARROT_TSQ_H_GUARD
-
-#include "parrot/config.h"
-#include "parrot/thread.h"
-
-
-typedef struct QUEUE_ENTRY QUEUE_ENTRY;
-typedef struct QUEUE QUEUE;
-
-typedef enum {
- QUEUE_ENTRY_TYPE_NONE,
- QUEUE_ENTRY_TYPE_EVENT,
- QUEUE_ENTRY_TYPE_TIMED_EVENT
-} queue_entry_type_enum;
-
-struct QUEUE_ENTRY {
- void *data;
- queue_entry_type_enum type;
- QUEUE_ENTRY *next;
-};
-
-struct QUEUE {
- QUEUE_ENTRY *head;
- QUEUE_ENTRY *tail;
- UINTVAL max_prio;
- Parrot_mutex queue_mutex;
- Parrot_cond queue_condition;
-};
-
-/* HEADERIZER BEGIN: src/tsq.c */
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-
-void insert_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*queue);
-
-void nosync_insert_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*queue);
-
-PARROT_CANNOT_RETURN_NULL
-QUEUE_ENTRY * nosync_pop_entry(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-PARROT_CAN_RETURN_NULL
-PARROT_WARN_UNUSED_RESULT
-QUEUE_ENTRY * peek_entry(ARGIN(const QUEUE *queue))
- __attribute__nonnull__(1);
-
-PARROT_CAN_RETURN_NULL
-QUEUE_ENTRY * pop_entry(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void push_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*queue);
-
-void queue_broadcast(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void queue_destroy(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-PARROT_CAN_RETURN_NULL
-PARROT_MALLOC
-QUEUE* queue_init(UINTVAL prio);
-
-void queue_lock(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void queue_signal(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void queue_timedwait(
- ARGMOD(QUEUE *queue),
- ARGIN(const struct timespec *abs_time))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*queue);
-
-void queue_unlock(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void queue_wait(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-void unshift_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*queue);
-
-PARROT_CAN_RETURN_NULL
-QUEUE_ENTRY * wait_for_entry(ARGMOD(QUEUE *queue))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*queue);
-
-#define ASSERT_ARGS_insert_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue) \
- , PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_nosync_insert_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue) \
- , PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_nosync_pop_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_peek_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_pop_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_push_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue) \
- , PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_queue_broadcast __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_queue_destroy __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_queue_init __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_queue_lock __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_queue_signal __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_queue_timedwait __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue) \
- , PARROT_ASSERT_ARG(abs_time))
-#define ASSERT_ARGS_queue_unlock __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_queue_wait __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-#define ASSERT_ARGS_unshift_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue) \
- , PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_wait_for_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(queue))
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-/* HEADERIZER END: src/tsq.c */
-
-#endif /* PARROT_TSQ_H_GUARD */
-
-/*
- * Local variables:
- * c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
Modified: branches/rm_cflags/lib/Parrot/Docs/Section/C.pm
==============================================================================
--- branches/rm_cflags/lib/Parrot/Docs/Section/C.pm Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/lib/Parrot/Docs/Section/C.pm Thu Mar 4 20:51:45 2010 (r44632)
@@ -218,11 +218,10 @@
'Threads', '',
$self->c_pair_item( '', 'thread' ),
$self->c_header_item( '', 'thr_pthread' ),
- $self->c_pair_item( '', 'tsq' ),
),
$self->new_group(
'Exceptions', '',
- $self->c_pair_item( '', 'exceptions' ), $self->c_pair_item( '', 'events' ),
+ $self->c_pair_item( '', 'exceptions' )
),
$self->new_group(
'Memory', '',
Modified: branches/rm_cflags/lib/Parrot/Ops2c/Utils.pm
==============================================================================
--- branches/rm_cflags/lib/Parrot/Ops2c/Utils.pm Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/lib/Parrot/Ops2c/Utils.pm Thu Mar 4 20:51:45 2010 (r44632)
@@ -826,7 +826,6 @@
? $op->labels
: 0
) . " }";
- my $flags = 0;
print $fh <<END_C;
{ /* $self->{index} */
@@ -839,8 +838,7 @@
$arg_count,
$arg_types,
$arg_dirs,
- $labels,
- $flags
+ $labels
},
END_C
Modified: branches/rm_cflags/lib/Parrot/OpsFile.pm
==============================================================================
--- branches/rm_cflags/lib/Parrot/OpsFile.pm Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/lib/Parrot/OpsFile.pm Thu Mar 4 20:51:45 2010 (r44632)
@@ -126,10 +126,6 @@
Transforms to C<X>, an absolute address.
-=item C<OP_SIZE>
-
-Transforms to C<S>, the size of an op.
-
=item C<restart OFFSET(X)>
Transforms to C<PC' = 0> and restarts at C<PC + X>.
@@ -457,11 +453,8 @@
$argdirs, $line, $file, $labels, $flags, $nolines
) = @_;
my $counter = 0;
- my $absolute = 0;
my $branch = 0;
my $pop = 0;
- my $next = 0;
- my $restart = 0;
if (exists($$flags{deprecated})) {
$body = <<"END_CODE" . $body;
@@ -494,7 +487,6 @@
# expr OFFSET(X) {{^+X}} PC + X Relative address
# expr NEXT() {{^+S}} PC + S Where S is op size
# expr ADDRESS(X) {{^X}} X Absolute address
- # OP_SIZE {{^S}} S op size
#
# restart OFFSET(X) {{=0,+=X}} PC' = 0 Restarts at PC + X
# restart NEXT() {{=0,+=S}} PC' = 0 Restarts at PC + S
@@ -512,37 +504,27 @@
# on the mode of operation (function calls, switch statements, gotos
# with labels, etc.).
#
-
- $absolute ||= $body =~ s/\bgoto\s+ADDRESS\(\( (.*?) \)\)/{{=$1}}/mg;
- $body =~ s/\bexpr\s+ADDRESS\(\( (.*?) \)\)/{{^$1}}/mg;
- $absolute ||= $body =~ s/\bgoto\s+ADDRESS\((.*?)\)/{{=$1}}/mg;
- $body =~ s/\bexpr\s+ADDRESS\((.*?)\)/{{^$1}}/mg;
-
- $branch ||= $short_name =~ /runinterp/;
- $branch ||= $body =~ s/\bgoto\s+OFFSET\(\( (.*?) \)\)/{{+=$1}}/mg;
- $body =~ s/\bexpr\s+OFFSET\(\( (.*?) \)\)/{{^+$1}}/mg;
- $branch ||= $body =~ s/\bgoto\s+OFFSET\((.*?)\)/{{+=$1}}/mg;
- $body =~ s/\bexpr\s+OFFSET\((.*?)\)/{{^+$1}}/mg;
-
- $next ||= $short_name =~ /runinterp/;
- $next ||= $body =~ s/\bexpr\s+NEXT\(\)/{{^+$op_size}}/mg;
- $body =~ s/\bgoto\s+NEXT\(\)/{{+=$op_size}}/mg;
-
- $body =~ s/\bOP_SIZE\b/{{^$op_size}}/mg;
-
- if ( $body =~ s/\brestart\s+OFFSET\((.*?)\)/{{=0,+=$1}}/mg ) {
- $branch = 1;
- $restart = 1;
- }
- elsif ( $body =~ s/\brestart\s+NEXT\(\)/{{=0,+=$op_size}}/mg ) {
- $restart = 1;
- $next = 1;
- }
- elsif ( $body =~ s/\brestart\s+ADDRESS\((.*?)\)/{{=$1}}/mg ) {
- $next = 0;
- $restart = 1;
+ if ($body =~ /(goto|restart)\s+OFFSET\(.*?\)/ || $short_name =~ /runinterp/) {
+ $branch = 1;
}
+ $body =~ s/\bgoto\s+ADDRESS\(\( (.*?) \)\)/{{=$1}}/mg;
+ $body =~ s/\bexpr\s+ADDRESS\(\( (.*?) \)\)/{{^$1}}/mg;
+ $body =~ s/\bgoto\s+ADDRESS\((.*?)\)/{{=$1}}/mg;
+ $body =~ s/\bexpr\s+ADDRESS\((.*?)\)/{{^$1}}/mg;
+
+ $body =~ s/\bgoto\s+OFFSET\(\( (.*?) \)\)/{{+=$1}}/mg;
+ $body =~ s/\bexpr\s+OFFSET\(\( (.*?) \)\)/{{^+$1}}/mg;
+ $body =~ s/\bgoto\s+OFFSET\((.*?)\)/{{+=$1}}/mg;
+ $body =~ s/\bexpr\s+OFFSET\((.*?)\)/{{^+$1}}/mg;
+
+ $body =~ s/\bexpr\s+NEXT\(\)/{{^+$op_size}}/mg;
+ $body =~ s/\bgoto\s+NEXT\(\)/{{+=$op_size}}/mg;
+
+ $body =~ s/\brestart\s+OFFSET\((.*?)\)/{{=0,+=$1}}/mg;
+ $body =~ s/\brestart\s+NEXT\(\)/{{=0,+=$op_size}}/mg;
+ $body =~ s/\brestart\s+ADDRESS\((.*?)\)/{{=$1}}/mg;
+
$body =~ s/\$(\d+)/{{\@$1}}/mg;
# We can only reference as many parameters as we declare
@@ -558,17 +540,7 @@
$op->body( $nolines ? $body : qq{#line $line "$file_escaped"\n$body} );
# Constants here are defined in include/parrot/op.h
- or_flag( \$jumps, "PARROT_JUMP_ADDRESS" ) if $absolute;
or_flag( \$jumps, "PARROT_JUMP_RELATIVE" ) if $branch;
- or_flag( \$jumps, "PARROT_JUMP_ENEXT" ) if $next;
- or_flag( \$jumps, "PARROT_JUMP_RESTART" ) if $restart;
-
- # I'm assuming the op branches to the value in the last argument.
- if ( ($jumps)
- && ( $fixedargs[ @fixedargs - 1 ] )
- && ( $fixedargs[ @fixedargs - 1 ] eq 'i' ) ) {
- or_flag( \$jumps, "PARROT_JUMP_GNEXT" );
- }
$op->jump($jumps);
$self->push_op($op);
Modified: branches/rm_cflags/runtime/parrot/library/HTTP/Daemon.pir
==============================================================================
--- branches/rm_cflags/runtime/parrot/library/HTTP/Daemon.pir Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/runtime/parrot/library/HTTP/Daemon.pir Thu Mar 4 20:51:45 2010 (r44632)
@@ -433,7 +433,7 @@
.end
# close all sockets
-# this needs enabling of SIGHUP in src/events.c but still doesn't
+# this needs enabling of SIGHUP but still doesn't
# help against FIN_WAIT2 / TIME_WAIT state of connections
.sub 'shutdown' :method
.local pmc active, sock
Deleted: branches/rm_cflags/src/events.c
==============================================================================
--- branches/rm_cflags/src/events.c Thu Mar 4 20:51:45 2010 (r44631)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,1562 +0,0 @@
-/*
-Copyright (C) 2001-2008, Parrot Foundation.
-$Id$
-
-=head1 NAME
-
-src/events.c - Event handling stuff
-
-=head1 DESCRIPTION
-
-An event_thread handles async events for all interpreters. When events
-are due, they are placed in per interpreter task_queues, where they are
-handled then by the C<check_event*> opcodes.
-
-IO events and signals are caught in the io_thread, which again
-dispatches these to one or all interpreters.
-
-=over 4
-
-=cut
-
-*/
-
-#include "parrot/parrot.h"
-#include "parrot/events.h"
-#include "events.str"
-
-typedef struct pending_io_events {
- parrot_event **events;
- size_t n;
- size_t alloced;
-} pending_io_events;
-
-/* HEADERIZER HFILE: include/parrot/events.h */
-/* HEADERIZER BEGIN: static */
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static opcode_t * do_event(PARROT_INTERP,
- ARGIN(parrot_event* event),
- ARGIN_NULLOK(opcode_t *next))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2);
-
-PARROT_MALLOC
-PARROT_CANNOT_RETURN_NULL
-static QUEUE_ENTRY* dup_entry(ARGIN(const QUEUE_ENTRY *entry))
- __attribute__nonnull__(1);
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-static QUEUE_ENTRY* dup_entry_interval(
- ARGIN(QUEUE_ENTRY *entry),
- FLOATVAL now)
- __attribute__nonnull__(1);
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static void* event_thread(ARGMOD(void *data))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*data);
-
-static void event_to_exception(PARROT_INTERP,
- ARGIN(const parrot_event* event))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2);
-
-static void init_events_all(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-static void init_events_first(PARROT_INTERP)
- __attribute__nonnull__(1);
-
-PARROT_CAN_RETURN_NULL
-static void* io_thread(SHIM(void *data));
-
-static void io_thread_ready_rd(ARGMOD(pending_io_events *ios), int ready_rd)
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*ios);
-
-static void Parrot_sigaction(int sig, ARGIN(void (*handler)(int)))
- __attribute__nonnull__(2);
-
-static void Parrot_unblock_signal(int sig);
-static int process_events(ARGMOD(QUEUE *event_q))
- __attribute__nonnull__(1)
- FUNC_MODIFIES(*event_q);
-
-static void schedule_signal_event(int signum);
-static void sig_handler(int signum);
-static void stop_io_thread(void);
-static void store_io_event(
- ARGMOD(pending_io_events *ios),
- ARGIN(parrot_event *ev))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- FUNC_MODIFIES(*ios);
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static opcode_t * wait_for_wakeup(PARROT_INTERP,
- ARGIN_NULLOK(opcode_t *next))
- __attribute__nonnull__(1);
-
-#define ASSERT_ARGS_do_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(event))
-#define ASSERT_ARGS_dup_entry __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_dup_entry_interval __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(entry))
-#define ASSERT_ARGS_event_thread __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(data))
-#define ASSERT_ARGS_event_to_exception __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(event))
-#define ASSERT_ARGS_init_events_all __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_init_events_first __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-#define ASSERT_ARGS_io_thread __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_io_thread_ready_rd __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(ios))
-#define ASSERT_ARGS_Parrot_sigaction __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(handler))
-#define ASSERT_ARGS_Parrot_unblock_signal __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_process_events __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(event_q))
-#define ASSERT_ARGS_schedule_signal_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_sig_handler __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_stop_io_thread __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
-#define ASSERT_ARGS_store_io_event __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(ios) \
- , PARROT_ASSERT_ARG(ev))
-#define ASSERT_ARGS_wait_for_wakeup __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(interp))
-/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
-/* HEADERIZER END: static */
-
-/*
- * event debugging stuff - turn it off before running tests
- */
-#define EVENT_DEBUG 0
-/*
- * not yet - need to sort out platform code and fix exceptions first
- * TODO get some config for POSIX compliant
- * TODO create API for extenders like ponie - events disabled for now
- */
-#if defined(linux) || defined(darwin)
-# define INSTALL_EVENT_HANDLER 0
-#else
-# define INSTALL_EVENT_HANDLER 0
-#endif
-
-#if EVENT_DEBUG
-# define edebug(x) fprintf (x)
-static const char *ev_names[] = {
- "EVENT_TYPE_NONE",
- "EVENT_TYPE_EVENT",
- "EVENT_TYPE_IO",
- "EVENT_TYPE_MSG",
- "EVENT_TYPE_TIMER",
- "EVENT_TYPE_CALL_BACK",
- "EVENT_TYPE_SLEEP",
- "EVENT_TYPE_TERMINATE",
- "EVENT_TYPE_EVENT_TERMINATE",
- "EVENT_TYPE_CLASS_CHANGED",
- "EVENT_TYPE_SIGNAL",
- "EVENT_TYPE_SUSPEND_FOR_GC"
-};
-static const char*
-et(const parrot_event* const e)
-{
- return ev_names[e->type];
-}
-
-#else
-# define edebug(x)
-#endif
-
-
-/* forward defs */
-
-/*
- * we have exactly one global event_queue
- * TODO task prio handling
- */
-static QUEUE *event_queue;
-#define TASK_PRIO 10
-
-/*
- * user accessible signals like SIGINT
- */
-#ifndef SIGINT
-# define SIGINT -4711
-#endif
-#ifndef SIGHUP
-# define SIGHUP -4712
-#endif
-
-/*
- * XXX need a configure test
- * should be sig_atomic_t
- */
-static int sig_int, sig_hup;
-
-/*
- * a pipe is used to send messages to the IO thread
- */
-static int pipe_fds[2];
-#define PIPE_READ_FD pipe_fds[0]
-#define PIPE_WRITE_FD pipe_fds[1]
-
-/*
- * a structure to communicate with the io_thread
- */
-typedef struct io_thread_msg {
- INTVAL command;
- parrot_event *ev;
-} io_thread_msg;
-
-
-/*
-
-=back
-
-=head2 Signal Handling
-
-=over 4
-
-=item C<static void sig_handler(int signum)>
-
-Handle signal C<signum>.
-
-TODO - Only C<SIGHUP> is handled at the moment for testing
-
-=cut
-
-*/
-
-static void
-sig_handler(int signum)
-{
- ASSERT_ARGS(sig_handler)
- switch (signum) {
- case SIGINT:
- sig_int = 1;
- break;
- case SIGHUP:
- sig_hup = 1;
- break;
- default:
- break;
- }
-}
-
-/*
-
-=item C<static void Parrot_sigaction(int sig, void (*handler(int)))>
-
-Signal handlers are common to all threads, signal block masks are
-specific, so we install one handler then block that signal and unblock
-it in the thread, that will receive that signal.
-
-=cut
-
-*/
-
-static void
-Parrot_sigaction(int sig, ARGIN(void (*handler)(int)))
-{
- ASSERT_ARGS(Parrot_sigaction)
-#ifdef PARROT_HAS_SIGACTION
- struct sigaction action;
- sigset_t block_mask;
-
- /* install handler */
- action.sa_handler = handler;
- sigemptyset(&action.sa_mask);
- action.sa_flags = 0;
- sigaction(sig, &action, NULL);
-
- /* block that signal */
- sigemptyset(&block_mask);
- sigaddset(&block_mask, sig);
- sigprocmask(SIG_BLOCK, &block_mask, NULL);
-#else
- UNUSED(sig);
- UNUSED(handler);
-#endif
-}
-
-
-/*
-
-=item C<static void Parrot_unblock_signal(int sig)>
-
-unblock a signal
-
-=cut
-
-*/
-
-static void
-Parrot_unblock_signal(int sig)
-{
- ASSERT_ARGS(Parrot_unblock_signal)
-#ifdef PARROT_HAS_SIGACTION
- sigset_t block_mask;
-
- sigemptyset(&block_mask);
- sigaddset(&block_mask, sig);
- sigprocmask(SIG_UNBLOCK, &block_mask, NULL);
-#else
- UNUSED(sig);
-#endif
-}
-
-
-/*
-
-=item C<void Parrot_init_signals(void)>
-
-Set up actions to handle signals.
-Only SIGHUP handled at the moment.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_init_signals(void)
-{
- ASSERT_ARGS(Parrot_init_signals)
- /*
- * SIGFPE is architecture specific - some signal an error,
- * some don't, so we have to use direct checks if we are dividing
- * by zero.
- */
- Parrot_sigaction(SIGHUP, sig_handler);
-}
-
-/*
-
-=back
-
-=head2 Initialization
-
-=over 4
-
-=item C<static void init_events_first(PARROT_INTERP)>
-
-Init event system for first interpreter.
-
-=cut
-
-*/
-
-static void
-init_events_first(PARROT_INTERP)
-{
- ASSERT_ARGS(init_events_first)
- Parrot_thread ev_handle;
-#ifndef WIN32
- Parrot_thread io_handle;
-#endif
-
- /*
- * be sure all init is done only once
- * we could use pthread_once for that too
- */
- if (event_queue)
- PANIC(interp, "event queue already exists - missing parent_interp?");
- /*
- * create event queue
- */
- event_queue = queue_init(TASK_PRIO);
- /*
- * we use a message pipe to send IO related stuff to the
- * IO thread
- */
-#ifndef WIN32
- /*
- * pipes on WIN32 don't support select
- * s. p6i: "event.c - of signals and pipes"
- */
- if (pipe(pipe_fds))
- Parrot_ex_throw_from_c_args(interp, NULL, 1, "Couldn't create message pipe");
-#endif
- /*
- * now set some sig handlers before any thread is started, so
- * that all threads inherit the signal block mask
- */
-#if INSTALL_EVENT_HANDLER
- Parrot_init_signals();
-#endif
- /*
- * we start an event_handler thread
- */
- THREAD_CREATE_DETACHED(ev_handle, event_thread, event_queue);
- /*
- * and a signal and IO handler thread
- */
-#ifndef WIN32
- THREAD_CREATE_DETACHED(io_handle, io_thread, event_queue);
-#endif
-}
-
-/*
-
-=item C<static void init_events_all(PARROT_INTERP)>
-
-Init events for all interpreters.
-
-=cut
-
-*/
-
-static void
-init_events_all(PARROT_INTERP)
-{
- ASSERT_ARGS(init_events_all)
- /*
- * create per interpreter task queue
- */
- interp->task_queue = queue_init(0);
-}
-
-/*
-
-=item C<void Parrot_init_events(PARROT_INTERP)>
-
-Initialize the event system.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_init_events(PARROT_INTERP)
-{
- ASSERT_ARGS(Parrot_init_events)
- if (!interp->parent_interpreter) {
- /* add the very first interpreter to the list of interps. */
- pt_add_to_interpreters(interp, NULL);
- init_events_first(interp);
- }
- init_events_all(interp);
-}
-
-/*
-
-=back
-
-=head2 Event Handler Functions
-
-=over 4
-
-=item C<void Parrot_schedule_event(PARROT_INTERP, parrot_event* ev)>
-
-Create queue entry and insert event into task queue.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_schedule_event(PARROT_INTERP, ARGMOD(parrot_event* ev))
-{
- ASSERT_ARGS(Parrot_schedule_event)
- QUEUE_ENTRY * const entry = mem_internal_allocate_typed(QUEUE_ENTRY);
- entry->next = NULL;
- ev->interp = interp;
- entry->data = ev;
- switch (ev->type) {
- case EVENT_TYPE_TIMER:
- case EVENT_TYPE_SLEEP:
- entry->type = QUEUE_ENTRY_TYPE_TIMED_EVENT;
- insert_entry(event_queue, entry);
- break;
- case EVENT_TYPE_CALL_BACK:
- case EVENT_TYPE_SIGNAL:
- case EVENT_TYPE_IO:
- entry->type = QUEUE_ENTRY_TYPE_EVENT;
- unshift_entry(event_queue, entry);
- break;
- default:
- entry->type = QUEUE_ENTRY_TYPE_EVENT;
- push_entry(event_queue, entry);
- break;
- }
-}
-
-/*
-
-=item C<static void schedule_signal_event(int signum)>
-
-create and schedule a signal event
-
-=cut
-
-*/
-
-static void
-schedule_signal_event(int signum)
-{
- ASSERT_ARGS(schedule_signal_event)
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
- QUEUE_ENTRY * const entry = mem_internal_allocate_typed(QUEUE_ENTRY);
-
- entry->next = NULL;
- entry->type = QUEUE_ENTRY_TYPE_EVENT;
- ev->type = EVENT_TYPE_SIGNAL;
- ev->u.signal = signum;
- entry->data = ev;
- /*
- * deliver to all interpreters
- */
- Parrot_schedule_broadcast_qentry(entry);
-}
-
-/*
-
-=item C<void Parrot_new_timer_event(PARROT_INTERP, PMC *timer, FLOATVAL diff,
-FLOATVAL interval, int repeat, PMC *sub, parrot_event_type_enum typ)>
-
-Create a new timer event due at C<diff> from now, repeated at C<interval>
-and running the passed C<sub>.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_new_timer_event(PARROT_INTERP, ARGIN_NULLOK(PMC *timer), FLOATVAL diff,
- FLOATVAL interval, int repeat, ARGIN_NULLOK(PMC *sub), parrot_event_type_enum typ)
-{
- ASSERT_ARGS(Parrot_new_timer_event)
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
-
- const FLOATVAL now = Parrot_floatval_time();
-
- ev->type = typ;
- ev->u.timer_event.timer = timer;
- ev->u.timer_event.abs_time = now + diff;
- ev->u.timer_event.interval = interval;
- ev->u.timer_event.repeat = repeat;
- ev->u.timer_event.sub = sub;
-
- if (repeat && FLOAT_IS_ZERO(interval))
- ev->u.timer_event.interval = diff;
-
- Parrot_schedule_event(interp, ev);
-}
-
-/*
-
-=item C<void Parrot_new_cb_event(PARROT_INTERP, PMC *cbi, char *ext)>
-
-Prepare and schedule a callback event.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_new_cb_event(PARROT_INTERP, ARGIN(PMC *cbi), ARGIN(char *ext))
-{
- ASSERT_ARGS(Parrot_new_cb_event)
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
- QUEUE_ENTRY* const entry = mem_internal_allocate_typed(QUEUE_ENTRY);
-
- entry->next = NULL;
- entry->data = ev;
- ev->interp = interp;
- ev->type = EVENT_TYPE_CALL_BACK;
- ev->u.call_back.cbi = cbi;
- ev->u.call_back.external_data = ext;
- Parrot_schedule_interp_qentry(interp, entry);
-}
-
-/*
-
-=item C<void Parrot_del_timer_event(PARROT_INTERP, const PMC *timer)>
-
-Deactivate the timer identified by C<timer>.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_del_timer_event(PARROT_INTERP, ARGIN(const PMC *timer))
-{
- ASSERT_ARGS(Parrot_del_timer_event)
- QUEUE_ENTRY *entry;
-
- LOCK(event_queue->queue_mutex);
-
- for (entry = event_queue->head; entry; entry = entry->next) {
- if (entry->type == QUEUE_ENTRY_TYPE_TIMED_EVENT) {
-
- parrot_event * const event = (parrot_event *)entry->data;
-
- if (event->interp == interp
- && event->u.timer_event.timer == timer) {
- event->u.timer_event.interval = 0.0;
- event->type = EVENT_TYPE_NONE;
- break;
- }
- }
- }
- UNLOCK(event_queue->queue_mutex);
-}
-
-/*
-
-=item C<void Parrot_new_terminate_event(PARROT_INTERP)>
-
-Create a terminate event, interpreter will leave the run-loop when this
-event arrives.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_new_terminate_event(PARROT_INTERP)
-{
- ASSERT_ARGS(Parrot_new_terminate_event)
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
- ev->type = EVENT_TYPE_TERMINATE;
- Parrot_schedule_event(interp, ev);
-}
-
-/*
-
-=item C<void Parrot_new_suspend_for_gc_event(PARROT_INTERP)>
-
-Create a suspend-for-GC event, interpreter will wait on a condition
-variable for GC to finish when the event arrives.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_new_suspend_for_gc_event(PARROT_INTERP)
-{
- ASSERT_ARGS(Parrot_new_suspend_for_gc_event)
- QUEUE_ENTRY *qe;
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
- ev->type = EVENT_TYPE_SUSPEND_FOR_GC;
- qe = mem_internal_allocate_typed(QUEUE_ENTRY);
- qe->next = NULL;
- qe->data = ev;
- qe->type = QUEUE_ENTRY_TYPE_EVENT;
- /* we don't use schedule_event because we must modify its
- * task queue immediately
- */
- Parrot_schedule_interp_qentry(interp, qe);
-}
-
-/*
-
-=item C<void Parrot_kill_event_loop(PARROT_INTERP)>
-
-Schedule event-loop terminate event. This shuts down the event thread.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_kill_event_loop(PARROT_INTERP)
-{
- ASSERT_ARGS(Parrot_kill_event_loop)
- parrot_event* const ev = mem_internal_allocate_typed(parrot_event);
- ev->type = EVENT_TYPE_EVENT_TERMINATE;
- Parrot_schedule_event(interp, ev);
-}
-
-/*
-
-=item C<void Parrot_schedule_interp_qentry(PARROT_INTERP, struct QUEUE_ENTRY
-*entry)>
-
-Put a queue entry into the interpreters task queue and enable event
-checking for the interpreter.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_schedule_interp_qentry(PARROT_INTERP, ARGIN(struct QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(Parrot_schedule_interp_qentry)
- parrot_event * const event = (parrot_event *)entry->data;
- /*
- * sleep checks events when it awakes
- */
- edebug((stderr, "got entry - schedule_inter_qentry %s\n", et(event)));
- if (event->type != EVENT_TYPE_SLEEP)
- enable_event_checking(interp);
- /*
- * do push_entry last - this signales the queue condition so the
- * interpreter might starting process that event immediately
- *
- * we should better use a priority for placing the event
- * in front or at the end of the queue
- */
- switch (event->type) {
- case EVENT_TYPE_CALL_BACK:
- case EVENT_TYPE_SIGNAL:
- unshift_entry(interp->task_queue, entry);
- break;
- default:
- push_entry(interp->task_queue, entry);
- break;
- }
-}
-
-/*
-
-=item C<void Parrot_schedule_broadcast_qentry(struct QUEUE_ENTRY *entry)>
-
-Broadcast an event.
-
-=cut
-
-*/
-
-void
-Parrot_schedule_broadcast_qentry(ARGIN(struct QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(Parrot_schedule_broadcast_qentry)
- parrot_event * const event = (parrot_event *)entry->data;
-
- switch (event->type) {
- case EVENT_TYPE_SIGNAL:
- edebug((stderr, "broadcast signal\n"));
- /*
- * we don't have special signal handlers in usercode yet
- * e.g.:
- * install handler like exception handler *and*
- * set a interpreter flag, that a handler exists
- * we then could examine that flag (after LOCKing it)
- * and dispatch the exception to all interpreters that
- * handle it
- * Finally, we send the first (main) interpreter that signal
- *
- * For now just send to all.
- *
- */
- switch (event->u.signal) {
- case SIGHUP:
- case SIGINT:
- {
- if (n_interpreters) {
- size_t i;
- LOCK(interpreter_array_mutex);
- for (i = 1; i < n_interpreters; ++i) {
- Interp *interp;
- edebug((stderr, "deliver SIGINT to %d\n", i));
- interp = interpreter_array[i];
- if (interp)
- Parrot_schedule_interp_qentry(interp,
- dup_entry(entry));
- }
- UNLOCK(interpreter_array_mutex);
- }
- Parrot_schedule_interp_qentry(interpreter_array[0], entry);
- edebug((stderr, "deliver SIGINT to 0\n"));
- }
- break;
- default:
- mem_internal_free(entry);
- mem_internal_free(event);
- }
- break;
- default:
- mem_internal_free(entry);
- mem_internal_free(event);
- exit_fatal(1, "Unknown event to broadcast");
- break;
- }
-}
-
-/*
-
-=back
-
-=head2 IO Thread Handling
-
-=over 4
-
-=cut
-
-*/
-
-#ifndef WIN32
-
-/*
-
-=item C<static void store_io_event(pending_io_events *ios, parrot_event *ev)>
-
-Stores an event in the event stack. Allocates memory if necessary.
-
-=cut
-
-*/
-
-static void
-store_io_event(ARGMOD(pending_io_events *ios), ARGIN(parrot_event *ev))
-{
- ASSERT_ARGS(store_io_event)
- if (!ios->alloced) {
- ios->alloced = 16;
- ios->events = mem_internal_allocate_n_zeroed_typed(ios->alloced, parrot_event *);
- }
- else if (ios->n >= ios->alloced) {
- ios->events = mem_internal_realloc_n_zeroed_typed(ios->events,
- ios->alloced * 2, ios->alloced, parrot_event *);
- ios->alloced *= 2;
- }
- ios->events[ios->n++] = ev;
-}
-
-/*
-
-=item C<static void io_thread_ready_rd(pending_io_events *ios, int ready_rd)>
-
-Takes a list of pending i/o events and a file descriptor.
-If the fd is ready to read, the event is removed from the
-"pending" list and moved to the "scheduled" task queue.
-
-=cut
-
-*/
-
-static void
-io_thread_ready_rd(ARGMOD(pending_io_events *ios), int ready_rd)
-{
- ASSERT_ARGS(io_thread_ready_rd)
- size_t i;
-
- for (i = 0; i < ios->n; ++i) {
- parrot_event * const ev = ios->events[i];
- PMC * const pio = ev->u.io_event.pio;
- const int fd = Parrot_io_getfd(ev->interp, pio);
-
- if (fd == ready_rd) {
- /* remove from event list */
- --ios->n;
-
- for (; i < ios->n; ++i)
- ios->events[i] = ios->events[i+1];
-
- Parrot_schedule_event(ev->interp, ev);
- break;
- }
- }
-}
-
-/*
-
-=item C<static void* io_thread(void *data)>
-
-The IO thread uses select/poll to handle IO events and signals.
-
-It waits on input from the message pipe to insert file descriptors in
-the wait sets.
-
-=cut
-
-*/
-
-PARROT_CAN_RETURN_NULL
-static void*
-io_thread(SHIM(void *data))
-{
- ASSERT_ARGS(io_thread)
- fd_set act_rfds, act_wfds;
- int n_highest, i;
- int running = 1;
- pending_io_events ios;
-
- ios.n = 0;
- ios.alloced = 0;
- ios.events = 0;
- /* remember pending io events */
-
- FD_ZERO(&act_rfds);
- FD_ZERO(&act_wfds);
- /*
- * Watch the reader end of the pipe for messages
- */
- FD_SET(PIPE_READ_FD, &act_rfds);
- n_highest = PIPE_READ_FD + 1;
- /*
- * all signals that we shall handle here have to be unblocked
- * in this and only in this thread
- */
- Parrot_unblock_signal(SIGHUP);
- while (running) {
- fd_set rfds = act_rfds;
- fd_set wfds = act_wfds;
- const int retval = select(n_highest, &rfds, &wfds, NULL, NULL);
-
- switch (retval) {
- case -1:
- if (errno == EINTR) {
- edebug((stderr, "select EINTR\n"));
- if (sig_int) {
- edebug((stderr, "int arrived\n"));
- sig_int = 0;
- /*
- * signal the event thread
- */
- schedule_signal_event(SIGINT);
- }
- if (sig_hup) {
- edebug((stderr, "int arrived\n"));
- sig_hup = 0;
- /*
- * signal the event thread
- */
- schedule_signal_event(SIGHUP);
- }
-
- }
- break;
- case 0: /* timeout - can't happen */
- break;
- default:
- edebug((stderr, "IO ready\n"));
- for (i = 0; i < n_highest; ++i) {
- if (FD_ISSET(i, &rfds)) {
- if (i == PIPE_READ_FD) {
- io_thread_msg buf;
- /*
- * a command arrived
- */
- edebug((stderr, "msg arrived\n"));
- if (read(PIPE_READ_FD, &buf, sizeof (buf)) != sizeof (buf))
- exit_fatal(1,
- "read error from msg pipe");
- switch (buf.command) {
- case IO_THR_MSG_TERMINATE:
- running = 0;
- break;
- case IO_THR_MSG_ADD_SELECT_RD:
- {
- PMC * const pio = buf.ev->u.io_event.pio;
- const int fd = Parrot_io_getfd(buf.ev->interp, pio);
- if (FD_ISSET(fd, &act_rfds)) {
- mem_internal_free(buf.ev);
- break;
- }
- FD_SET(fd, &act_rfds);
- if (fd >= n_highest)
- n_highest = fd + 1;
- store_io_event(&ios, buf.ev);
- }
- break;
- default:
- /* TODO */
- exit_fatal(1, "unhandled msg in pipe");
- break;
- }
-
- }
- else {
- /*
- * one of the io_event fds is ready
- * remove from active set, as we don't
- * want to fire again during io_handler
- * invocation
- */
- FD_CLR(i, &act_rfds);
- io_thread_ready_rd(&ios, i);
- }
- }
- }
- /* TODO check fds */
- break;
- }
- }
- edebug((stderr, "IO thread terminated\n"));
- close(PIPE_READ_FD);
- close(PIPE_WRITE_FD);
- return NULL;
-}
-#endif
-
-/*
-
-=item C<static void stop_io_thread(void)>
-
-Tell the IO thread to stop.
-
-=cut
-
-*/
-
-static void
-stop_io_thread(void)
-{
- ASSERT_ARGS(stop_io_thread)
-#ifndef WIN32
- io_thread_msg buf;
- /*
- * tell IO thread to stop
- */
- memset(&buf, 0, sizeof (buf));
- buf.command = IO_THR_MSG_TERMINATE;
- if (write(PIPE_WRITE_FD, &buf, sizeof (buf)) != sizeof (buf))
- exit_fatal(1, "msg pipe write failed");
-#endif
-}
-
-/*
-
-=item C<void Parrot_event_add_io_event(PARROT_INTERP, PMC *pio, PMC *sub, PMC
-*data, INTVAL which)>
-
-Create new i/o event.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-void
-Parrot_event_add_io_event(PARROT_INTERP,
- ARGIN_NULLOK(PMC *pio), ARGIN_NULLOK(PMC *sub), ARGIN_NULLOK(PMC *data), INTVAL which)
-{
- ASSERT_ARGS(Parrot_event_add_io_event)
- io_thread_msg buf;
- parrot_event * const event = mem_internal_allocate_typed(parrot_event);
-
- event->type = EVENT_TYPE_IO;
- event->interp = interp;
- /*
- * TODO gc_register these PMCs as long as the event system
- * owns these 3
- * unregister, when event is passed to interp again
- */
- event->u.io_event.pio = pio;
- event->u.io_event.handler = sub;
- event->u.io_event.user_data = data;
-
- buf.command = which;
- buf.ev = event;
- /* XXX Why isn't this entire function inside an ifndef WIN32? */
-#ifndef WIN32
- if (write(PIPE_WRITE_FD, &buf, sizeof (buf)) != sizeof (buf))
- Parrot_ex_throw_from_c_args(interp, NULL, 1, "msg pipe write failed");
-#endif
-}
-
-
-/*
-
-=back
-
-=head2 Event Handler Thread Functions
-
-=over 4
-
-=item C<static QUEUE_ENTRY* dup_entry(const QUEUE_ENTRY *entry)>
-
-Duplicate queue entry.
-
-=cut
-
-*/
-
-PARROT_MALLOC
-PARROT_CANNOT_RETURN_NULL
-static QUEUE_ENTRY*
-dup_entry(ARGIN(const QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(dup_entry)
- QUEUE_ENTRY * const new_entry = mem_internal_allocate_typed(QUEUE_ENTRY);
-
- new_entry->next = NULL;
- new_entry->type = entry->type;
- new_entry->data = mem_internal_allocate_typed(parrot_event);
-
- mem_sys_memcopy(new_entry->data, entry->data, sizeof (parrot_event));
- return new_entry;
-}
-
-/*
-
-=item C<static QUEUE_ENTRY* dup_entry_interval(QUEUE_ENTRY *entry, FLOATVAL
-now)>
-
-Duplicate timed entry and add interval to C<abs_time>.
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-static QUEUE_ENTRY*
-dup_entry_interval(ARGIN(QUEUE_ENTRY *entry), FLOATVAL now)
-{
- ASSERT_ARGS(dup_entry_interval)
- QUEUE_ENTRY * const new_entry = dup_entry(entry);
- parrot_event * const event = (parrot_event *)new_entry->data;
-
- event->u.timer_event.abs_time = now + event->u.timer_event.interval;
-
- return new_entry;
-}
-
-/*
-
-=item C<static int process_events(QUEUE *event_q)>
-
-Do something, when an event arrived caller has locked the mutex returns
-0 if event thread terminates.
-
-=cut
-
-*/
-
-static int
-process_events(ARGMOD(QUEUE *event_q))
-{
- ASSERT_ARGS(process_events)
- FLOATVAL now;
- QUEUE_ENTRY *entry;
-
- while ((entry = peek_entry(event_q)) != NULL) {
- /*
- * one or more entries arrived - we hold the mutex again
- * so we have to use the nonsyc_pop_entry to pop off event entries
- */
- parrot_event *event = NULL;
-
- switch (entry->type) {
- case QUEUE_ENTRY_TYPE_EVENT:
- entry = nosync_pop_entry(event_q);
- event = (parrot_event *)entry->data;
- break;
-
- case QUEUE_ENTRY_TYPE_TIMED_EVENT:
- event = (parrot_event *)entry->data;
- now = Parrot_floatval_time();
-
- /*
- * if the timer_event isn't due yet, ignore the event
- * (we were signalled on insert of the event)
- * wait until we get at it again when time has elapsed
- */
- if (now < event->u.timer_event.abs_time)
- return 1;
- entry = nosync_pop_entry(event_q);
-
- /* if event is repeated dup and reinsert it */
-
- if (event->u.timer_event.interval) {
- if (event->u.timer_event.repeat) {
- if (event->u.timer_event.repeat != -1)
- event->u.timer_event.repeat--;
- nosync_insert_entry(event_q,
- dup_entry_interval(entry, now));
- }
- }
- break;
- default:
- exit_fatal(1, "Unknown queue entry");
- }
- PARROT_ASSERT(event);
- if (event->type == EVENT_TYPE_NONE) {
- mem_internal_free(entry);
- mem_internal_free(event);
- continue;
- }
- else if (event->type == EVENT_TYPE_EVENT_TERMINATE) {
- mem_internal_free(entry);
- mem_internal_free(event);
-
- return 0;
- }
- /*
- * now insert entry in interpreter task queue
- */
- if (event->interp) {
- Parrot_schedule_interp_qentry(event->interp, entry);
- }
- else {
- Parrot_schedule_broadcast_qentry(entry);
- }
- } /* while events */
- return 1;
-}
-
-/*
-
-=item C<static void* event_thread(void *data)>
-
-The event thread is started by the first interpreter. It handles all
-events for all interpreters.
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static void*
-event_thread(ARGMOD(void *data))
-{
- ASSERT_ARGS(event_thread)
- QUEUE * const event_q = (QUEUE *) data;
- int running = 1;
-
- LOCK(event_q->queue_mutex);
- /*
- * we might already have an event in the queue
- */
- if (peek_entry(event_q))
- running = process_events(event_q);
- while (running) {
- QUEUE_ENTRY * const entry = peek_entry(event_q);
-
- if (!entry) {
- /* wait infinite until entry arrives */
- queue_wait(event_q);
- }
- else if (entry->type == QUEUE_ENTRY_TYPE_TIMED_EVENT) {
- /* do a_timedwait for entry */
- struct timespec abs_time;
- parrot_event * const event = (parrot_event*)entry->data;
- const FLOATVAL when = event->u.timer_event.abs_time;
-
- abs_time.tv_sec = (time_t) when;
- abs_time.tv_nsec = (long)((when - abs_time.tv_sec)*1000.0f)
- *1000L*1000L;
- queue_timedwait(event_q, &abs_time);
- }
- else {
- /* we shouldn't get here probably
- */
- exit_fatal(1, "Spurious event");
-
- }
- /*
- * one or more entries arrived - we hold the mutex again
- * so we have to use the nonsync_pop_entry to pop off event entries
- */
- running = process_events(event_q);
- } /* event loop */
- /*
- * the main interpreter is dying
- * TODO empty the queue
- */
- UNLOCK(event_q->queue_mutex);
- queue_destroy(event_q);
- stop_io_thread();
- edebug((stderr, "event thread stopped\n"));
- return NULL;
-}
-
-/*
-
-=back
-
-=head2 Sleep Handling
-
-=over 4
-
-=item C<static opcode_t * wait_for_wakeup(PARROT_INTERP, opcode_t *next)>
-
-Sleep on the event queue condition. If an event arrives, the event
-is processed. Terminate the loop if sleeping is finished.
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static opcode_t *
-wait_for_wakeup(PARROT_INTERP, ARGIN_NULLOK(opcode_t *next))
-{
- ASSERT_ARGS(wait_for_wakeup)
- QUEUE * const tq = interp->task_queue;
-
- interp->sleeping = 1;
-
- /*
- * event handler like callbacks or timers are run as normal code
- * so inside such an event handler function, another event might get
- * handled, which is good (higher priority events can interrupt
- * other event handler). OTOH we must ensure that all state changes
- * are done in do_event and we should probably suspend nested
- * event handlers sometimes
- *
- * FIXME: the same is true for the *next param:
- * get rid of that, instead mangle the resume flags
- * and offset to stop the runloop
- *
- */
-
- while (interp->sleeping) {
- QUEUE_ENTRY * const entry = wait_for_entry(tq);
- parrot_event * const event = (parrot_event*)entry->data;
-
- mem_internal_free(entry);
- edebug((stderr, "got ev %s head : %p\n", et(event), tq->head));
- next = do_event(interp, event, next);
- }
-
- edebug((stderr, "woke up\n"));
- return next;
-}
-
-/*
-
-=item C<opcode_t * Parrot_sleep_on_event(PARROT_INTERP, FLOATVAL t, opcode_t
-*next)>
-
-Go to sleep. This is called from the C<sleep> opcode.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t *
-Parrot_sleep_on_event(PARROT_INTERP, FLOATVAL t, ARGIN_NULLOK(opcode_t *next))
-{
- ASSERT_ARGS(Parrot_sleep_on_event)
-#ifdef PARROT_HAS_THREADS
-
- if (interp->sleeping)
- fprintf(stderr, "nested sleep might not work\n");
- /*
- * place the opcode_t* next arg in the event data, so that
- * we can identify this event in wakeup
- */
- Parrot_new_timer_event(interp, (PMC *) next, t, 0.0, 0,
- NULL, EVENT_TYPE_SLEEP);
- next = wait_for_wakeup(interp, next);
-#else
- /*
- * TODO check for nanosleep or such
- */
- Parrot_sleep((UINTVAL) ceil(t));
-#endif
- return next;
-}
-
-/*
-
-=back
-
-=head2 Event Handling for Run-Loops
-
-=over 4
-
-=item C<opcode_t * Parrot_do_check_events(PARROT_INTERP, opcode_t *next)>
-
-Explicitly C<sync> called by the check_event opcode from run loops.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t *
-Parrot_do_check_events(PARROT_INTERP, ARGIN_NULLOK(opcode_t *next))
-{
- ASSERT_ARGS(Parrot_do_check_events)
- if (peek_entry(interp->task_queue))
- return Parrot_do_handle_events(interp, 0, next);
-
- return next;
-}
-
-/*
-
-=item C<static void event_to_exception(PARROT_INTERP, const parrot_event*
-event)>
-
-Convert event to exception and throw it.
-
-=cut
-
-*/
-
-static void
-event_to_exception(PARROT_INTERP, ARGIN(const parrot_event* event))
-{
- ASSERT_ARGS(event_to_exception)
- const int exit_code = -event->u.signal;
-
- switch (event->u.signal) {
- case SIGINT:
- case SIGHUP:
- /*
- * SIGINT is silent, if no exception handler is
- * installed: set severity to EXCEPT_exit
- */
- {
- STRING * const message = CONST_STRING(interp, "Caught signal.");
- PMC *exception = Parrot_ex_build_exception(interp,
- EXCEPT_exit, exit_code, message);
-
- Parrot_ex_throw_from_c(interp, exception);
- }
- break;
- default:
- Parrot_ex_throw_from_c_args(interp, NULL, exit_code,
- "Caught signal.");
- break;
- }
-}
-
-/*
-
-=item C<static opcode_t * do_event(PARROT_INTERP, parrot_event* event, opcode_t
-*next)>
-
-Run user code or such. The C<event> argument is freed after execution.
-
-TODO: Instrument with splint args so splint knows event gets released.
-
-=cut
-
-*/
-
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-static opcode_t *
-do_event(PARROT_INTERP, ARGIN(parrot_event* event), ARGIN_NULLOK(opcode_t *next))
-{
- ASSERT_ARGS(do_event)
- edebug((stderr, "do_event %s\n", et(event)));
- switch (event->type) {
- case EVENT_TYPE_TERMINATE:
- next = NULL; /* this will terminate the run loop */
- break;
- case EVENT_TYPE_SIGNAL:
- interp->sleeping = 0;
- /* generate exception */
- event_to_exception(interp, event);
- /* not reached - will longjmp */
- break;
- case EVENT_TYPE_TIMER:
- /* run ops, save registers */
- Parrot_pcc_invoke_sub_from_c_args(interp,
- event->u.timer_event.sub, "->");
- break;
- case EVENT_TYPE_CALL_BACK:
- edebug((stderr, "starting user cb\n"));
- Parrot_run_callback(interp, event->u.call_back.cbi,
- event->u.call_back.external_data);
- break;
- case EVENT_TYPE_IO:
- edebug((stderr, "starting io handler\n"));
- Parrot_pcc_invoke_sub_from_c_args(interp,
- event->u.io_event.handler,
- "PP->",
- event->u.io_event.pio,
- event->u.io_event.user_data);
- break;
- case EVENT_TYPE_SLEEP:
- interp->sleeping = 0;
- break;
- case EVENT_TYPE_SUSPEND_FOR_GC:
- edebug((stderr, "suspend for gc\n"));
- pt_suspend_self_for_gc(interp);
- break;
- default:
- fprintf(stderr, "Unhandled event type %d\n", (int)event->type);
- break;
- }
- mem_internal_free(event);
- return next;
-}
-
-/*
-
-=item C<opcode_t * Parrot_do_handle_events(PARROT_INTERP, int restore, opcode_t
-*next)>
-
-Called by the C<check_event__> opcode from run loops or from above. When
-called from the C<check_events__> opcode, we have to restore the
-C<op_func_table>.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CAN_RETURN_NULL
-opcode_t *
-Parrot_do_handle_events(PARROT_INTERP, int restore, ARGIN_NULLOK(opcode_t *next))
-{
- ASSERT_ARGS(Parrot_do_handle_events)
- QUEUE * const tq = interp->task_queue;
-
- if (restore)
- disable_event_checking(interp);
-
- if (!peek_entry(tq))
- return next;
-
- while (peek_entry(tq)) {
- QUEUE_ENTRY * const entry = pop_entry(tq);
- parrot_event * const event = (parrot_event*)entry->data;
-
- mem_internal_free(entry);
- next = do_event(interp, event, next);
- }
-
- return next;
-}
-
-/*
-
-=back
-
-=head1 SEE ALSO
-
-F<include/parrot/events.h> and F<docs/dev/events.pod>.
-
-=cut
-
-*/
-
-
-/*
- * Local variables:
- * c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
Modified: branches/rm_cflags/src/ops/core.ops
==============================================================================
--- branches/rm_cflags/src/ops/core.ops Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/src/ops/core.ops Thu Mar 4 20:51:45 2010 (r44632)
@@ -88,16 +88,6 @@
Don't use.
(Must be op #5, CORE_OPS_wrapper__).
-=item B<prederef__>()
-
-Internal opcode to prederef opcodes on the fly.
-Don't use.
-(Must be op #6, CORE_OPS_prederef__).
-
-=item B<reserved>(inconst INT)
-
-Reserve 1 more fix entry.
-
=item B<load_bytecode>(in STR)
Load Parrot bytecode from file $1, and search the library path to locate the
@@ -148,21 +138,6 @@
goto ADDRESS(pc);
}
-inline op prederef__() :internal :flow {
- opcode_t * const _this = CUR_OPCODE;
- if (PARROT_RUNCORE_CGOTO_OPS_TEST(interp->run_core)) {
- /* must be CGP then - check for events in not yet prederefed code */
- Parrot_cx_runloop_wake(interp, interp->scheduler);
- /* _this = CHECK_EVENTS(interp, _this); */
- }
- do_prederef((void**)cur_opcode, interp, interp->run_core);
- goto ADDRESS(_this); /* force this being a branch op */
-}
-
-inline op reserved(inconst INT) {
- /* reserve 1 entries */
-}
-
inline op load_bytecode(in STR) :load_file {
Parrot_load_bytecode(interp, $1);
}
Modified: branches/rm_cflags/src/ops/ops.num
==============================================================================
--- branches/rm_cflags/src/ops/ops.num Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/src/ops/ops.num Thu Mar 4 20:51:45 2010 (r44632)
@@ -26,1251 +26,1249 @@
check_events 3
check_events__ 4
wrapper__ 5
-prederef__ 6
-reserved_ic 7
###DYNAMIC### other ops
-load_bytecode_s 8
-load_bytecode_sc 9
-load_language_s 10
-load_language_sc 11
-branch_i 12
-branch_ic 13
-local_branch_p_i 14
-local_branch_p_ic 15
-local_return_p 16
-jump_i 17
-jump_ic 18
-enternative 19
-if_i_ic 20
-if_n_ic 21
-if_s_ic 22
-if_p_ic 23
-unless_i_ic 24
-unless_n_ic 25
-unless_s_ic 26
-unless_p_ic 27
-invokecc_p 28
-invoke_p_p 29
-yield 30
-tailcall_p 31
-returncc 32
-capture_lex_p 33
-newclosure_p_p 34
-set_args_pc 35
-get_results_pc 36
-get_params_pc 37
-set_returns_pc 38
-result_info_p 39
-set_addr_i_ic 40
-set_addr_p_ic 41
-set_addr_p_i 42
-get_addr_i_p 43
-schedule_p 44
-addhandler_p 45
-push_eh_ic 46
-push_eh_p 47
-pop_eh 48
-throw_p 49
-throw_p_p 50
-rethrow_p 51
-count_eh_i 52
-die_s 53
-die_sc 54
-die_p 55
-die_pc 56
-die_i_i 57
-die_ic_i 58
-die_i_ic 59
-die_ic_ic 60
-exit_i 61
-exit_ic 62
-pushmark_i 63
-pushmark_ic 64
-popmark_i 65
-popmark_ic 66
-pushaction_p 67
-debug_i 68
-debug_ic 69
-bounds_i 70
-bounds_ic 71
-profile_i 72
-profile_ic 73
-trace_i 74
-trace_ic 75
-gc_debug_i 76
-gc_debug_ic 77
-interpinfo_i_i 78
-interpinfo_i_ic 79
-interpinfo_p_i 80
-interpinfo_p_ic 81
-interpinfo_s_i 82
-interpinfo_s_ic 83
-warningson_i 84
-warningson_ic 85
-warningsoff_i 86
-warningsoff_ic 87
-errorson_i 88
-errorson_ic 89
-errorsoff_i 90
-errorsoff_ic 91
-runinterp_p_i 92
-runinterp_p_ic 93
-getinterp_p 94
-sweep_ic 95
-collect 96
-sweepoff 97
-sweepon 98
-collectoff 99
-collecton 100
-needs_destroy_p 101
-loadlib_p_s 102
-loadlib_p_sc 103
-dlfunc_p_p_s_s 104
-dlfunc_p_p_sc_s 105
-dlfunc_p_p_s_sc 106
-dlfunc_p_p_sc_sc 107
-dlvar_p_p_s 108
-dlvar_p_p_sc 109
-compreg_s_p 110
-compreg_sc_p 111
-compreg_p_s 112
-compreg_p_sc 113
-new_callback_p_p_p_s 114
-new_callback_p_p_p_sc 115
-annotations_p 116
-annotations_p_s 117
-annotations_p_sc 118
-band_i_i 119
-band_i_ic 120
-band_p_i 121
-band_p_ic 122
-band_p_p 123
-band_i_i_i 124
-band_i_ic_i 125
-band_i_i_ic 126
-band_p_p_i 127
-band_p_p_ic 128
-band_p_p_p 129
-bands_s_s 130
-bands_s_sc 131
-bands_p_s 132
-bands_p_sc 133
-bands_p_p 134
-bands_s_s_s 135
-bands_s_sc_s 136
-bands_s_s_sc 137
-bands_p_p_s 138
-bands_p_p_sc 139
-bands_p_p_p 140
-bnot_i 141
-bnot_i_i 142
-bnot_p 143
-bnot_p_p 144
-bnots_s 145
-bnots_s_s 146
-bnots_s_sc 147
-bnots_p 148
-bnots_p_p 149
-bor_i_i 150
-bor_i_ic 151
-bor_p_i 152
-bor_p_ic 153
-bor_p_p 154
-bor_i_i_i 155
-bor_i_ic_i 156
-bor_i_i_ic 157
-bor_p_p_i 158
-bor_p_p_ic 159
-bor_p_p_p 160
-bors_s_s 161
-bors_s_sc 162
-bors_p_s 163
-bors_p_sc 164
-bors_p_p 165
-bors_s_s_s 166
-bors_s_sc_s 167
-bors_s_s_sc 168
-bors_p_p_s 169
-bors_p_p_sc 170
-bors_p_p_p 171
-shl_i_i 172
-shl_i_ic 173
-shl_p_i 174
-shl_p_ic 175
-shl_p_p 176
-shl_i_i_i 177
-shl_i_ic_i 178
-shl_i_i_ic 179
-shl_p_p_i 180
-shl_p_p_ic 181
-shl_p_p_p 182
-shr_i_i 183
-shr_i_ic 184
-shr_p_i 185
-shr_p_ic 186
-shr_p_p 187
-shr_i_i_i 188
-shr_i_ic_i 189
-shr_i_i_ic 190
-shr_p_p_i 191
-shr_p_p_ic 192
-shr_p_p_p 193
-lsr_i_i 194
-lsr_i_ic 195
-lsr_p_i 196
-lsr_p_ic 197
-lsr_p_p 198
-lsr_i_i_i 199
-lsr_i_ic_i 200
-lsr_i_i_ic 201
-lsr_p_p_i 202
-lsr_p_p_ic 203
-lsr_p_p_p 204
-rot_i_i_i_ic 205
-rot_i_ic_i_ic 206
-rot_i_i_ic_ic 207
-bxor_i_i 208
-bxor_i_ic 209
-bxor_p_i 210
-bxor_p_ic 211
-bxor_p_p 212
-bxor_i_i_i 213
-bxor_i_ic_i 214
-bxor_i_i_ic 215
-bxor_p_p_i 216
-bxor_p_p_ic 217
-bxor_p_p_p 218
-bxors_s_s 219
-bxors_s_sc 220
-bxors_p_s 221
-bxors_p_sc 222
-bxors_p_p 223
-bxors_s_s_s 224
-bxors_s_sc_s 225
-bxors_s_s_sc 226
-bxors_p_p_s 227
-bxors_p_p_sc 228
-bxors_p_p_p 229
-eq_i_i_ic 230
-eq_ic_i_ic 231
-eq_i_ic_ic 232
-eq_n_n_ic 233
-eq_nc_n_ic 234
-eq_n_nc_ic 235
-eq_s_s_ic 236
-eq_sc_s_ic 237
-eq_s_sc_ic 238
-eq_p_p_ic 239
-eq_p_i_ic 240
-eq_p_ic_ic 241
-eq_p_n_ic 242
-eq_p_nc_ic 243
-eq_p_s_ic 244
-eq_p_sc_ic 245
-eq_str_p_p_ic 246
-eq_num_p_p_ic 247
-eq_addr_s_s_ic 248
-eq_addr_sc_s_ic 249
-eq_addr_s_sc_ic 250
-eq_addr_sc_sc_ic 251
-eq_addr_p_p_ic 252
-ne_i_i_ic 253
-ne_ic_i_ic 254
-ne_i_ic_ic 255
-ne_n_n_ic 256
-ne_nc_n_ic 257
-ne_n_nc_ic 258
-ne_s_s_ic 259
-ne_sc_s_ic 260
-ne_s_sc_ic 261
-ne_p_p_ic 262
-ne_p_i_ic 263
-ne_p_ic_ic 264
-ne_p_n_ic 265
-ne_p_nc_ic 266
-ne_p_s_ic 267
-ne_p_sc_ic 268
-ne_str_p_p_ic 269
-ne_num_p_p_ic 270
-ne_addr_s_s_ic 271
-ne_addr_sc_s_ic 272
-ne_addr_s_sc_ic 273
-ne_addr_sc_sc_ic 274
-ne_addr_p_p_ic 275
-lt_i_i_ic 276
-lt_ic_i_ic 277
-lt_i_ic_ic 278
-lt_n_n_ic 279
-lt_nc_n_ic 280
-lt_n_nc_ic 281
-lt_s_s_ic 282
-lt_sc_s_ic 283
-lt_s_sc_ic 284
-lt_p_p_ic 285
-lt_p_i_ic 286
-lt_p_ic_ic 287
-lt_p_n_ic 288
-lt_p_nc_ic 289
-lt_p_s_ic 290
-lt_p_sc_ic 291
-lt_str_p_p_ic 292
-lt_num_p_p_ic 293
-le_i_i_ic 294
-le_ic_i_ic 295
-le_i_ic_ic 296
-le_n_n_ic 297
-le_nc_n_ic 298
-le_n_nc_ic 299
-le_s_s_ic 300
-le_sc_s_ic 301
-le_s_sc_ic 302
-le_p_p_ic 303
-le_p_i_ic 304
-le_p_ic_ic 305
-le_p_n_ic 306
-le_p_nc_ic 307
-le_p_s_ic 308
-le_p_sc_ic 309
-le_str_p_p_ic 310
-le_num_p_p_ic 311
-gt_p_p_ic 312
-gt_p_i_ic 313
-gt_p_ic_ic 314
-gt_p_n_ic 315
-gt_p_nc_ic 316
-gt_p_s_ic 317
-gt_p_sc_ic 318
-gt_str_p_p_ic 319
-gt_num_p_p_ic 320
-ge_p_p_ic 321
-ge_p_i_ic 322
-ge_p_ic_ic 323
-ge_p_n_ic 324
-ge_p_nc_ic 325
-ge_p_s_ic 326
-ge_p_sc_ic 327
-ge_str_p_p_ic 328
-ge_num_p_p_ic 329
-if_null_p_ic 330
-if_null_s_ic 331
-unless_null_p_ic 332
-unless_null_s_ic 333
-cmp_i_i_i 334
-cmp_i_ic_i 335
-cmp_i_i_ic 336
-cmp_i_n_n 337
-cmp_i_nc_n 338
-cmp_i_n_nc 339
-cmp_i_s_s 340
-cmp_i_sc_s 341
-cmp_i_s_sc 342
-cmp_i_p_p 343
-cmp_i_p_i 344
-cmp_i_p_ic 345
-cmp_i_p_n 346
-cmp_i_p_nc 347
-cmp_i_p_s 348
-cmp_i_p_sc 349
-cmp_str_i_p_p 350
-cmp_num_i_p_p 351
-cmp_pmc_p_p_p 352
-issame_i_p_p 353
-issame_i_s_s 354
-issame_i_sc_s 355
-issame_i_s_sc 356
-issame_i_sc_sc 357
-isntsame_i_p_p 358
-isntsame_i_s_s 359
-isntsame_i_sc_s 360
-isntsame_i_s_sc 361
-isntsame_i_sc_sc 362
-istrue_i_p 363
-isfalse_i_p 364
-isnull_i_p 365
-isnull_i_pc 366
-isnull_i_s 367
-isnull_i_sc 368
-isgt_i_p_p 369
-isge_i_p_p 370
-isle_i_i_i 371
-isle_i_ic_i 372
-isle_i_i_ic 373
-isle_i_n_n 374
-isle_i_nc_n 375
-isle_i_n_nc 376
-isle_i_s_s 377
-isle_i_sc_s 378
-isle_i_s_sc 379
-isle_i_p_p 380
-islt_i_i_i 381
-islt_i_ic_i 382
-islt_i_i_ic 383
-islt_i_n_n 384
-islt_i_nc_n 385
-islt_i_n_nc 386
-islt_i_s_s 387
-islt_i_sc_s 388
-islt_i_s_sc 389
-islt_i_p_p 390
-iseq_i_i_i 391
-iseq_i_ic_i 392
-iseq_i_i_ic 393
-iseq_i_n_n 394
-iseq_i_nc_n 395
-iseq_i_n_nc 396
-iseq_i_s_s 397
-iseq_i_sc_s 398
-iseq_i_s_sc 399
-iseq_i_p_p 400
-isne_i_i_i 401
-isne_i_ic_i 402
-isne_i_i_ic 403
-isne_i_n_n 404
-isne_i_nc_n 405
-isne_i_n_nc 406
-isne_i_s_s 407
-isne_i_sc_s 408
-isne_i_s_sc 409
-isne_i_p_p 410
-and_i_i_i 411
-and_i_ic_i 412
-and_i_i_ic 413
-and_p_p_p 414
-not_i 415
-not_i_i 416
-not_p 417
-not_p_p 418
-or_i_i_i 419
-or_i_ic_i 420
-or_i_i_ic 421
-or_p_p_p 422
-xor_i_i_i 423
-xor_i_ic_i 424
-xor_i_i_ic 425
-xor_p_p_p 426
-debug_init 427
-debug_load_sc 428
-debug_break 429
-debug_print 430
-backtrace 431
-getline_i 432
-getfile_s 433
-set_label_p_ic 434
-get_label_i_p 435
-close_p 436
-fdopen_p_i_s 437
-fdopen_p_ic_s 438
-fdopen_p_i_sc 439
-fdopen_p_ic_sc 440
-getstdin_p 441
-getstdout_p 442
-getstderr_p 443
-setstdin_p 444
-setstdout_p 445
-setstderr_p 446
-open_p_s_s 447
-open_p_sc_s 448
-open_p_s_sc 449
-open_p_sc_sc 450
-open_p_s 451
-open_p_sc 452
-print_i 453
-print_ic 454
-print_n 455
-print_nc 456
-print_s 457
-print_sc 458
-print_p 459
-say_i 460
-say_ic 461
-say_n 462
-say_nc 463
-say_s 464
-say_sc 465
-say_p 466
-printerr_i 467
-printerr_ic 468
-printerr_n 469
-printerr_nc 470
-printerr_s 471
-printerr_sc 472
-printerr_p 473
-print_p_i 474
-print_p_ic 475
-print_p_n 476
-print_p_nc 477
-print_p_s 478
-print_p_sc 479
-print_p_p 480
-read_s_i 481
-read_s_ic 482
-read_s_p_i 483
-read_s_p_ic 484
-readline_s_p 485
-peek_s 486
-peek_s_p 487
-stat_i_s_i 488
-stat_i_sc_i 489
-stat_i_s_ic 490
-stat_i_sc_ic 491
-stat_i_i_i 492
-stat_i_ic_i 493
-stat_i_i_ic 494
-stat_i_ic_ic 495
-seek_p_i_i 496
-seek_p_ic_i 497
-seek_p_i_ic 498
-seek_p_ic_ic 499
-seek_p_i_i_i 500
-seek_p_ic_i_i 501
-seek_p_i_ic_i 502
-seek_p_ic_ic_i 503
-seek_p_i_i_ic 504
-seek_p_ic_i_ic 505
-seek_p_i_ic_ic 506
-seek_p_ic_ic_ic 507
-tell_i_p 508
-tell_i_i_p 509
-abs_i 510
-abs_n 511
-abs_i_i 512
-abs_n_n 513
-abs_p 514
-abs_p_p 515
-add_i_i 516
-add_i_ic 517
-add_n_n 518
-add_n_nc 519
-add_p_p 520
-add_p_i 521
-add_p_ic 522
-add_p_n 523
-add_p_nc 524
-add_i_i_i 525
-add_i_ic_i 526
-add_i_i_ic 527
-add_n_n_n 528
-add_n_nc_n 529
-add_n_n_nc 530
-add_p_p_p 531
-add_p_p_i 532
-add_p_p_ic 533
-add_p_p_n 534
-add_p_p_nc 535
-cmod_i_i_i 536
-cmod_i_ic_i 537
-cmod_i_i_ic 538
-cmod_p_p_i 539
-cmod_p_p_ic 540
-cmod_p_p_p 541
-cmod_n_n_n 542
-cmod_n_nc_n 543
-cmod_n_n_nc 544
-cmod_p_p_n 545
-cmod_p_p_nc 546
-dec_i 547
-dec_n 548
-dec_p 549
-div_i_i 550
-div_i_ic 551
-div_n_n 552
-div_n_nc 553
-div_p_p 554
-div_p_i 555
-div_p_ic 556
-div_p_n 557
-div_p_nc 558
-div_i_i_i 559
-div_i_ic_i 560
-div_i_i_ic 561
-div_i_ic_ic 562
-div_n_n_n 563
-div_n_nc_n 564
-div_n_n_nc 565
-div_n_nc_nc 566
-div_p_p_p 567
-div_p_p_i 568
-div_p_p_ic 569
-div_p_p_n 570
-div_p_p_nc 571
-fdiv_i_i 572
-fdiv_i_ic 573
-fdiv_n_n 574
-fdiv_n_nc 575
-fdiv_p_p 576
-fdiv_p_i 577
-fdiv_p_ic 578
-fdiv_p_n 579
-fdiv_p_nc 580
-fdiv_i_i_i 581
-fdiv_i_ic_i 582
-fdiv_i_i_ic 583
-fdiv_n_n_n 584
-fdiv_n_nc_n 585
-fdiv_n_n_nc 586
-fdiv_p_p_p 587
-fdiv_p_p_i 588
-fdiv_p_p_ic 589
-fdiv_p_p_n 590
-fdiv_p_p_nc 591
-ceil_n 592
-ceil_i_n 593
-ceil_n_n 594
-floor_n 595
-floor_i_n 596
-floor_n_n 597
-inc_i 598
-inc_n 599
-inc_p 600
-mod_i_i 601
-mod_i_ic 602
-mod_n_n 603
-mod_n_nc 604
-mod_p_p 605
-mod_p_i 606
-mod_p_ic 607
-mod_p_n 608
-mod_p_nc 609
-mod_i_i_i 610
-mod_i_ic_i 611
-mod_i_i_ic 612
-mod_n_n_n 613
-mod_n_nc_n 614
-mod_n_n_nc 615
-mod_p_p_p 616
-mod_p_p_i 617
-mod_p_p_ic 618
-mod_p_p_n 619
-mod_p_p_nc 620
-mul_i_i 621
-mul_i_ic 622
-mul_n_n 623
-mul_n_nc 624
-mul_p_p 625
-mul_p_i 626
-mul_p_ic 627
-mul_p_n 628
-mul_p_nc 629
-mul_i_i_i 630
-mul_i_ic_i 631
-mul_i_i_ic 632
-mul_n_n_n 633
-mul_n_nc_n 634
-mul_n_n_nc 635
-mul_p_p_p 636
-mul_p_p_i 637
-mul_p_p_ic 638
-mul_p_p_n 639
-mul_p_p_nc 640
-neg_i 641
-neg_n 642
-neg_p 643
-neg_i_i 644
-neg_n_n 645
-neg_p_p 646
-pow_n_n_n 647
-pow_n_nc_n 648
-pow_n_n_nc 649
-pow_p_p_p 650
-pow_p_p_i 651
-pow_p_p_ic 652
-pow_p_p_n 653
-pow_p_p_nc 654
-pow_n_n_i 655
-pow_n_nc_i 656
-pow_n_n_ic 657
-pow_n_nc_ic 658
-sub_i_i 659
-sub_i_ic 660
-sub_n_n 661
-sub_n_nc 662
-sub_p_p 663
-sub_p_i 664
-sub_p_ic 665
-sub_p_n 666
-sub_p_nc 667
-sub_i_i_i 668
-sub_i_ic_i 669
-sub_i_i_ic 670
-sub_n_n_n 671
-sub_n_nc_n 672
-sub_n_n_nc 673
-sub_p_p_p 674
-sub_p_p_i 675
-sub_p_p_ic 676
-sub_p_p_n 677
-sub_p_p_nc 678
-sqrt_n_n 679
-acos_n_n 680
-asec_n_n 681
-asin_n_n 682
-atan_n_n 683
-atan_n_n_n 684
-atan_n_nc_n 685
-atan_n_n_nc 686
-cos_n_n 687
-cosh_n_n 688
-exp_n_n 689
-ln_n_n 690
-log10_n_n 691
-log2_n_n 692
-sec_n_n 693
-sech_n_n 694
-sin_n_n 695
-sinh_n_n 696
-tan_n_n 697
-tanh_n_n 698
-gcd_i_i_i 699
-gcd_i_ic_i 700
-gcd_i_i_ic 701
-lcm_i_i_i 702
-lcm_i_ic_i 703
-lcm_i_i_ic 704
-fact_i_i 705
-fact_n_i 706
-callmethodcc_p_s 707
-callmethodcc_p_sc 708
-callmethodcc_p_p 709
-callmethod_p_s_p 710
-callmethod_p_sc_p 711
-callmethod_p_p_p 712
-tailcallmethod_p_s 713
-tailcallmethod_p_sc 714
-tailcallmethod_p_p 715
-addmethod_p_s_p 716
-addmethod_p_sc_p 717
-can_i_p_s 718
-can_i_p_sc 719
-does_i_p_s 720
-does_i_p_sc 721
-does_i_p_p 722
-does_i_p_pc 723
-isa_i_p_s 724
-isa_i_p_sc 725
-isa_i_p_p 726
-isa_i_p_pc 727
-newclass_p_s 728
-newclass_p_sc 729
-newclass_p_p 730
-newclass_p_pc 731
-subclass_p_p 732
-subclass_p_pc 733
-subclass_p_p_s 734
-subclass_p_pc_s 735
-subclass_p_p_sc 736
-subclass_p_pc_sc 737
-subclass_p_p_p 738
-subclass_p_pc_p 739
-subclass_p_p_pc 740
-subclass_p_pc_pc 741
-subclass_p_s 742
-subclass_p_sc 743
-subclass_p_s_s 744
-subclass_p_sc_s 745
-subclass_p_s_sc 746
-subclass_p_sc_sc 747
-subclass_p_s_p 748
-subclass_p_sc_p 749
-subclass_p_s_pc 750
-subclass_p_sc_pc 751
-get_class_p_s 752
-get_class_p_sc 753
-get_class_p_p 754
-get_class_p_pc 755
-class_p_p 756
-addparent_p_p 757
-removeparent_p_p 758
-addrole_p_p 759
-addattribute_p_s 760
-addattribute_p_sc 761
-removeattribute_p_s 762
-removeattribute_p_sc 763
-getattribute_p_p_s 764
-getattribute_p_p_sc 765
-getattribute_p_p_p_s 766
-getattribute_p_p_pc_s 767
-getattribute_p_p_p_sc 768
-getattribute_p_p_pc_sc 769
-setattribute_p_s_p 770
-setattribute_p_sc_p 771
-setattribute_p_p_s_p 772
-setattribute_p_pc_s_p 773
-setattribute_p_p_sc_p 774
-setattribute_p_pc_sc_p 775
-inspect_p_p 776
-inspect_p_pc 777
-inspect_p_p_s 778
-inspect_p_pc_s 779
-inspect_p_p_sc 780
-inspect_p_pc_sc 781
-new_p_s 782
-new_p_sc 783
-new_p_s_p 784
-new_p_sc_p 785
-new_p_s_pc 786
-new_p_sc_pc 787
-new_p_p 788
-new_p_pc 789
-new_p_p_p 790
-new_p_pc_p 791
-new_p_p_pc 792
-new_p_pc_pc 793
-root_new_p_p 794
-root_new_p_pc 795
-root_new_p_p_p 796
-root_new_p_pc_p 797
-root_new_p_p_pc 798
-root_new_p_pc_pc 799
-typeof_s_p 800
-typeof_p_p 801
-get_repr_s_p 802
-find_method_p_p_s 803
-find_method_p_p_sc 804
-defined_i_p 805
-defined_i_p_ki 806
-defined_i_p_kic 807
-defined_i_p_k 808
-defined_i_p_kc 809
-exists_i_p_ki 810
-exists_i_p_kic 811
-exists_i_p_k 812
-exists_i_p_kc 813
-delete_p_k 814
-delete_p_kc 815
-delete_p_ki 816
-delete_p_kic 817
-elements_i_p 818
-push_p_i 819
-push_p_ic 820
-push_p_n 821
-push_p_nc 822
-push_p_s 823
-push_p_sc 824
-push_p_p 825
-pop_i_p 826
-pop_n_p 827
-pop_s_p 828
-pop_p_p 829
-unshift_p_i 830
-unshift_p_ic 831
-unshift_p_n 832
-unshift_p_nc 833
-unshift_p_s 834
-unshift_p_sc 835
-unshift_p_p 836
-shift_i_p 837
-shift_n_p 838
-shift_s_p 839
-shift_p_p 840
-splice_p_p_i_i 841
-splice_p_p_ic_i 842
-splice_p_p_i_ic 843
-splice_p_p_ic_ic 844
-setprop_p_s_p 845
-setprop_p_sc_p 846
-getprop_p_s_p 847
-getprop_p_sc_p 848
-delprop_p_s 849
-delprop_p_sc 850
-prophash_p_p 851
-freeze_s_p 852
-thaw_p_s 853
-thaw_p_sc 854
-add_multi_s_s_p 855
-add_multi_sc_s_p 856
-add_multi_s_sc_p 857
-add_multi_sc_sc_p 858
-find_multi_p_s_s 859
-find_multi_p_sc_s 860
-find_multi_p_s_sc 861
-find_multi_p_sc_sc 862
-register_p 863
-unregister_p 864
-box_p_i 865
-box_p_ic 866
-box_p_n 867
-box_p_nc 868
-box_p_s 869
-box_p_sc 870
-iter_p_p 871
-morph_p_p 872
-morph_p_pc 873
-clone_s_s 874
-clone_s_sc 875
-exchange_i_i 876
-exchange_p_p 877
-exchange_n_n 878
-exchange_s_s 879
-set_i_i 880
-set_i_ic 881
-set_i_n 882
-set_i_nc 883
-set_i_s 884
-set_i_sc 885
-set_n_n 886
-set_n_nc 887
-set_n_i 888
-set_n_ic 889
-set_n_s 890
-set_n_sc 891
-set_n_p 892
-set_s_p 893
-set_s_s 894
-set_s_sc 895
-set_s_i 896
-set_s_ic 897
-set_s_n 898
-set_s_nc 899
-set_p_pc 900
-set_p_p 901
-set_p_i 902
-set_p_ic 903
-set_p_n 904
-set_p_nc 905
-set_p_s 906
-set_p_sc 907
-set_i_p 908
-assign_p_p 909
-assign_p_i 910
-assign_p_ic 911
-assign_p_n 912
-assign_p_nc 913
-assign_p_s 914
-assign_p_sc 915
-assign_s_s 916
-assign_s_sc 917
-setref_p_p 918
-deref_p_p 919
-setp_ind_i_p 920
-setp_ind_ic_p 921
-setn_ind_i_n 922
-setn_ind_ic_n 923
-setn_ind_i_nc 924
-setn_ind_ic_nc 925
-sets_ind_i_s 926
-sets_ind_ic_s 927
-sets_ind_i_sc 928
-sets_ind_ic_sc 929
-seti_ind_i_i 930
-seti_ind_ic_i 931
-seti_ind_i_ic 932
-seti_ind_ic_ic 933
-set_p_ki_i 934
-set_p_kic_i 935
-set_p_ki_ic 936
-set_p_kic_ic 937
-set_p_ki_n 938
-set_p_kic_n 939
-set_p_ki_nc 940
-set_p_kic_nc 941
-set_p_ki_s 942
-set_p_kic_s 943
-set_p_ki_sc 944
-set_p_kic_sc 945
-set_p_ki_p 946
-set_p_kic_p 947
-set_i_p_ki 948
-set_i_p_kic 949
-set_n_p_ki 950
-set_n_p_kic 951
-set_s_p_ki 952
-set_s_p_kic 953
-set_p_p_ki 954
-set_p_p_kic 955
-set_p_k_i 956
-set_p_kc_i 957
-set_p_k_ic 958
-set_p_kc_ic 959
-set_p_k_n 960
-set_p_kc_n 961
-set_p_k_nc 962
-set_p_kc_nc 963
-set_p_k_s 964
-set_p_kc_s 965
-set_p_k_sc 966
-set_p_kc_sc 967
-set_p_k_p 968
-set_p_kc_p 969
-set_i_p_k 970
-set_i_p_kc 971
-set_n_p_k 972
-set_n_p_kc 973
-set_s_p_k 974
-set_s_p_kc 975
-set_p_p_k 976
-set_p_p_kc 977
-clone_p_p 978
-clone_p_p_p 979
-clone_p_p_pc 980
-copy_p_p 981
-null_s 982
-null_i 983
-null_p 984
-null_n 985
-cleari 986
-clearn 987
-clears 988
-clearp 989
-ord_i_s 990
-ord_i_sc 991
-ord_i_s_i 992
-ord_i_sc_i 993
-ord_i_s_ic 994
-ord_i_sc_ic 995
-chr_s_i 996
-chr_s_ic 997
-chopn_s_i 998
-chopn_s_ic 999
-chopn_s_s_i 1000
-chopn_s_sc_i 1001
-chopn_s_s_ic 1002
-chopn_s_sc_ic 1003
-concat_s_s 1004
-concat_s_sc 1005
-concat_p_p 1006
-concat_p_s 1007
-concat_p_sc 1008
-concat_s_s_s 1009
-concat_s_sc_s 1010
-concat_s_s_sc 1011
-concat_p_p_s 1012
-concat_p_p_sc 1013
-concat_p_p_p 1014
-repeat_s_s_i 1015
-repeat_s_sc_i 1016
-repeat_s_s_ic 1017
-repeat_s_sc_ic 1018
-repeat_p_p_i 1019
-repeat_p_p_ic 1020
-repeat_p_p_p 1021
-repeat_p_i 1022
-repeat_p_ic 1023
-repeat_p_p 1024
-length_i_s 1025
-length_i_sc 1026
-bytelength_i_s 1027
-bytelength_i_sc 1028
-pin_s 1029
-unpin_s 1030
-substr_s_s_i 1031
-substr_s_sc_i 1032
-substr_s_s_ic 1033
-substr_s_sc_ic 1034
-substr_s_s_i_i 1035
-substr_s_sc_i_i 1036
-substr_s_s_ic_i 1037
-substr_s_sc_ic_i 1038
-substr_s_s_i_ic 1039
-substr_s_sc_i_ic 1040
-substr_s_s_ic_ic 1041
-substr_s_sc_ic_ic 1042
-substr_s_s_i_i_s 1043
-substr_s_s_ic_i_s 1044
-substr_s_s_i_ic_s 1045
-substr_s_s_ic_ic_s 1046
-substr_s_s_i_i_sc 1047
-substr_s_s_ic_i_sc 1048
-substr_s_s_i_ic_sc 1049
-substr_s_s_ic_ic_sc 1050
-substr_s_i_i_s 1051
-substr_s_ic_i_s 1052
-substr_s_i_ic_s 1053
-substr_s_ic_ic_s 1054
-substr_s_i_i_sc 1055
-substr_s_ic_i_sc 1056
-substr_s_i_ic_sc 1057
-substr_s_ic_ic_sc 1058
-substr_s_p_i_i 1059
-substr_s_p_ic_i 1060
-substr_s_p_i_ic 1061
-substr_s_p_ic_ic 1062
-index_i_s_s 1063
-index_i_sc_s 1064
-index_i_s_sc 1065
-index_i_sc_sc 1066
-index_i_s_s_i 1067
-index_i_sc_s_i 1068
-index_i_s_sc_i 1069
-index_i_sc_sc_i 1070
-index_i_s_s_ic 1071
-index_i_sc_s_ic 1072
-index_i_s_sc_ic 1073
-index_i_sc_sc_ic 1074
-sprintf_s_s_p 1075
-sprintf_s_sc_p 1076
-sprintf_p_p_p 1077
-new_s 1078
-new_s_i 1079
-new_s_ic 1080
-stringinfo_i_s_i 1081
-stringinfo_i_sc_i 1082
-stringinfo_i_s_ic 1083
-stringinfo_i_sc_ic 1084
-upcase_s_s 1085
-upcase_s_sc 1086
-upcase_s 1087
-downcase_s_s 1088
-downcase_s_sc 1089
-downcase_s 1090
-titlecase_s_s 1091
-titlecase_s_sc 1092
-titlecase_s 1093
-join_s_s_p 1094
-join_s_sc_p 1095
-split_p_s_s 1096
-split_p_sc_s 1097
-split_p_s_sc 1098
-split_p_sc_sc 1099
-charset_i_s 1100
-charset_i_sc 1101
-charsetname_s_i 1102
-charsetname_s_ic 1103
-find_charset_i_s 1104
-find_charset_i_sc 1105
-trans_charset_s_i 1106
-trans_charset_s_ic 1107
-trans_charset_s_s_i 1108
-trans_charset_s_sc_i 1109
-trans_charset_s_s_ic 1110
-trans_charset_s_sc_ic 1111
-encoding_i_s 1112
-encoding_i_sc 1113
-encodingname_s_i 1114
-encodingname_s_ic 1115
-find_encoding_i_s 1116
-find_encoding_i_sc 1117
-trans_encoding_s_i 1118
-trans_encoding_s_ic 1119
-trans_encoding_s_s_i 1120
-trans_encoding_s_sc_i 1121
-trans_encoding_s_s_ic 1122
-trans_encoding_s_sc_ic 1123
-is_cclass_i_i_s_i 1124
-is_cclass_i_ic_s_i 1125
-is_cclass_i_i_sc_i 1126
-is_cclass_i_ic_sc_i 1127
-is_cclass_i_i_s_ic 1128
-is_cclass_i_ic_s_ic 1129
-is_cclass_i_i_sc_ic 1130
-is_cclass_i_ic_sc_ic 1131
-find_cclass_i_i_s_i_i 1132
-find_cclass_i_ic_s_i_i 1133
-find_cclass_i_i_sc_i_i 1134
-find_cclass_i_ic_sc_i_i 1135
-find_cclass_i_i_s_ic_i 1136
-find_cclass_i_ic_s_ic_i 1137
-find_cclass_i_i_sc_ic_i 1138
-find_cclass_i_ic_sc_ic_i 1139
-find_cclass_i_i_s_i_ic 1140
-find_cclass_i_ic_s_i_ic 1141
-find_cclass_i_i_sc_i_ic 1142
-find_cclass_i_ic_sc_i_ic 1143
-find_cclass_i_i_s_ic_ic 1144
-find_cclass_i_ic_s_ic_ic 1145
-find_cclass_i_i_sc_ic_ic 1146
-find_cclass_i_ic_sc_ic_ic 1147
-find_not_cclass_i_i_s_i_i 1148
-find_not_cclass_i_ic_s_i_i 1149
-find_not_cclass_i_i_sc_i_i 1150
-find_not_cclass_i_ic_sc_i_i 1151
-find_not_cclass_i_i_s_ic_i 1152
-find_not_cclass_i_ic_s_ic_i 1153
-find_not_cclass_i_i_sc_ic_i 1154
-find_not_cclass_i_ic_sc_ic_i 1155
-find_not_cclass_i_i_s_i_ic 1156
-find_not_cclass_i_ic_s_i_ic 1157
-find_not_cclass_i_i_sc_i_ic 1158
-find_not_cclass_i_ic_sc_i_ic 1159
-find_not_cclass_i_i_s_ic_ic 1160
-find_not_cclass_i_ic_s_ic_ic 1161
-find_not_cclass_i_i_sc_ic_ic 1162
-find_not_cclass_i_ic_sc_ic_ic 1163
-escape_s_s 1164
-compose_s_s 1165
-compose_s_sc 1166
-spawnw_i_s 1167
-spawnw_i_sc 1168
-spawnw_i_p 1169
-err_i 1170
-err_s 1171
-err_s_i 1172
-err_s_ic 1173
-time_i 1174
-time_n 1175
-gmtime_s_i 1176
-gmtime_s_ic 1177
-localtime_s_i 1178
-localtime_s_ic 1179
-decodetime_p_i 1180
-decodetime_p_ic 1181
-decodelocaltime_p_i 1182
-decodelocaltime_p_ic 1183
-sysinfo_s_i 1184
-sysinfo_s_ic 1185
-sysinfo_i_i 1186
-sysinfo_i_ic 1187
-sleep_i 1188
-sleep_ic 1189
-sleep_n 1190
-sleep_nc 1191
-sizeof_i_i 1192
-sizeof_i_ic 1193
-store_lex_s_p 1194
-store_lex_sc_p 1195
-store_dynamic_lex_s_p 1196
-store_dynamic_lex_sc_p 1197
-find_lex_p_s 1198
-find_lex_p_sc 1199
-find_dynamic_lex_p_s 1200
-find_dynamic_lex_p_sc 1201
-find_caller_lex_p_s 1202
-find_caller_lex_p_sc 1203
-get_namespace_p 1204
-get_namespace_p_p 1205
-get_namespace_p_pc 1206
-get_hll_namespace_p 1207
-get_hll_namespace_p_p 1208
-get_hll_namespace_p_pc 1209
-get_root_namespace_p 1210
-get_root_namespace_p_p 1211
-get_root_namespace_p_pc 1212
-get_global_p_s 1213
-get_global_p_sc 1214
-get_global_p_p_s 1215
-get_global_p_pc_s 1216
-get_global_p_p_sc 1217
-get_global_p_pc_sc 1218
-get_hll_global_p_s 1219
-get_hll_global_p_sc 1220
-get_hll_global_p_p_s 1221
-get_hll_global_p_pc_s 1222
-get_hll_global_p_p_sc 1223
-get_hll_global_p_pc_sc 1224
-get_root_global_p_s 1225
-get_root_global_p_sc 1226
-get_root_global_p_p_s 1227
-get_root_global_p_pc_s 1228
-get_root_global_p_p_sc 1229
-get_root_global_p_pc_sc 1230
-set_global_s_p 1231
-set_global_sc_p 1232
-set_global_p_s_p 1233
-set_global_pc_s_p 1234
-set_global_p_sc_p 1235
-set_global_pc_sc_p 1236
-set_hll_global_s_p 1237
-set_hll_global_sc_p 1238
-set_hll_global_p_s_p 1239
-set_hll_global_pc_s_p 1240
-set_hll_global_p_sc_p 1241
-set_hll_global_pc_sc_p 1242
-set_root_global_s_p 1243
-set_root_global_sc_p 1244
-set_root_global_p_s_p 1245
-set_root_global_pc_s_p 1246
-set_root_global_p_sc_p 1247
-set_root_global_pc_sc_p 1248
-find_name_p_s 1249
-find_name_p_sc 1250
-find_sub_not_null_p_s 1251
-find_sub_not_null_p_sc 1252
+load_bytecode_s 6
+load_bytecode_sc 7
+load_language_s 8
+load_language_sc 9
+branch_i 10
+branch_ic 11
+local_branch_p_i 12
+local_branch_p_ic 13
+local_return_p 14
+jump_i 15
+jump_ic 16
+enternative 17
+if_i_ic 18
+if_n_ic 19
+if_s_ic 20
+if_p_ic 21
+unless_i_ic 22
+unless_n_ic 23
+unless_s_ic 24
+unless_p_ic 25
+invokecc_p 26
+invoke_p_p 27
+yield 28
+tailcall_p 29
+returncc 30
+capture_lex_p 31
+newclosure_p_p 32
+set_args_pc 33
+get_results_pc 34
+get_params_pc 35
+set_returns_pc 36
+result_info_p 37
+set_addr_i_ic 38
+set_addr_p_ic 39
+set_addr_p_i 40
+get_addr_i_p 41
+schedule_p 42
+addhandler_p 43
+push_eh_ic 44
+push_eh_p 45
+pop_eh 46
+throw_p 47
+throw_p_p 48
+rethrow_p 49
+count_eh_i 50
+die_s 51
+die_sc 52
+die_p 53
+die_pc 54
+die_i_i 55
+die_ic_i 56
+die_i_ic 57
+die_ic_ic 58
+exit_i 59
+exit_ic 60
+pushmark_i 61
+pushmark_ic 62
+popmark_i 63
+popmark_ic 64
+pushaction_p 65
+debug_i 66
+debug_ic 67
+bounds_i 68
+bounds_ic 69
+profile_i 70
+profile_ic 71
+trace_i 72
+trace_ic 73
+gc_debug_i 74
+gc_debug_ic 75
+interpinfo_i_i 76
+interpinfo_i_ic 77
+interpinfo_p_i 78
+interpinfo_p_ic 79
+interpinfo_s_i 80
+interpinfo_s_ic 81
+warningson_i 82
+warningson_ic 83
+warningsoff_i 84
+warningsoff_ic 85
+errorson_i 86
+errorson_ic 87
+errorsoff_i 88
+errorsoff_ic 89
+runinterp_p_i 90
+runinterp_p_ic 91
+getinterp_p 92
+sweep_ic 93
+collect 94
+sweepoff 95
+sweepon 96
+collectoff 97
+collecton 98
+needs_destroy_p 99
+loadlib_p_s 100
+loadlib_p_sc 101
+dlfunc_p_p_s_s 102
+dlfunc_p_p_sc_s 103
+dlfunc_p_p_s_sc 104
+dlfunc_p_p_sc_sc 105
+dlvar_p_p_s 106
+dlvar_p_p_sc 107
+compreg_s_p 108
+compreg_sc_p 109
+compreg_p_s 110
+compreg_p_sc 111
+new_callback_p_p_p_s 112
+new_callback_p_p_p_sc 113
+annotations_p 114
+annotations_p_s 115
+annotations_p_sc 116
+band_i_i 117
+band_i_ic 118
+band_p_i 119
+band_p_ic 120
+band_p_p 121
+band_i_i_i 122
+band_i_ic_i 123
+band_i_i_ic 124
+band_p_p_i 125
+band_p_p_ic 126
+band_p_p_p 127
+bands_s_s 128
+bands_s_sc 129
+bands_p_s 130
+bands_p_sc 131
+bands_p_p 132
+bands_s_s_s 133
+bands_s_sc_s 134
+bands_s_s_sc 135
+bands_p_p_s 136
+bands_p_p_sc 137
+bands_p_p_p 138
+bnot_i 139
+bnot_i_i 140
+bnot_p 141
+bnot_p_p 142
+bnots_s 143
+bnots_s_s 144
+bnots_s_sc 145
+bnots_p 146
+bnots_p_p 147
+bor_i_i 148
+bor_i_ic 149
+bor_p_i 150
+bor_p_ic 151
+bor_p_p 152
+bor_i_i_i 153
+bor_i_ic_i 154
+bor_i_i_ic 155
+bor_p_p_i 156
+bor_p_p_ic 157
+bor_p_p_p 158
+bors_s_s 159
+bors_s_sc 160
+bors_p_s 161
+bors_p_sc 162
+bors_p_p 163
+bors_s_s_s 164
+bors_s_sc_s 165
+bors_s_s_sc 166
+bors_p_p_s 167
+bors_p_p_sc 168
+bors_p_p_p 169
+shl_i_i 170
+shl_i_ic 171
+shl_p_i 172
+shl_p_ic 173
+shl_p_p 174
+shl_i_i_i 175
+shl_i_ic_i 176
+shl_i_i_ic 177
+shl_p_p_i 178
+shl_p_p_ic 179
+shl_p_p_p 180
+shr_i_i 181
+shr_i_ic 182
+shr_p_i 183
+shr_p_ic 184
+shr_p_p 185
+shr_i_i_i 186
+shr_i_ic_i 187
+shr_i_i_ic 188
+shr_p_p_i 189
+shr_p_p_ic 190
+shr_p_p_p 191
+lsr_i_i 192
+lsr_i_ic 193
+lsr_p_i 194
+lsr_p_ic 195
+lsr_p_p 196
+lsr_i_i_i 197
+lsr_i_ic_i 198
+lsr_i_i_ic 199
+lsr_p_p_i 200
+lsr_p_p_ic 201
+lsr_p_p_p 202
+rot_i_i_i_ic 203
+rot_i_ic_i_ic 204
+rot_i_i_ic_ic 205
+bxor_i_i 206
+bxor_i_ic 207
+bxor_p_i 208
+bxor_p_ic 209
+bxor_p_p 210
+bxor_i_i_i 211
+bxor_i_ic_i 212
+bxor_i_i_ic 213
+bxor_p_p_i 214
+bxor_p_p_ic 215
+bxor_p_p_p 216
+bxors_s_s 217
+bxors_s_sc 218
+bxors_p_s 219
+bxors_p_sc 220
+bxors_p_p 221
+bxors_s_s_s 222
+bxors_s_sc_s 223
+bxors_s_s_sc 224
+bxors_p_p_s 225
+bxors_p_p_sc 226
+bxors_p_p_p 227
+eq_i_i_ic 228
+eq_ic_i_ic 229
+eq_i_ic_ic 230
+eq_n_n_ic 231
+eq_nc_n_ic 232
+eq_n_nc_ic 233
+eq_s_s_ic 234
+eq_sc_s_ic 235
+eq_s_sc_ic 236
+eq_p_p_ic 237
+eq_p_i_ic 238
+eq_p_ic_ic 239
+eq_p_n_ic 240
+eq_p_nc_ic 241
+eq_p_s_ic 242
+eq_p_sc_ic 243
+eq_str_p_p_ic 244
+eq_num_p_p_ic 245
+eq_addr_s_s_ic 246
+eq_addr_sc_s_ic 247
+eq_addr_s_sc_ic 248
+eq_addr_sc_sc_ic 249
+eq_addr_p_p_ic 250
+ne_i_i_ic 251
+ne_ic_i_ic 252
+ne_i_ic_ic 253
+ne_n_n_ic 254
+ne_nc_n_ic 255
+ne_n_nc_ic 256
+ne_s_s_ic 257
+ne_sc_s_ic 258
+ne_s_sc_ic 259
+ne_p_p_ic 260
+ne_p_i_ic 261
+ne_p_ic_ic 262
+ne_p_n_ic 263
+ne_p_nc_ic 264
+ne_p_s_ic 265
+ne_p_sc_ic 266
+ne_str_p_p_ic 267
+ne_num_p_p_ic 268
+ne_addr_s_s_ic 269
+ne_addr_sc_s_ic 270
+ne_addr_s_sc_ic 271
+ne_addr_sc_sc_ic 272
+ne_addr_p_p_ic 273
+lt_i_i_ic 274
+lt_ic_i_ic 275
+lt_i_ic_ic 276
+lt_n_n_ic 277
+lt_nc_n_ic 278
+lt_n_nc_ic 279
+lt_s_s_ic 280
+lt_sc_s_ic 281
+lt_s_sc_ic 282
+lt_p_p_ic 283
+lt_p_i_ic 284
+lt_p_ic_ic 285
+lt_p_n_ic 286
+lt_p_nc_ic 287
+lt_p_s_ic 288
+lt_p_sc_ic 289
+lt_str_p_p_ic 290
+lt_num_p_p_ic 291
+le_i_i_ic 292
+le_ic_i_ic 293
+le_i_ic_ic 294
+le_n_n_ic 295
+le_nc_n_ic 296
+le_n_nc_ic 297
+le_s_s_ic 298
+le_sc_s_ic 299
+le_s_sc_ic 300
+le_p_p_ic 301
+le_p_i_ic 302
+le_p_ic_ic 303
+le_p_n_ic 304
+le_p_nc_ic 305
+le_p_s_ic 306
+le_p_sc_ic 307
+le_str_p_p_ic 308
+le_num_p_p_ic 309
+gt_p_p_ic 310
+gt_p_i_ic 311
+gt_p_ic_ic 312
+gt_p_n_ic 313
+gt_p_nc_ic 314
+gt_p_s_ic 315
+gt_p_sc_ic 316
+gt_str_p_p_ic 317
+gt_num_p_p_ic 318
+ge_p_p_ic 319
+ge_p_i_ic 320
+ge_p_ic_ic 321
+ge_p_n_ic 322
+ge_p_nc_ic 323
+ge_p_s_ic 324
+ge_p_sc_ic 325
+ge_str_p_p_ic 326
+ge_num_p_p_ic 327
+if_null_p_ic 328
+if_null_s_ic 329
+unless_null_p_ic 330
+unless_null_s_ic 331
+cmp_i_i_i 332
+cmp_i_ic_i 333
+cmp_i_i_ic 334
+cmp_i_n_n 335
+cmp_i_nc_n 336
+cmp_i_n_nc 337
+cmp_i_s_s 338
+cmp_i_sc_s 339
+cmp_i_s_sc 340
+cmp_i_p_p 341
+cmp_i_p_i 342
+cmp_i_p_ic 343
+cmp_i_p_n 344
+cmp_i_p_nc 345
+cmp_i_p_s 346
+cmp_i_p_sc 347
+cmp_str_i_p_p 348
+cmp_num_i_p_p 349
+cmp_pmc_p_p_p 350
+issame_i_p_p 351
+issame_i_s_s 352
+issame_i_sc_s 353
+issame_i_s_sc 354
+issame_i_sc_sc 355
+isntsame_i_p_p 356
+isntsame_i_s_s 357
+isntsame_i_sc_s 358
+isntsame_i_s_sc 359
+isntsame_i_sc_sc 360
+istrue_i_p 361
+isfalse_i_p 362
+isnull_i_p 363
+isnull_i_pc 364
+isnull_i_s 365
+isnull_i_sc 366
+isgt_i_p_p 367
+isge_i_p_p 368
+isle_i_i_i 369
+isle_i_ic_i 370
+isle_i_i_ic 371
+isle_i_n_n 372
+isle_i_nc_n 373
+isle_i_n_nc 374
+isle_i_s_s 375
+isle_i_sc_s 376
+isle_i_s_sc 377
+isle_i_p_p 378
+islt_i_i_i 379
+islt_i_ic_i 380
+islt_i_i_ic 381
+islt_i_n_n 382
+islt_i_nc_n 383
+islt_i_n_nc 384
+islt_i_s_s 385
+islt_i_sc_s 386
+islt_i_s_sc 387
+islt_i_p_p 388
+iseq_i_i_i 389
+iseq_i_ic_i 390
+iseq_i_i_ic 391
+iseq_i_n_n 392
+iseq_i_nc_n 393
+iseq_i_n_nc 394
+iseq_i_s_s 395
+iseq_i_sc_s 396
+iseq_i_s_sc 397
+iseq_i_p_p 398
+isne_i_i_i 399
+isne_i_ic_i 400
+isne_i_i_ic 401
+isne_i_n_n 402
+isne_i_nc_n 403
+isne_i_n_nc 404
+isne_i_s_s 405
+isne_i_sc_s 406
+isne_i_s_sc 407
+isne_i_p_p 408
+and_i_i_i 409
+and_i_ic_i 410
+and_i_i_ic 411
+and_p_p_p 412
+not_i 413
+not_i_i 414
+not_p 415
+not_p_p 416
+or_i_i_i 417
+or_i_ic_i 418
+or_i_i_ic 419
+or_p_p_p 420
+xor_i_i_i 421
+xor_i_ic_i 422
+xor_i_i_ic 423
+xor_p_p_p 424
+debug_init 425
+debug_load_sc 426
+debug_break 427
+debug_print 428
+backtrace 429
+getline_i 430
+getfile_s 431
+set_label_p_ic 432
+get_label_i_p 433
+close_p 434
+fdopen_p_i_s 435
+fdopen_p_ic_s 436
+fdopen_p_i_sc 437
+fdopen_p_ic_sc 438
+getstdin_p 439
+getstdout_p 440
+getstderr_p 441
+setstdin_p 442
+setstdout_p 443
+setstderr_p 444
+open_p_s_s 445
+open_p_sc_s 446
+open_p_s_sc 447
+open_p_sc_sc 448
+open_p_s 449
+open_p_sc 450
+print_i 451
+print_ic 452
+print_n 453
+print_nc 454
+print_s 455
+print_sc 456
+print_p 457
+say_i 458
+say_ic 459
+say_n 460
+say_nc 461
+say_s 462
+say_sc 463
+say_p 464
+printerr_i 465
+printerr_ic 466
+printerr_n 467
+printerr_nc 468
+printerr_s 469
+printerr_sc 470
+printerr_p 471
+print_p_i 472
+print_p_ic 473
+print_p_n 474
+print_p_nc 475
+print_p_s 476
+print_p_sc 477
+print_p_p 478
+read_s_i 479
+read_s_ic 480
+read_s_p_i 481
+read_s_p_ic 482
+readline_s_p 483
+peek_s 484
+peek_s_p 485
+stat_i_s_i 486
+stat_i_sc_i 487
+stat_i_s_ic 488
+stat_i_sc_ic 489
+stat_i_i_i 490
+stat_i_ic_i 491
+stat_i_i_ic 492
+stat_i_ic_ic 493
+seek_p_i_i 494
+seek_p_ic_i 495
+seek_p_i_ic 496
+seek_p_ic_ic 497
+seek_p_i_i_i 498
+seek_p_ic_i_i 499
+seek_p_i_ic_i 500
+seek_p_ic_ic_i 501
+seek_p_i_i_ic 502
+seek_p_ic_i_ic 503
+seek_p_i_ic_ic 504
+seek_p_ic_ic_ic 505
+tell_i_p 506
+tell_i_i_p 507
+abs_i 508
+abs_n 509
+abs_i_i 510
+abs_n_n 511
+abs_p 512
+abs_p_p 513
+add_i_i 514
+add_i_ic 515
+add_n_n 516
+add_n_nc 517
+add_p_p 518
+add_p_i 519
+add_p_ic 520
+add_p_n 521
+add_p_nc 522
+add_i_i_i 523
+add_i_ic_i 524
+add_i_i_ic 525
+add_n_n_n 526
+add_n_nc_n 527
+add_n_n_nc 528
+add_p_p_p 529
+add_p_p_i 530
+add_p_p_ic 531
+add_p_p_n 532
+add_p_p_nc 533
+cmod_i_i_i 534
+cmod_i_ic_i 535
+cmod_i_i_ic 536
+cmod_p_p_i 537
+cmod_p_p_ic 538
+cmod_p_p_p 539
+cmod_n_n_n 540
+cmod_n_nc_n 541
+cmod_n_n_nc 542
+cmod_p_p_n 543
+cmod_p_p_nc 544
+dec_i 545
+dec_n 546
+dec_p 547
+div_i_i 548
+div_i_ic 549
+div_n_n 550
+div_n_nc 551
+div_p_p 552
+div_p_i 553
+div_p_ic 554
+div_p_n 555
+div_p_nc 556
+div_i_i_i 557
+div_i_ic_i 558
+div_i_i_ic 559
+div_i_ic_ic 560
+div_n_n_n 561
+div_n_nc_n 562
+div_n_n_nc 563
+div_n_nc_nc 564
+div_p_p_p 565
+div_p_p_i 566
+div_p_p_ic 567
+div_p_p_n 568
+div_p_p_nc 569
+fdiv_i_i 570
+fdiv_i_ic 571
+fdiv_n_n 572
+fdiv_n_nc 573
+fdiv_p_p 574
+fdiv_p_i 575
+fdiv_p_ic 576
+fdiv_p_n 577
+fdiv_p_nc 578
+fdiv_i_i_i 579
+fdiv_i_ic_i 580
+fdiv_i_i_ic 581
+fdiv_n_n_n 582
+fdiv_n_nc_n 583
+fdiv_n_n_nc 584
+fdiv_p_p_p 585
+fdiv_p_p_i 586
+fdiv_p_p_ic 587
+fdiv_p_p_n 588
+fdiv_p_p_nc 589
+ceil_n 590
+ceil_i_n 591
+ceil_n_n 592
+floor_n 593
+floor_i_n 594
+floor_n_n 595
+inc_i 596
+inc_n 597
+inc_p 598
+mod_i_i 599
+mod_i_ic 600
+mod_n_n 601
+mod_n_nc 602
+mod_p_p 603
+mod_p_i 604
+mod_p_ic 605
+mod_p_n 606
+mod_p_nc 607
+mod_i_i_i 608
+mod_i_ic_i 609
+mod_i_i_ic 610
+mod_n_n_n 611
+mod_n_nc_n 612
+mod_n_n_nc 613
+mod_p_p_p 614
+mod_p_p_i 615
+mod_p_p_ic 616
+mod_p_p_n 617
+mod_p_p_nc 618
+mul_i_i 619
+mul_i_ic 620
+mul_n_n 621
+mul_n_nc 622
+mul_p_p 623
+mul_p_i 624
+mul_p_ic 625
+mul_p_n 626
+mul_p_nc 627
+mul_i_i_i 628
+mul_i_ic_i 629
+mul_i_i_ic 630
+mul_n_n_n 631
+mul_n_nc_n 632
+mul_n_n_nc 633
+mul_p_p_p 634
+mul_p_p_i 635
+mul_p_p_ic 636
+mul_p_p_n 637
+mul_p_p_nc 638
+neg_i 639
+neg_n 640
+neg_p 641
+neg_i_i 642
+neg_n_n 643
+neg_p_p 644
+pow_n_n_n 645
+pow_n_nc_n 646
+pow_n_n_nc 647
+pow_p_p_p 648
+pow_p_p_i 649
+pow_p_p_ic 650
+pow_p_p_n 651
+pow_p_p_nc 652
+pow_n_n_i 653
+pow_n_nc_i 654
+pow_n_n_ic 655
+pow_n_nc_ic 656
+sub_i_i 657
+sub_i_ic 658
+sub_n_n 659
+sub_n_nc 660
+sub_p_p 661
+sub_p_i 662
+sub_p_ic 663
+sub_p_n 664
+sub_p_nc 665
+sub_i_i_i 666
+sub_i_ic_i 667
+sub_i_i_ic 668
+sub_n_n_n 669
+sub_n_nc_n 670
+sub_n_n_nc 671
+sub_p_p_p 672
+sub_p_p_i 673
+sub_p_p_ic 674
+sub_p_p_n 675
+sub_p_p_nc 676
+sqrt_n_n 677
+acos_n_n 678
+asec_n_n 679
+asin_n_n 680
+atan_n_n 681
+atan_n_n_n 682
+atan_n_nc_n 683
+atan_n_n_nc 684
+cos_n_n 685
+cosh_n_n 686
+exp_n_n 687
+ln_n_n 688
+log10_n_n 689
+log2_n_n 690
+sec_n_n 691
+sech_n_n 692
+sin_n_n 693
+sinh_n_n 694
+tan_n_n 695
+tanh_n_n 696
+gcd_i_i_i 697
+gcd_i_ic_i 698
+gcd_i_i_ic 699
+lcm_i_i_i 700
+lcm_i_ic_i 701
+lcm_i_i_ic 702
+fact_i_i 703
+fact_n_i 704
+callmethodcc_p_s 705
+callmethodcc_p_sc 706
+callmethodcc_p_p 707
+callmethod_p_s_p 708
+callmethod_p_sc_p 709
+callmethod_p_p_p 710
+tailcallmethod_p_s 711
+tailcallmethod_p_sc 712
+tailcallmethod_p_p 713
+addmethod_p_s_p 714
+addmethod_p_sc_p 715
+can_i_p_s 716
+can_i_p_sc 717
+does_i_p_s 718
+does_i_p_sc 719
+does_i_p_p 720
+does_i_p_pc 721
+isa_i_p_s 722
+isa_i_p_sc 723
+isa_i_p_p 724
+isa_i_p_pc 725
+newclass_p_s 726
+newclass_p_sc 727
+newclass_p_p 728
+newclass_p_pc 729
+subclass_p_p 730
+subclass_p_pc 731
+subclass_p_p_s 732
+subclass_p_pc_s 733
+subclass_p_p_sc 734
+subclass_p_pc_sc 735
+subclass_p_p_p 736
+subclass_p_pc_p 737
+subclass_p_p_pc 738
+subclass_p_pc_pc 739
+subclass_p_s 740
+subclass_p_sc 741
+subclass_p_s_s 742
+subclass_p_sc_s 743
+subclass_p_s_sc 744
+subclass_p_sc_sc 745
+subclass_p_s_p 746
+subclass_p_sc_p 747
+subclass_p_s_pc 748
+subclass_p_sc_pc 749
+get_class_p_s 750
+get_class_p_sc 751
+get_class_p_p 752
+get_class_p_pc 753
+class_p_p 754
+addparent_p_p 755
+removeparent_p_p 756
+addrole_p_p 757
+addattribute_p_s 758
+addattribute_p_sc 759
+removeattribute_p_s 760
+removeattribute_p_sc 761
+getattribute_p_p_s 762
+getattribute_p_p_sc 763
+getattribute_p_p_p_s 764
+getattribute_p_p_pc_s 765
+getattribute_p_p_p_sc 766
+getattribute_p_p_pc_sc 767
+setattribute_p_s_p 768
+setattribute_p_sc_p 769
+setattribute_p_p_s_p 770
+setattribute_p_pc_s_p 771
+setattribute_p_p_sc_p 772
+setattribute_p_pc_sc_p 773
+inspect_p_p 774
+inspect_p_pc 775
+inspect_p_p_s 776
+inspect_p_pc_s 777
+inspect_p_p_sc 778
+inspect_p_pc_sc 779
+new_p_s 780
+new_p_sc 781
+new_p_s_p 782
+new_p_sc_p 783
+new_p_s_pc 784
+new_p_sc_pc 785
+new_p_p 786
+new_p_pc 787
+new_p_p_p 788
+new_p_pc_p 789
+new_p_p_pc 790
+new_p_pc_pc 791
+root_new_p_p 792
+root_new_p_pc 793
+root_new_p_p_p 794
+root_new_p_pc_p 795
+root_new_p_p_pc 796
+root_new_p_pc_pc 797
+typeof_s_p 798
+typeof_p_p 799
+get_repr_s_p 800
+find_method_p_p_s 801
+find_method_p_p_sc 802
+defined_i_p 803
+defined_i_p_ki 804
+defined_i_p_kic 805
+defined_i_p_k 806
+defined_i_p_kc 807
+exists_i_p_ki 808
+exists_i_p_kic 809
+exists_i_p_k 810
+exists_i_p_kc 811
+delete_p_k 812
+delete_p_kc 813
+delete_p_ki 814
+delete_p_kic 815
+elements_i_p 816
+push_p_i 817
+push_p_ic 818
+push_p_n 819
+push_p_nc 820
+push_p_s 821
+push_p_sc 822
+push_p_p 823
+pop_i_p 824
+pop_n_p 825
+pop_s_p 826
+pop_p_p 827
+unshift_p_i 828
+unshift_p_ic 829
+unshift_p_n 830
+unshift_p_nc 831
+unshift_p_s 832
+unshift_p_sc 833
+unshift_p_p 834
+shift_i_p 835
+shift_n_p 836
+shift_s_p 837
+shift_p_p 838
+splice_p_p_i_i 839
+splice_p_p_ic_i 840
+splice_p_p_i_ic 841
+splice_p_p_ic_ic 842
+setprop_p_s_p 843
+setprop_p_sc_p 844
+getprop_p_s_p 845
+getprop_p_sc_p 846
+delprop_p_s 847
+delprop_p_sc 848
+prophash_p_p 849
+freeze_s_p 850
+thaw_p_s 851
+thaw_p_sc 852
+add_multi_s_s_p 853
+add_multi_sc_s_p 854
+add_multi_s_sc_p 855
+add_multi_sc_sc_p 856
+find_multi_p_s_s 857
+find_multi_p_sc_s 858
+find_multi_p_s_sc 859
+find_multi_p_sc_sc 860
+register_p 861
+unregister_p 862
+box_p_i 863
+box_p_ic 864
+box_p_n 865
+box_p_nc 866
+box_p_s 867
+box_p_sc 868
+iter_p_p 869
+morph_p_p 870
+morph_p_pc 871
+clone_s_s 872
+clone_s_sc 873
+exchange_i_i 874
+exchange_p_p 875
+exchange_n_n 876
+exchange_s_s 877
+set_i_i 878
+set_i_ic 879
+set_i_n 880
+set_i_nc 881
+set_i_s 882
+set_i_sc 883
+set_n_n 884
+set_n_nc 885
+set_n_i 886
+set_n_ic 887
+set_n_s 888
+set_n_sc 889
+set_n_p 890
+set_s_p 891
+set_s_s 892
+set_s_sc 893
+set_s_i 894
+set_s_ic 895
+set_s_n 896
+set_s_nc 897
+set_p_pc 898
+set_p_p 899
+set_p_i 900
+set_p_ic 901
+set_p_n 902
+set_p_nc 903
+set_p_s 904
+set_p_sc 905
+set_i_p 906
+assign_p_p 907
+assign_p_i 908
+assign_p_ic 909
+assign_p_n 910
+assign_p_nc 911
+assign_p_s 912
+assign_p_sc 913
+assign_s_s 914
+assign_s_sc 915
+setref_p_p 916
+deref_p_p 917
+setp_ind_i_p 918
+setp_ind_ic_p 919
+setn_ind_i_n 920
+setn_ind_ic_n 921
+setn_ind_i_nc 922
+setn_ind_ic_nc 923
+sets_ind_i_s 924
+sets_ind_ic_s 925
+sets_ind_i_sc 926
+sets_ind_ic_sc 927
+seti_ind_i_i 928
+seti_ind_ic_i 929
+seti_ind_i_ic 930
+seti_ind_ic_ic 931
+set_p_ki_i 932
+set_p_kic_i 933
+set_p_ki_ic 934
+set_p_kic_ic 935
+set_p_ki_n 936
+set_p_kic_n 937
+set_p_ki_nc 938
+set_p_kic_nc 939
+set_p_ki_s 940
+set_p_kic_s 941
+set_p_ki_sc 942
+set_p_kic_sc 943
+set_p_ki_p 944
+set_p_kic_p 945
+set_i_p_ki 946
+set_i_p_kic 947
+set_n_p_ki 948
+set_n_p_kic 949
+set_s_p_ki 950
+set_s_p_kic 951
+set_p_p_ki 952
+set_p_p_kic 953
+set_p_k_i 954
+set_p_kc_i 955
+set_p_k_ic 956
+set_p_kc_ic 957
+set_p_k_n 958
+set_p_kc_n 959
+set_p_k_nc 960
+set_p_kc_nc 961
+set_p_k_s 962
+set_p_kc_s 963
+set_p_k_sc 964
+set_p_kc_sc 965
+set_p_k_p 966
+set_p_kc_p 967
+set_i_p_k 968
+set_i_p_kc 969
+set_n_p_k 970
+set_n_p_kc 971
+set_s_p_k 972
+set_s_p_kc 973
+set_p_p_k 974
+set_p_p_kc 975
+clone_p_p 976
+clone_p_p_p 977
+clone_p_p_pc 978
+copy_p_p 979
+null_s 980
+null_i 981
+null_p 982
+null_n 983
+cleari 984
+clearn 985
+clears 986
+clearp 987
+ord_i_s 988
+ord_i_sc 989
+ord_i_s_i 990
+ord_i_sc_i 991
+ord_i_s_ic 992
+ord_i_sc_ic 993
+chr_s_i 994
+chr_s_ic 995
+chopn_s_i 996
+chopn_s_ic 997
+chopn_s_s_i 998
+chopn_s_sc_i 999
+chopn_s_s_ic 1000
+chopn_s_sc_ic 1001
+concat_s_s 1002
+concat_s_sc 1003
+concat_p_p 1004
+concat_p_s 1005
+concat_p_sc 1006
+concat_s_s_s 1007
+concat_s_sc_s 1008
+concat_s_s_sc 1009
+concat_p_p_s 1010
+concat_p_p_sc 1011
+concat_p_p_p 1012
+repeat_s_s_i 1013
+repeat_s_sc_i 1014
+repeat_s_s_ic 1015
+repeat_s_sc_ic 1016
+repeat_p_p_i 1017
+repeat_p_p_ic 1018
+repeat_p_p_p 1019
+repeat_p_i 1020
+repeat_p_ic 1021
+repeat_p_p 1022
+length_i_s 1023
+length_i_sc 1024
+bytelength_i_s 1025
+bytelength_i_sc 1026
+pin_s 1027
+unpin_s 1028
+substr_s_s_i 1029
+substr_s_sc_i 1030
+substr_s_s_ic 1031
+substr_s_sc_ic 1032
+substr_s_s_i_i 1033
+substr_s_sc_i_i 1034
+substr_s_s_ic_i 1035
+substr_s_sc_ic_i 1036
+substr_s_s_i_ic 1037
+substr_s_sc_i_ic 1038
+substr_s_s_ic_ic 1039
+substr_s_sc_ic_ic 1040
+substr_s_s_i_i_s 1041
+substr_s_s_ic_i_s 1042
+substr_s_s_i_ic_s 1043
+substr_s_s_ic_ic_s 1044
+substr_s_s_i_i_sc 1045
+substr_s_s_ic_i_sc 1046
+substr_s_s_i_ic_sc 1047
+substr_s_s_ic_ic_sc 1048
+substr_s_i_i_s 1049
+substr_s_ic_i_s 1050
+substr_s_i_ic_s 1051
+substr_s_ic_ic_s 1052
+substr_s_i_i_sc 1053
+substr_s_ic_i_sc 1054
+substr_s_i_ic_sc 1055
+substr_s_ic_ic_sc 1056
+substr_s_p_i_i 1057
+substr_s_p_ic_i 1058
+substr_s_p_i_ic 1059
+substr_s_p_ic_ic 1060
+index_i_s_s 1061
+index_i_sc_s 1062
+index_i_s_sc 1063
+index_i_sc_sc 1064
+index_i_s_s_i 1065
+index_i_sc_s_i 1066
+index_i_s_sc_i 1067
+index_i_sc_sc_i 1068
+index_i_s_s_ic 1069
+index_i_sc_s_ic 1070
+index_i_s_sc_ic 1071
+index_i_sc_sc_ic 1072
+sprintf_s_s_p 1073
+sprintf_s_sc_p 1074
+sprintf_p_p_p 1075
+new_s 1076
+new_s_i 1077
+new_s_ic 1078
+stringinfo_i_s_i 1079
+stringinfo_i_sc_i 1080
+stringinfo_i_s_ic 1081
+stringinfo_i_sc_ic 1082
+upcase_s_s 1083
+upcase_s_sc 1084
+upcase_s 1085
+downcase_s_s 1086
+downcase_s_sc 1087
+downcase_s 1088
+titlecase_s_s 1089
+titlecase_s_sc 1090
+titlecase_s 1091
+join_s_s_p 1092
+join_s_sc_p 1093
+split_p_s_s 1094
+split_p_sc_s 1095
+split_p_s_sc 1096
+split_p_sc_sc 1097
+charset_i_s 1098
+charset_i_sc 1099
+charsetname_s_i 1100
+charsetname_s_ic 1101
+find_charset_i_s 1102
+find_charset_i_sc 1103
+trans_charset_s_i 1104
+trans_charset_s_ic 1105
+trans_charset_s_s_i 1106
+trans_charset_s_sc_i 1107
+trans_charset_s_s_ic 1108
+trans_charset_s_sc_ic 1109
+encoding_i_s 1110
+encoding_i_sc 1111
+encodingname_s_i 1112
+encodingname_s_ic 1113
+find_encoding_i_s 1114
+find_encoding_i_sc 1115
+trans_encoding_s_i 1116
+trans_encoding_s_ic 1117
+trans_encoding_s_s_i 1118
+trans_encoding_s_sc_i 1119
+trans_encoding_s_s_ic 1120
+trans_encoding_s_sc_ic 1121
+is_cclass_i_i_s_i 1122
+is_cclass_i_ic_s_i 1123
+is_cclass_i_i_sc_i 1124
+is_cclass_i_ic_sc_i 1125
+is_cclass_i_i_s_ic 1126
+is_cclass_i_ic_s_ic 1127
+is_cclass_i_i_sc_ic 1128
+is_cclass_i_ic_sc_ic 1129
+find_cclass_i_i_s_i_i 1130
+find_cclass_i_ic_s_i_i 1131
+find_cclass_i_i_sc_i_i 1132
+find_cclass_i_ic_sc_i_i 1133
+find_cclass_i_i_s_ic_i 1134
+find_cclass_i_ic_s_ic_i 1135
+find_cclass_i_i_sc_ic_i 1136
+find_cclass_i_ic_sc_ic_i 1137
+find_cclass_i_i_s_i_ic 1138
+find_cclass_i_ic_s_i_ic 1139
+find_cclass_i_i_sc_i_ic 1140
+find_cclass_i_ic_sc_i_ic 1141
+find_cclass_i_i_s_ic_ic 1142
+find_cclass_i_ic_s_ic_ic 1143
+find_cclass_i_i_sc_ic_ic 1144
+find_cclass_i_ic_sc_ic_ic 1145
+find_not_cclass_i_i_s_i_i 1146
+find_not_cclass_i_ic_s_i_i 1147
+find_not_cclass_i_i_sc_i_i 1148
+find_not_cclass_i_ic_sc_i_i 1149
+find_not_cclass_i_i_s_ic_i 1150
+find_not_cclass_i_ic_s_ic_i 1151
+find_not_cclass_i_i_sc_ic_i 1152
+find_not_cclass_i_ic_sc_ic_i 1153
+find_not_cclass_i_i_s_i_ic 1154
+find_not_cclass_i_ic_s_i_ic 1155
+find_not_cclass_i_i_sc_i_ic 1156
+find_not_cclass_i_ic_sc_i_ic 1157
+find_not_cclass_i_i_s_ic_ic 1158
+find_not_cclass_i_ic_s_ic_ic 1159
+find_not_cclass_i_i_sc_ic_ic 1160
+find_not_cclass_i_ic_sc_ic_ic 1161
+escape_s_s 1162
+compose_s_s 1163
+compose_s_sc 1164
+spawnw_i_s 1165
+spawnw_i_sc 1166
+spawnw_i_p 1167
+err_i 1168
+err_s 1169
+err_s_i 1170
+err_s_ic 1171
+time_i 1172
+time_n 1173
+gmtime_s_i 1174
+gmtime_s_ic 1175
+localtime_s_i 1176
+localtime_s_ic 1177
+decodetime_p_i 1178
+decodetime_p_ic 1179
+decodelocaltime_p_i 1180
+decodelocaltime_p_ic 1181
+sysinfo_s_i 1182
+sysinfo_s_ic 1183
+sysinfo_i_i 1184
+sysinfo_i_ic 1185
+sleep_i 1186
+sleep_ic 1187
+sleep_n 1188
+sleep_nc 1189
+sizeof_i_i 1190
+sizeof_i_ic 1191
+store_lex_s_p 1192
+store_lex_sc_p 1193
+store_dynamic_lex_s_p 1194
+store_dynamic_lex_sc_p 1195
+find_lex_p_s 1196
+find_lex_p_sc 1197
+find_dynamic_lex_p_s 1198
+find_dynamic_lex_p_sc 1199
+find_caller_lex_p_s 1200
+find_caller_lex_p_sc 1201
+get_namespace_p 1202
+get_namespace_p_p 1203
+get_namespace_p_pc 1204
+get_hll_namespace_p 1205
+get_hll_namespace_p_p 1206
+get_hll_namespace_p_pc 1207
+get_root_namespace_p 1208
+get_root_namespace_p_p 1209
+get_root_namespace_p_pc 1210
+get_global_p_s 1211
+get_global_p_sc 1212
+get_global_p_p_s 1213
+get_global_p_pc_s 1214
+get_global_p_p_sc 1215
+get_global_p_pc_sc 1216
+get_hll_global_p_s 1217
+get_hll_global_p_sc 1218
+get_hll_global_p_p_s 1219
+get_hll_global_p_pc_s 1220
+get_hll_global_p_p_sc 1221
+get_hll_global_p_pc_sc 1222
+get_root_global_p_s 1223
+get_root_global_p_sc 1224
+get_root_global_p_p_s 1225
+get_root_global_p_pc_s 1226
+get_root_global_p_p_sc 1227
+get_root_global_p_pc_sc 1228
+set_global_s_p 1229
+set_global_sc_p 1230
+set_global_p_s_p 1231
+set_global_pc_s_p 1232
+set_global_p_sc_p 1233
+set_global_pc_sc_p 1234
+set_hll_global_s_p 1235
+set_hll_global_sc_p 1236
+set_hll_global_p_s_p 1237
+set_hll_global_pc_s_p 1238
+set_hll_global_p_sc_p 1239
+set_hll_global_pc_sc_p 1240
+set_root_global_s_p 1241
+set_root_global_sc_p 1242
+set_root_global_p_s_p 1243
+set_root_global_pc_s_p 1244
+set_root_global_p_sc_p 1245
+set_root_global_pc_sc_p 1246
+find_name_p_s 1247
+find_name_p_sc 1248
+find_sub_not_null_p_s 1249
+find_sub_not_null_p_sc 1250
Modified: branches/rm_cflags/src/runcore/main.c
==============================================================================
--- branches/rm_cflags/src/runcore/main.c Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/src/runcore/main.c Thu Mar 4 20:51:45 2010 (r44632)
@@ -10,20 +10,6 @@
The runcore API handles running the operations.
-The predereferenced code chunk is pre-initialized with the opcode
-function pointers, addresses, or opnumbers of the C<prederef__>
-opcode. This opcode then calls the C<do_prederef()> function, which then
-fills in the real function, address or op number.
-
-Because the C<prederef__> opcode returns the same C<pc_prederef> it was
-passed, the runops loop will re-execute the same location, which will
-then have the pointer to the real C<prederef> opfunc and C<prederef>
-args.
-
-Pointer arithmetic is used to determine the index into the bytecode
-corresponding to the currect opcode. The bytecode and prederef arrays
-have the same number of elements because there is a one-to-one mapping.
-
=head2 Functions
=over 4
@@ -76,17 +62,6 @@
__attribute__nonnull__(1)
__attribute__nonnull__(2);
-static void prederef_args(
- ARGMOD(void **pc_prederef),
- PARROT_INTERP,
- ARGIN(const opcode_t *pc),
- ARGIN(const op_info_t *opinfo))
- __attribute__nonnull__(1)
- __attribute__nonnull__(2)
- __attribute__nonnull__(3)
- __attribute__nonnull__(4)
- FUNC_MODIFIES(*pc_prederef);
-
static void stop_prederef(PARROT_INTERP)
__attribute__nonnull__(1);
@@ -102,11 +77,6 @@
#define ASSERT_ARGS_notify_func_table __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(table))
-#define ASSERT_ARGS_prederef_args __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
- PARROT_ASSERT_ARG(pc_prederef) \
- , PARROT_ASSERT_ARG(interp) \
- , PARROT_ASSERT_ARG(pc) \
- , PARROT_ASSERT_ARG(opinfo))
#define ASSERT_ARGS_stop_prederef __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp))
#define ASSERT_ARGS_turn_ev_check __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -217,197 +187,6 @@
/*
-=item C<static void prederef_args(void **pc_prederef, PARROT_INTERP, const
-opcode_t *pc, const op_info_t *opinfo)>
-
-Called from C<do_prederef()> to deal with any arguments.
-
-C<pc_prederef> is the current opcode.
-
-=cut
-
-*/
-
-static void
-prederef_args(ARGMOD(void **pc_prederef), PARROT_INTERP,
- ARGIN(const opcode_t *pc), ARGIN(const op_info_t *opinfo))
-{
- ASSERT_ARGS(prederef_args)
- const PackFile_ConstTable * const const_table = interp->code->const_table;
-
- const int regs_n = Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), REGNO_NUM);
- const int regs_i = Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), REGNO_INT);
- const int regs_p = Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), REGNO_PMC);
- const int regs_s = Parrot_pcc_get_regs_used(interp, CURRENT_CONTEXT(interp), REGNO_STR);
-
- /* prederef var part too */
- const int m = opinfo->op_count;
- int n = opinfo->op_count;
- int i;
-
- ADD_OP_VAR_PART(interp, interp->code, pc, n);
- for (i = 1; i < n; i++) {
- const opcode_t arg = pc[i];
- int type;
- if (i >= m) {
- PMC * const sig = (PMC*) pc_prederef[1];
- type = VTABLE_get_integer_keyed_int(interp, sig, i - m);
- type &= (PARROT_ARG_TYPE_MASK | PARROT_ARG_CONSTANT);
- }
- else
- type = opinfo->types[i - 1];
-
- switch (type) {
-
- case PARROT_ARG_KI:
- case PARROT_ARG_I:
- if (arg < 0 || arg >= regs_i)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal register number");
-
- pc_prederef[i] = (void *)REG_OFFS_INT(arg);
- break;
-
- case PARROT_ARG_N:
- if (arg < 0 || arg >= regs_n)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal register number");
-
- pc_prederef[i] = (void *)REG_OFFS_NUM(arg);
- break;
-
- case PARROT_ARG_K:
- case PARROT_ARG_P:
- if (arg < 0 || arg >= regs_p)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal register number");
-
- pc_prederef[i] = (void *)REG_OFFS_PMC(arg);
- break;
-
- case PARROT_ARG_S:
- if (arg < 0 || arg >= regs_s)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal register number");
-
- pc_prederef[i] = (void *)REG_OFFS_STR(arg);
- break;
-
- case PARROT_ARG_KIC:
- case PARROT_ARG_IC:
- pc_prederef[i] = (void *)pc[i];
- break;
-
- case PARROT_ARG_NC:
- if (arg < 0 || arg >= const_table->const_count)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal constant number");
-
- pc_prederef[i] = (void *)&const_table->constants[arg]->u.number;
- break;
-
- case PARROT_ARG_SC:
- if (arg < 0 || arg >= const_table->const_count)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal constant number");
-
- pc_prederef[i] = (void *)const_table->constants[arg]->u.string;
- break;
-
- case PARROT_ARG_PC:
- case PARROT_ARG_KC:
- if (arg < 0 || arg >= const_table->const_count)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal constant number");
-
- pc_prederef[i] = (void *)const_table->constants[arg]->u.key;
- break;
- default:
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_ARG_OP_NOT_HANDLED,
- "Unhandled argtype 0x%x\n", type);
- break;
- }
- }
-}
-
-
-/*
-
-=item C<void do_prederef(void **pc_prederef, PARROT_INTERP, Parrot_runcore_t
-*runcore)>
-
-This is called from within the run cores to predereference the current
-opcode.
-
-C<pc_prederef> is the current opcode, and C<type> is the run core type.
-
-=cut
-
-*/
-
-void
-do_prederef(ARGIN(void **pc_prederef), PARROT_INTERP, ARGIN(Parrot_runcore_t *runcore))
-{
- ASSERT_ARGS(do_prederef)
- const size_t offset = pc_prederef - interp->code->prederef.code;
- opcode_t * const pc = ((opcode_t *)interp->code->base.data) + offset;
- const op_info_t *opinfo;
- size_t n;
-
- if (*pc < 0 || *pc >= (opcode_t)interp->op_count)
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INTERP_ERROR,
- "Illegal opcode");
-
- opinfo = &interp->op_info_table[*pc];
-
- prederef_args(pc_prederef, interp, pc, opinfo);
-
- if (PARROT_RUNCORE_PREDEREF_OPS_TEST(runcore)) {
- *pc_prederef = PARROT_RUNCORE_CGOTO_OPS_TEST(runcore)
- ? ((void **)interp->op_lib->op_func_table)[*pc]
- : (void**)*pc;
- }
- else
- Parrot_ex_throw_from_c_args(interp, NULL, 1,
- "Tried to prederef wrong core");
-
- /* now remember backward branches, invoke and similar opcodes */
- n = opinfo->op_count;
-
- if (((opinfo->jump & PARROT_JUMP_RELATIVE)
- && opinfo->types[n - 2] == PARROT_ARG_IC
- && pc[n - 1] < 0) /* relative backward branch */
- || (opinfo->jump & PARROT_JUMP_ADDRESS)) {
- Prederef * const pi = &interp->code->prederef;
-
- /* first time prederef.branches == NULL:
- * estimate size to 1/16th of opcodes */
- if (!pi->branches) {
- size_t nb = interp->code->base.size / 16;
- if (nb < 8)
- nb = (size_t)8;
-
- pi->branches = mem_gc_allocate_n_zeroed_typed(interp, nb, Prederef_branch);
- pi->n_allocated = nb;
- pi->n_branches = 0;
- }
- else if (pi->n_branches >= pi->n_allocated) {
- size_t old = pi->n_allocated;
- pi->n_allocated = (size_t) (pi->n_allocated * 1.5);
- pi->branches = mem_gc_realloc_n_typed_zeroed(interp,
- pi->branches, pi->n_allocated, old, Prederef_branch);
- }
-
- pi->branches[pi->n_branches].offs = offset;
- pi->branches[pi->n_branches].op = *pc_prederef;
-
- ++pi->n_branches;
- }
-}
-
-
-/*
-
=item C<static void turn_ev_check(PARROT_INTERP, int on)>
Turn on or off event checking for prederefed cores.
Deleted: branches/rm_cflags/src/tsq.c
==============================================================================
--- branches/rm_cflags/src/tsq.c Thu Mar 4 20:51:45 2010 (r44631)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,426 +0,0 @@
-/*
-Copyright (C) 2001-2009, Parrot Foundation.
-$Id$
-
-=head1 NAME
-
-src/tsq.c - Thread-safe queues
-
-=head1 DESCRIPTION
-
-This file implements thread-safe queues for Parrot.
-
-=head2 Functions
-
-=over 4
-
-=cut
-
-*/
-
-#include "parrot/parrot.h"
-
-/* HEADERIZER HFILE: include/parrot/tsq.h */
-
-/*
-
-=item C<QUEUE_ENTRY * pop_entry(QUEUE *queue)>
-
-Does a synchronized removal of the head entry off the queue and returns it.
-
-=cut
-
-*/
-
-PARROT_CAN_RETURN_NULL
-QUEUE_ENTRY *
-pop_entry(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(pop_entry)
- QUEUE_ENTRY *returnval;
- queue_lock(queue);
- returnval = nosync_pop_entry(queue);
- queue_unlock(queue);
- return returnval;
-}
-
-/*
-
-=item C<QUEUE_ENTRY * peek_entry(const QUEUE *queue)>
-
-This does no locking, so the result might have changed by the time you
-get the entry, but a synchronized C<pop_entry()> will check again and
-return C<NULL> if the queue is empty.
-
-=cut
-
-*/
-
-PARROT_CAN_RETURN_NULL
-PARROT_WARN_UNUSED_RESULT
-QUEUE_ENTRY *
-peek_entry(ARGIN(const QUEUE *queue))
-{
- ASSERT_ARGS(peek_entry)
- return queue->head;
-}
-
-/*
-
-=item C<QUEUE_ENTRY * nosync_pop_entry(QUEUE *queue)>
-
-Grab an entry off the queue with no synchronization. Internal only,
-because it's darned evil and shouldn't be used outside the module. It's
-in here so we don't have to duplicate pop code.
-
-=cut
-
-*/
-
-PARROT_CANNOT_RETURN_NULL
-QUEUE_ENTRY *
-nosync_pop_entry(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(nosync_pop_entry)
- QUEUE_ENTRY *returnval;
- if (!queue->head) {
- return NULL;
- }
- returnval = queue->head;
- if (queue->head == queue->tail) {
- queue->head = NULL;
- queue->tail = NULL;
- }
- else {
- queue->head = queue->head->next;
- }
- returnval->next = NULL;
- return returnval;
-}
-
-/*
-
-=item C<QUEUE_ENTRY * wait_for_entry(QUEUE *queue)>
-
-Does a synchronized removal of the head entry off the queue, waiting if
-necessary until there is an entry, and then returns it.
-
-=cut
-
-*/
-
-PARROT_CAN_RETURN_NULL
-QUEUE_ENTRY *
-wait_for_entry(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(wait_for_entry)
- QUEUE_ENTRY *returnval;
-
- queue_lock(queue);
- while (queue->head == NULL) {
- queue_wait(queue);
- }
- returnval = nosync_pop_entry(queue);
- queue_unlock(queue);
- return returnval;
-
-}
-
-/*
-
-=item C<void push_entry(QUEUE *queue, QUEUE_ENTRY *entry)>
-
-Does a synchronized insertion of C<entry> onto the tail of the queue.
-
-=cut
-
-*/
-
-void
-push_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(push_entry)
- queue_lock(queue);
- /* Is there something in the queue? */
- if (queue->tail) {
- queue->tail->next = entry;
- queue->tail = entry;
- }
- else {
- queue->head = entry;
- queue->tail = entry;
- }
- queue_signal(queue); /* assumes only one waiter */
- queue_unlock(queue);
-}
-
-/*
-
-=item C<void unshift_entry(QUEUE *queue, QUEUE_ENTRY *entry)>
-
-Does a synchronized insertion of C<entry> into the head of the queue.
-
-=cut
-
-*/
-
-void
-unshift_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(unshift_entry)
- QUEUE_ENTRY *cur;
-
- queue_lock(queue);
- cur = queue->head;
- if (!cur) {
- /* empty just set head */
- queue->head = entry;
- queue->tail = entry;
- }
- else {
- queue->head = entry;
- entry->next = cur;
- }
- queue_signal(queue);
- queue_unlock(queue);
-}
-
-/*
-
-=item C<void nosync_insert_entry(QUEUE *queue, QUEUE_ENTRY *entry)>
-
-Inserts a timed event according to C<abstime>. The caller has to hold the
-queue mutex.
-
-=cut
-
-*/
-
-void
-nosync_insert_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(nosync_insert_entry)
- QUEUE_ENTRY *cur = queue->head;
- QUEUE_ENTRY *prev;
- parrot_event *event;
- FLOATVAL abs_time;
-
- PARROT_ASSERT(entry->type == QUEUE_ENTRY_TYPE_TIMED_EVENT);
- /*
- * empty queue - just insert
- */
- if (!cur) {
- queue->head = entry;
- queue->tail = entry;
- return;
- }
-
- prev = NULL;
- event = (parrot_event *)entry->data;
- abs_time = event->u.timer_event.abs_time;
-
- while (cur && cur->type == QUEUE_ENTRY_TYPE_TIMED_EVENT) {
- const parrot_event * const cur_event = (parrot_event *)cur->data;
- if (abs_time > cur_event->u.timer_event.abs_time) {
- prev = cur;
- cur = cur->next;
- }
- else
- break;
- }
- if (!prev)
- queue->head = entry;
- else {
- prev->next = entry;
- if (prev == queue->tail)
- queue->tail = entry;
- }
- entry->next = cur;
-}
-
-/*
-
-=item C<void insert_entry(QUEUE *queue, QUEUE_ENTRY *entry)>
-
-Does a synchronized insert of C<entry>.
-
-=cut
-
-*/
-
-void
-insert_entry(ARGMOD(QUEUE *queue), ARGIN(QUEUE_ENTRY *entry))
-{
- ASSERT_ARGS(insert_entry)
- queue_lock(queue);
- nosync_insert_entry(queue, entry);
- queue_signal(queue);
- queue_unlock(queue);
-}
-
-/*
-
-=item C<void queue_lock(QUEUE *queue)>
-
-Locks the queue's mutex.
-
-=cut
-
-*/
-
-void
-queue_lock(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_lock)
- LOCK(queue->queue_mutex);
-}
-
-/*
-
-=item C<void queue_unlock(QUEUE *queue)>
-
-Unlocks the queue's mutex.
-
-=cut
-
-*/
-
-void
-queue_unlock(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_unlock)
- UNLOCK(queue->queue_mutex);
-}
-
-/*
-
-=item C<void queue_broadcast(QUEUE *queue)>
-
-This function wakes up I<every> thread waiting on the queue.
-
-=cut
-
-*/
-
-void
-queue_broadcast(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_broadcast)
- COND_BROADCAST(queue->queue_condition);
-}
-
-/*
-
-=item C<void queue_signal(QUEUE *queue)>
-
-=cut
-
-*/
-
-void
-queue_signal(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_signal)
- COND_SIGNAL(queue->queue_condition);
-}
-
-/*
-
-=item C<void queue_wait(QUEUE *queue)>
-
-Instructs the queue to wait.
-
-=cut
-
-*/
-
-void
-queue_wait(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_wait)
- COND_WAIT(queue->queue_condition, queue->queue_mutex);
-}
-
-/*
-
-=item C<void queue_timedwait(QUEUE *queue, const struct timespec *abs_time)>
-
-Instructs the queue to wait for C<abs_time> seconds (?).
-
-=cut
-
-*/
-
-void
-queue_timedwait(ARGMOD(QUEUE *queue), ARGIN(const struct timespec *abs_time))
-{
- ASSERT_ARGS(queue_timedwait)
- COND_TIMED_WAIT(queue->queue_condition, queue->queue_mutex, abs_time);
-}
-
-/*
-
-=item C<QUEUE* queue_init(UINTVAL prio)>
-
-Initializes the queue, setting C<prio> as the queue's priority.
-
-=cut
-
-*/
-
-PARROT_CAN_RETURN_NULL
-PARROT_MALLOC
-QUEUE*
-queue_init(UINTVAL prio)
-{
- ASSERT_ARGS(queue_init)
- QUEUE * const queue = mem_internal_allocate_typed(QUEUE);
-
- queue->head = queue->tail = NULL;
- queue->max_prio = prio;
- COND_INIT(queue->queue_condition);
- MUTEX_INIT(queue->queue_mutex);
- return queue;
-}
-
-/*
-
-=item C<void queue_destroy(QUEUE *queue)>
-
-Destroys the queue, raising an exception if it is not empty.
-
-=cut
-
-*/
-
-void
-queue_destroy(ARGMOD(QUEUE *queue))
-{
- ASSERT_ARGS(queue_destroy)
- if (peek_entry(queue))
- exit_fatal(1, "Queue not empty on destroy");
-
- COND_DESTROY(queue->queue_condition);
- MUTEX_DESTROY(queue->queue_mutex);
- mem_internal_free(queue);
-}
-
-/*
-
-=back
-
-=head1 SEE ALSO
-
-F<include/parrot/tsq.h>.
-
-=cut
-
-*/
-
-
-/*
- * Local variables:
- * c-file-style: "parrot"
- * End:
- * vim: expandtab shiftwidth=4:
- */
Modified: branches/rm_cflags/t/codingstd/c_function_docs.t
==============================================================================
--- branches/rm_cflags/t/codingstd/c_function_docs.t Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/t/codingstd/c_function_docs.t Thu Mar 4 20:51:45 2010 (r44632)
@@ -121,7 +121,6 @@
src/string/charset/binary.c
src/string/charset/iso-8859-1.c
src/string/charset/unicode.c
-src/tsq.c
# Local Variables:
# mode: cperl
Modified: branches/rm_cflags/t/codingstd/perlcritic.t
==============================================================================
--- branches/rm_cflags/t/codingstd/perlcritic.t Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/t/codingstd/perlcritic.t Thu Mar 4 20:51:45 2010 (r44632)
@@ -40,7 +40,13 @@
use Parrot::Distribution;
use Test::More;
-# There's no point in continuing if we're missing some certain modules.
+# There's no point in continuing if we're missing some certain modules, or
+# if the developer doesn't want to.
+
+if (exists $ENV{'PARROT_TEST_NO_PERLCRITIC'}) {
+ give_up('absence of PARROT_TEST_NO_PERLCRITIC environment variable');
+}
+
eval { require Test::Perl::Critic };
if ($@) {
give_up('Test::Perl::Critic');
Modified: branches/rm_cflags/t/native_pbc/annotations.pbc
==============================================================================
Binary file (source and/or target). No diff available.
Modified: branches/rm_cflags/t/native_pbc/integer_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.
Modified: branches/rm_cflags/t/native_pbc/number_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.
Modified: branches/rm_cflags/t/native_pbc/string_1.pbc
==============================================================================
Binary file (source and/or target). No diff available.
Modified: branches/rm_cflags/t/pmc/signal.t
==============================================================================
--- branches/rm_cflags/t/pmc/signal.t Thu Mar 4 20:42:24 2010 (r44631)
+++ branches/rm_cflags/t/pmc/signal.t Thu Mar 4 20:51:45 2010 (r44632)
@@ -22,8 +22,7 @@
=cut
-# actually more platforms should work - all POSIX compliant ones - but
-# signals are currently not enabled for all in src/events.c
+# actually more platforms should work - all POSIX compliant ones
# a second problem is to get the test doing the right thing: mainly figuring
# out what PID to kill. The "ps" command isn't one of the portable ones.
More information about the parrot-commits
mailing list