--- deliantra/server/include/cfperl.h 2007/02/15 21:07:49 1.56 +++ deliantra/server/include/cfperl.h 2007/05/24 03:33:29 1.65 @@ -4,7 +4,9 @@ #ifndef CFPERL_H__ #define CFPERL_H__ +#include #include +#include using namespace std; @@ -64,6 +66,7 @@ void cfperl_main (); void cfperl_emergency_save (); void cfperl_cleanup (int make_core); +void cfperl_make_book (object *book, int level); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -90,6 +93,10 @@ NUM_EVENT_TYPES }; +// in which global events or per-type events are we interested +extern bitset ev_want_event; +extern bitset ev_want_type; + #define ARG_AV(o) DT_AV , static_cast (o) #define ARG_INT(v) DT_INT , static_cast (v) #define ARG_INT64(v) DT_INT64 , static_cast (v) @@ -138,8 +145,8 @@ }; // object is delete'd after the refcount reaches 0 - mutable int ACC (RW, refcnt); int ACC (RW, flags); + mutable int ACC (RW, refcnt); MTH void refcnt_inc () const { ++refcnt; } MTH void refcnt_dec () const { --refcnt; } @@ -185,7 +192,18 @@ attachable &operator =(const attachable &src); - bool invoke (event_type event, ...); + bool vinvoke (event_type event, va_list &ap); + bool invoke (event_type event, ...) + { + if (ev_want_event [event] || cb) + { + va_list ap; + va_start (ap, event); + vinvoke (event, ap); + va_end (ap); + } + } + MTH void instantiate (); void reattach (); @@ -207,7 +225,7 @@ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -struct object_freezer : dynbuf +struct object_freezer : dynbuf_text { AV *av; @@ -337,8 +355,8 @@ }; // compatibility support, should be removed when no longer needed -int fprintf (object_freezer &freezer, const char *format, ...); -int fputs (const char *s, object_freezer &freezer); +void fprintf (object_freezer &freezer, const char *format, ...); +void fputs (const char *s, object_freezer &freezer); struct object_thawer { @@ -359,19 +377,19 @@ void get (attachable *obj, int oid); // parse next line - void next_kv (); - //TODO: remove + void next (); + // skip the current key-value (usually fetch next line, for + // multiline-fields, skips untilt he corresponding end-kw + void skip (); + + //TODO: remove, deprecated keyword get_kv () { - next_kv (); + next (); return kw; } - // skip the current key-value (usually fetch next line, for - // multiline-fields, skips untilt he corresponding end-kw - void skip_kv (); - - const char *get_str () { return value; } // may be 0 + char *get_str () { return value; } // may be 0 void get (shstr &sh) const; void get_ornull (shstr &sh) const { sh = value; } @@ -408,18 +426,34 @@ static int nready () { return CORO_NREADY; } static int cede () { return CORO_CEDE ; } + static double (*time)(); + static double next_cede; static int cede_counter; + static void do_cede_every (); + static void do_cede_to_tick (); + static void do_cede_to_tick_every (); + static void cede_every (int count) { if (++cede_counter >= count) - { - cede_counter = 0; + do_cede_every (); + } - if (coroapi::nready ()) - coroapi::cede (); - } + static void cede_to_tick () + { + if (time () >= next_cede) + do_cede_to_tick (); + } + + static void cede_to_tick_every (int count) + { + if (++cede_counter >= count) + cede_to_tick (); } + + static void wait_for_tick (); + static void wait_for_tick_begin (); }; struct watcher_base