Пример #1
0
/*
 * Despite the name, this routine takes care of several things.
 * It will run once every 15 minutes.
 *
 * . It will attempt to reconnect to the address server if the connection has
 *   been lost.
 * . It will loop through all objects.
 *
 *   . If an object is found in a state of not having done reset, and the
 *     delay to next reset has passed, then reset() will be done.
 *
 *   . If the object has a existed more than the time limit given for swapping,
 *     then 'clean_up' will first be called in the object
 *
 * There are some problems if the object self-destructs in clean_up, so
 * special care has to be taken of how the linked list is used.
 */
static void look_for_objects_to_swap()
{
	static int next_time;
#ifndef NO_IP_DEMON
	extern int no_ip_demon;
	static int next_server_time;
#endif
	object_t *ob;
	VOLATILE object_t *next_ob, *last_good_ob;
	error_context_t econ;

#ifndef NO_IP_DEMON
	if (current_time >= next_server_time) {
		/* initialize the address server.  if it is already initialized, then
		 * this is a nop.  this will cause the driver to reattempt connecting
		 * to the address server once every 15 minutes in the event that it
		 * has gone down.
		 */
		if (!no_ip_demon && next_server_time)
			init_addr_server(ADDR_SERVER_IP, ADDR_SERVER_PORT);
		next_server_time = current_time + 15 * 60;
	}
#endif

	if (current_time < next_time)
		return;     /* Not time to look yet */
	next_time = current_time + 5 * 60; /* Next time is in 5 minutes */

	/*
	 * Objects object can be destructed, which means that next object to
	 * investigate is saved in next_ob. If very unlucky, that object can be
	 * destructed too. In that case, the loop is simply restarted.
	 */
	next_ob = obj_list;
	last_good_ob = obj_list;
	save_context(&econ);
	if (SETJMP(econ.context))
		restore_context(&econ);

	while ((ob = (object_t *)next_ob)) {
		int ready_for_clean_up = 0;

		if (ob->flags & O_DESTRUCTED){
			if(last_good_ob->flags & O_DESTRUCTED)
				ob = obj_list;  /* restart */
			else
				ob = (object_t *)last_good_ob;
		}
		next_ob = ob->next_all;

		/*
		 * Check reference time before reset() is called.
		 */
		if (current_time - ob->time_of_ref > time_to_clean_up)
			ready_for_clean_up = 1;
#if !defined(NO_RESETS) && !defined(LAZY_RESETS)
		/*
		 * Should this object have reset(1) called ?
		 */
		if ((ob->flags & O_WILL_RESET) && (ob->next_reset < current_time)
				&& !(ob->flags & O_RESET_STATE)) {
			debug(d_flag, ("RESET /%s\n", ob->obname));
			set_eval(max_cost);
			reset_object(ob);
			if(ob->flags & O_DESTRUCTED)
				continue;
		}
#endif
		if (time_to_clean_up > 0) {
			/*
			 * Has enough time passed, to give the object a chance to
			 * self-destruct ? Save the O_RESET_STATE, which will be cleared.
			 *
			 * Only call clean_up in objects that has defined such a function.
			 *
			 * Only if the clean_up returns a non-zero value, will it be called
			 * again.
			 */

			if (ready_for_clean_up && (ob->flags & O_WILL_CLEAN_UP)) {
				int save_reset_state = ob->flags & O_RESET_STATE;
				svalue_t *svp;

				debug(d_flag, ("clean up /%s\n", ob->obname));

				/*
				 * Supply a flag to the object that says if this program is
				 * inherited by other objects. Cloned objects might as well
				 * believe they are not inherited. Swapped objects will not
				 * have a ref count > 1 (and will have an invalid ob->prog
				 * pointer).
				 *
				 * Note that if it is in the apply_low cache, it will also
				 * get a flag of 1, which may cause the mudlib not to clean
				 * up the object.  This isn't bad because:
				 * (1) one expects it is rare for objects that have untouched
				 * long enough to clean_up to still be in the cache, especially
				 * on busy MUDs.
				 * (2) the ones that are are the more heavily used ones, so
				 * keeping them around seems justified.
				 */

				push_number(ob->flags & (O_CLONE) ? 0 : ob->prog->ref);
				set_eval(max_cost);
				svp = apply(APPLY_CLEAN_UP, ob, 1, ORIGIN_DRIVER);
				if (ob->flags & O_DESTRUCTED)
					continue;
				if (!svp || (svp->type == T_NUMBER && svp->u.number == 0))
					ob->flags &= ~O_WILL_CLEAN_UP;
				ob->flags |= save_reset_state;
			}
		}
		last_good_ob = ob;
	}
	pop_context(&econ);
}       /* look_for_objects_to_swap() */
Пример #2
0
  // On copy apply for type channel!
  bool huMoments::apply(const channel& src,dvector& dest) const {

    dvector more;
    more.resize(MORE_FEAT,0,false,true);
    return apply(src,dest,more);
  };
Пример #3
0
 virtual void apply(osg::Node& node)
 {
     if (node.getStateSet()) apply(*node.getStateSet());
     traverse(node);
 }
Пример #4
0
 virtual void	Status	(TStatus& S)
 {
     CCC_Float::Status	(S);
     apply				();
 }
Пример #5
0
 virtual void Execute(LPCSTR args)
 {
     CCC_Float::Execute	(args);
     apply				();
 }
Пример #6
0
 virtual void	Status	(TStatus& S)
 {
     CCC_Integer::Status		(S);
     apply					();
 }
Пример #7
0
 virtual void Execute	(LPCSTR args)
 {
     CCC_Integer::Execute	(args);
     apply					();
 }