Example #1
0
void target_manager::rebuild_targets(uint32_t screen, uint32_t style)
{
	if (style == TARGET_STYLE_CUSTOM) return;

	std::vector<bgfx_target*> to_resize;
	for (std::pair<std::string, bgfx_target*> target_pair : m_targets)
	{
		bgfx_target* target = target_pair.second;
		if (target == nullptr || target->style() != style || target->screen_index() != screen)
		{
			continue;
		}
		to_resize.push_back(target);
	}

	std::vector<osd_dim>& sizes = style == TARGET_STYLE_GUEST ? m_guest_dims : m_native_dims;
	for (bgfx_target* target : to_resize)
	{
		std::string name = target->name();
		const bgfx::TextureFormat::Enum format = target->format();
		const bool double_buffered = target->double_buffered();
		const bool filter = target->filter();
		const uint16_t scale = target->scale();
		const uint16_t width(sizes[screen].width());
		const uint16_t height(sizes[screen].height());
		delete target;

		create_target(name, format, width, height, style, double_buffered, filter, scale, screen);
	}
}
Example #2
0
/**
 * \brief Create the level.
 */
void rp::level_generator::create_level()
{
  bear::universe::position_type pos(get_top_left());
  bool previous_is_slope(false);
  unsigned int last_paint = 0;

  for(unsigned int i = 0; i != 100; i++ )
    {
      const double selector = (double)rand() / RAND_MAX;

      if ( ( ( selector < 0.9 ) && previous_is_slope ) ||
	   ( ( selector < 0.5 ) && ! previous_is_slope ) )
	{
	  previous_is_slope = true;
	  add_slope(pos);
	}
      else
	{
	  previous_is_slope = false;
	  add_ground(pos);
	}

      create_target(pos);
      
      if ( ( ((double)rand() / RAND_MAX) < 0.1 ) && 
	   ( i - last_paint > 50 ) )
	{
	  last_paint = i;
	  create_bonus(pos);
	}
    }  
} // rp::level_generator::create_level()
Example #3
0
void target_manager::create_target_if_nonexistent(uint32_t screen, std::string name, bool double_buffered, bool filter, uint32_t style)
{
	if (style == TARGET_STYLE_CUSTOM) return;

	if (m_targets[name + std::to_string(screen)] != nullptr)
	{
		return;
	}

	std::vector<osd_dim>& sizes = style == TARGET_STYLE_GUEST ? m_guest_dims : m_native_dims;
	uint16_t width(sizes[screen].width());
	uint16_t height(sizes[screen].height());

	create_target(name, bgfx::TextureFormat::RGBA8, width, height, style, double_buffered, filter, 1, screen);
}
Example #4
0
/*
 * Copy all relation data files from datadir_source to datadir_target, which
 * are marked in the given data page map.
 */
void
copy_executeFileMap(filemap_t *map)
{
	file_entry_t *entry;
	int			i;

	for (i = 0; i < map->narray; i++)
	{
		entry = map->array[i];
		execute_pagemap(&entry->pagemap, entry->path);

		switch (entry->action)
		{
			case FILE_ACTION_NONE:
				/* ok, do nothing.. */
				break;

			case FILE_ACTION_COPY:
				rewind_copy_file_range(entry->path, 0, entry->newsize, true);
				break;

			case FILE_ACTION_TRUNCATE:
				truncate_target_file(entry->path, entry->newsize);
				break;

			case FILE_ACTION_COPY_TAIL:
				rewind_copy_file_range(entry->path, entry->oldsize,
									   entry->newsize, false);
				break;

			case FILE_ACTION_CREATE:
				create_target(entry);
				break;

			case FILE_ACTION_REMOVE:
				remove_target(entry);
				break;
		}
	}

	close_target_file();
}
Example #5
0
/*
 * Fetch all changed blocks from remote source data directory.
 */
void
libpq_executeFileMap(filemap_t *map)
{
	file_entry_t *entry;
	const char *sql;
	PGresult   *res;
	int			i;

	/*
	 * First create a temporary table, and load it with the blocks that we
	 * need to fetch.
	 */
	sql = "CREATE TEMPORARY TABLE fetchchunks(path text, begin int8, len int4);";
	res = PQexec(conn, sql);

	if (PQresultStatus(res) != PGRES_COMMAND_OK)
		pg_fatal("could not create temporary table: %s",
				 PQresultErrorMessage(res));
	PQclear(res);

	sql = "COPY fetchchunks FROM STDIN";
	res = PQexec(conn, sql);

	if (PQresultStatus(res) != PGRES_COPY_IN)
		pg_fatal("could not send file list: %s",
				 PQresultErrorMessage(res));
	PQclear(res);

	for (i = 0; i < map->narray; i++)
	{
		entry = map->array[i];

		/* If this is a relation file, copy the modified blocks */
		execute_pagemap(&entry->pagemap, entry->path);

		switch (entry->action)
		{
			case FILE_ACTION_NONE:
				/* nothing else to do */
				break;

			case FILE_ACTION_COPY:
				/* Truncate the old file out of the way, if any */
				open_target_file(entry->path, true);
				fetch_file_range(entry->path, 0, entry->newsize);
				break;

			case FILE_ACTION_TRUNCATE:
				truncate_target_file(entry->path, entry->newsize);
				break;

			case FILE_ACTION_COPY_TAIL:
				fetch_file_range(entry->path, entry->oldsize, entry->newsize);
				break;

			case FILE_ACTION_REMOVE:
				remove_target(entry);
				break;

			case FILE_ACTION_CREATE:
				create_target(entry);
				break;
		}
	}

	if (PQputCopyEnd(conn, NULL) != 1)
		pg_fatal("could not send end-of-COPY: %s",
				 PQerrorMessage(conn));

	while ((res = PQgetResult(conn)) != NULL)
	{
		if (PQresultStatus(res) != PGRES_COMMAND_OK)
			pg_fatal("unexpected result while sending file list: %s",
					 PQresultErrorMessage(res));
		PQclear(res);
	}

	/*
	 * We've now copied the list of file ranges that we need to fetch to the
	 * temporary table. Now, actually fetch all of those ranges.
	 */
	sql =
		"SELECT path, begin, \n"
		"  pg_read_binary_file(path, begin, len, true) AS chunk\n"
		"FROM fetchchunks\n";

	receiveFileChunks(sql);
}
Example #6
0
// flags = 0 -- syntax check only (first pass), flags = 1 -- create targets and points as well (second pass)
int parse_config (struct mc_config *MC, struct mc_config *MC_Old, int flags) {
  int r, c, l, i;
  struct hostent *h;
  char *hostname;
  int dup_port_checked, cluster_disabled;

  if (!(flags & 1)) {
    config_bytes = r = read (fd[0], config_buff, MAX_CONFIG_SIZE+1);
    if (r < 0) {
      fprintf (stderr, "error reading configuration file %s: %m\n", config_filename);
      return -2;
    }
    if (r > MAX_CONFIG_SIZE) {
      fprintf (stderr, "configuration file %s too long (max %d bytes)\n", config_filename, MAX_CONFIG_SIZE);
      return -2;
    }
  }

  cfg_cur = cfg_start = config_buff;
  cfg_end = cfg_start + config_bytes;
  *cfg_end = 0;
  cfg_lno = 0;
  
  if (!(flags & 1) && MC_Old) {
    for (i = 0; i < MC_Old->clusters_num; i++) {
      MC_Old->Clusters[i].other_cluster_no = -1;
    }
  }

  MC->ConfigServersCount = 0;
  MC->clusters_num = 0;
  while (cfg_skipspc ()) {
    struct mc_cluster *C = &MC->Clusters[MC->clusters_num];
    if (cfg_getlex () != 'c') {
      return syntax ("'cluster' expected");
    }
    assert (MC->clusters_num < MAX_CLUSTERS);
    l = cfg_getword ();
    if (!l) {
      return syntax ("cluster name expected");
    }
    C->cluster_mode = default_cluster_mode;
    memcpy (&C->mc_proxy_inbound, &mc_proxy_inbound, sizeof (struct memcache_server_functions));
    C->mc_proxy_inbound.info = C;
    C->cluster_no = MC->clusters_num++;

    if (C->cluster_name) {
      zfree (C->cluster_name, strlen (C->cluster_name) + 1);
    }
    C->cluster_name = zmalloc (l+1);
    memcpy (C->cluster_name, cfg_cur, l);
    C->cluster_name[l] = 0;
    cfg_cur += l;

    C->get_timeout = 0.3;
    C->set_timeout = 0.5;
    C->min_connections = default_min_connections;
    C->max_connections = default_max_connections;
    C->step = 0;
    C->tot_buckets = 0;
    C->port = 0;
    C->points_num = 0;
    C->crypto = 0;
    dup_port_checked = 0;
    cluster_disabled = 0;
    C->a_req = C->a_rbytes = C->a_sbytes = C->a_timeouts = 0;
    C->t_req = C->t_rbytes = C->t_sbytes = C->t_timeouts = 0;

    if (!(flags & 1)) {
      C->other_cluster_no = -1;
    }

    cfg_getlex ();
    Expect ('{');
    cfg_getlex ();
    while (cfg_lex != '}') {
      switch (cfg_lex) {
      case 'l':
        if (C->port) {
          return syntax ("second listen in same cluster");
        }
        C->port = cfg_getint();
        if (!C->port) {
          return syntax ("port number expected");
        }
        if (C->port <= 0 || C->port >= 0x10000) {
          return syntax("port number out of range");
        }
	if (!(flags & 1)) {
	  for (i = 0; i < MC->clusters_num-1; i++) {
	    if (MC->Clusters[i].port == C->port) {
	      return syntax ("duplicate listen port");
	    }
	  }
	  dup_port_checked = 1;
	}
        break;
      case 'p':
        if (C->points_num) {
          return syntax ("redefined points number for same cluster");
        }
        C->points_num = cfg_getint ();
        if (C->points_num < 0 || C->points_num > 1000) {
          return syntax ("points number should be between 0 and 1000");
        }
        break;
      case 'm':
        l = cfg_getword ();
        if (l == 9 && !memcmp (cfg_cur, "memcached", 9)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_MEMCACHED;
        } else if (l == 8 && !memcmp (cfg_cur, "firstint", 8)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_FIRSTINT;
        } else if (l == 6 && !memcmp (cfg_cur, "random", 6)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_RANDOM;
        } else if (l == 9 && !memcmp (cfg_cur, "secondint", 9)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_SECONDINT;
        } else if (l == 8 && !memcmp (cfg_cur, "thirdint", 8)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_THIRDINT;
        } else if (l == 9 && !memcmp (cfg_cur, "fourthint", 9)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_FOURTHINT;
        } else if (l == 8 && !memcmp (cfg_cur, "fifthint", 8)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_FIFTHINT;
        } else if (l == 10 && !memcmp (cfg_cur, "persistent", 10)) {
          C->cluster_mode = (C->cluster_mode & -256) | CLUSTER_MODE_PERSISTENT;
        } else {
          return syntax ("unknown cluster mode");
        }
        cfg_cur += l;
        break;
      case 'e':
        l = cfg_getword ();
        if (l == 4 && !memcmp (cfg_cur, "text", 4)) {
          C->cluster_mode |= CLUSTER_MODE_TEXT;
        } else if (l == 5 && !memcmp (cfg_cur, "lists", 5)) {
          C->cluster_mode |= CLUSTER_MODE_LISTS;
        } else if (l == 5 && !memcmp (cfg_cur, "hints", 5)) {
          C->cluster_mode |= CLUSTER_MODE_HINTS;
        } else if (l == 4 && !memcmp (cfg_cur, "logs", 4)) {
          C->cluster_mode |= CLUSTER_MODE_LOGS;
        } else if (l == 5 && !memcmp (cfg_cur, "magus", 5)) {
          C->cluster_mode |= CLUSTER_MODE_MAGUS;
        } else if (l == 4 && !memcmp (cfg_cur, "news", 4)) {
          C->cluster_mode |= CLUSTER_MODE_NEWS;
        } else if (l == 10 && !memcmp (cfg_cur, "roundrobin", 10)) {
          C->cluster_mode |= CLUSTER_MODE_ROUNDROBIN;
        } else if (l == 5 && !memcmp (cfg_cur, "bayes", 5)) {
          C->cluster_mode |= CLUSTER_MODE_BAYES;
        } else if (l == 7 && !memcmp (cfg_cur, "support", 7)) {
          C->cluster_mode |= CLUSTER_MODE_SUPPORT;
        } else if (l == 5 && !memcmp (cfg_cur, "photo", 5)) {
          C->cluster_mode |= CLUSTER_MODE_PHOTO;
        } else if (l == 3 && !memcmp (cfg_cur, "dot", 3)) {
          C->cluster_mode |= CLUSTER_MODE_DOT;
        } else if (l == 4 && !memcmp (cfg_cur, "temp", 4)) {
          C->cluster_mode |= CLUSTER_MODE_TEMP;
        } else if (l == 8 && !memcmp (cfg_cur, "antispam", 8)) {
          C->cluster_mode |= CLUSTER_MODE_ANTISPAM;
        } else if (l == 6 && !memcmp (cfg_cur, "search", 6)){
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_SEARCH;
        } else if (l == 4 && !memcmp (cfg_cur, "targ", 4)){
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_TARG;
        } else if (l == 7 && !memcmp (cfg_cur, "news_ug", 7)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_NEWS_UG;
        } else if (l == 6 && !memcmp (cfg_cur, "news_g", 6)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_NEWS_G;
        } else if (l == 5 && !memcmp (cfg_cur, "newsr", 5)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_NEWSR;
        } else if (l == 9 && !memcmp (cfg_cur, "news_comm", 9)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_NEWS_COMM;
        } else if (l == 6 && !memcmp (cfg_cur, "statsx", 6)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_STATSX;
        } else if (l == 7 && !memcmp (cfg_cur, "friends", 7)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_FRIENDS;
        } else if (l == 7 && !memcmp (cfg_cur, "searchx", 7)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_SEARCHX;
        } else if (l == 8 && !memcmp (cfg_cur, "watchcat", 8)) {
          C->cluster_mode |= CLUSTER_MODE_WATCHCAT;
        } else if (l == 11 && !memcmp (cfg_cur, "hints_merge", 11)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_HINTS_MERGE;
        } else if (l == 12 && !memcmp (cfg_cur, "random_merge", 12)) {
          if (C->cluster_mode & CLUSTER_MODE_MERGE) {
            return syntax ("Can not enable two merge extensions");
          }
          C->cluster_mode |= CLUSTER_MODE_RANDOM_MERGE;
        } else {
          return syntax ("unknown extension");
        }
        cfg_cur += l;
        break;
      case 't':
        C->get_timeout = cfg_getint ();
        if (C->get_timeout < 10 || C->get_timeout > 30000) {
          return syntax ("invalid timeout");
        }
        C->get_timeout /= 1000;
        C->set_timeout = C->get_timeout + 0.2;
        break;
      case 'C':
	C->crypto = 1;
	break;
      case 'T':
        C->step = cfg_getint ();
        if (C->step < 0) {
          return syntax ("invalid step value");
        }
        break;
      case 'G':
        C->get_timeout = cfg_getint ();
        if (C->get_timeout < 10 || C->get_timeout > 30000) {
          return syntax ("invalid timeout");
        }
        C->get_timeout /= 1000;
        break;
      case 'S':
        C->set_timeout = cfg_getint ();
        if (C->set_timeout < 10 || C->set_timeout > 30000) {
          return syntax ("invalid timeout");
        }
        C->set_timeout /= 1000;
        break;
      case 's':
        assert (C->tot_buckets < MAX_CLUSTER_SERVERS);
        l = cfg_getword ();
        if (!l || l > 63) {
          return syntax ("hostname expected");
        }
        c = cfg_cur[l];
        hostname = cfg_cur;
        cfg_cur[l] = 0;

        if (!(h = kdb_gethostbyname (cfg_cur)) || h->h_addrtype != AF_INET || h->h_length != 4 || !h->h_addr_list || !h->h_addr) {
          return syntax ("cannot resolve hostname");
        }
        default_ct.target = *((struct in_addr *) h->h_addr);

        *(cfg_cur += l) = c;
        cfg_getlex ();
        Expect (':');
        default_ct.port = cfg_getint();
        if (!default_ct.port) {
          return syntax ("port number expected");
        }
        
        if (default_ct.port <= 0 || default_ct.port >= 0x10000) {
          return syntax ("port number out of range");
        }

        default_ct.min_connections = C->min_connections;
        default_ct.max_connections = C->max_connections;
        default_ct.reconnect_timeout = 1.0 + 0.1 * drand48 ();

	default_ct.extra = (C->crypto ? &mc_proxy_outbound_crypto : &mc_proxy_outbound);

	if ((flags & 1) && !cluster_disabled) {
	  int was_created = -1;
	  struct conn_target *D = create_target (&default_ct, &was_created);
	  if (was_created <= 0) {
	    //  syntax_warning ("duplicate hostname:port %.*s:%d in cluster", l, hostname, default_ct.port);
	  }

	  MC->ConfigServers[MC->ConfigServersCount] = D;
	  C->buckets[C->tot_buckets] = D;
	}

	if (!cluster_disabled) {
	  C->tot_buckets++;
	  assert (MC->ConfigServersCount++ < MAX_CLUSTER_SERVERS);
	}

        vkprintf (1, "server #%d: ip %s, port %d\n", MC->ConfigServersCount, inet_ntoa (default_ct.target), default_ct.port);
        break;
      case 'X':
        C->max_connections = cfg_getint ();
        if (C->max_connections < C->min_connections || C->max_connections > 1000) {
          return syntax ("invalid max connections");
        }
        break;
      case 'x':
        C->min_connections = cfg_getint ();
        if (C->min_connections < 1 || C->min_connections > C->max_connections) {
          return syntax ("invalid min connections");
        }
        break;
      case 'd':
	if (C->tot_buckets) {
	  return syntax ("'disabled' must appear before any server declaration in cluster");
	}
	cluster_disabled = 1;
	//	C->cluster_mode |= CLUSTER_MODE_DISABLED;
	break;
      case 0:
        return syntax ("unexpected end of file");
      default:
        return syntax ("'server' expected");
      }
      cfg_getlex ();
      Expect (';');
      cfg_getlex ();
    }
    if (cluster_disabled) {
      if (verbosity > 1) {
	fprintf (stderr, "Cluster #%d (%s) on port %d, mode %04x : DISABLED\n", C->cluster_no, C->cluster_name, C->port, C->cluster_mode);
      }
      MC->clusters_num--;
      continue;
    }
    if (!C->tot_buckets) {
      return syntax ("no servers in clusters");
    }
    if (!C->port) {
      C->port = port;
    }
    if (!(flags & 1) && !dup_port_checked) {
      for (i = 0; i < MC->clusters_num - 1; i++) {
	if (MC->Clusters[i].port == C->port) {
	  return syntax ("duplicate listen port");
	}
      }
    }
    if (!(flags & 1) && MC_Old) {
      for (i = 0; i < MC_Old->clusters_num; i++) {
	if (MC_Old->Clusters[i].port == C->port) {
	  MC_Old->Clusters[i].other_cluster_no = C->cluster_no;
	  C->other_cluster_no = i;
	  break;
	}
      }
    }
    if (C->points_num) {
      if ((C->cluster_mode & 255) != CLUSTER_MODE_MEMCACHED) {
        return syntax ("points can be defined for memcached mode clusters only");
      }
      if (flags & 1) {
	build_mc_points (C);
      }
    }
    if (verbosity > 1) {
      fprintf (stderr, "Cluster #%d (%s) on port %d, mode %04x, %d servers\n", C->cluster_no, C->cluster_name, C->port, C->cluster_mode, C->tot_buckets);
    }
    if (only_first_cluster && MC->clusters_num >= only_first_cluster) {
      break;
    }
  }
  if (!MC->ConfigServersCount || !MC->clusters_num) {
    return syntax ("no cluster defined");
  }

  return 0;
}