void meta_server_failure_detector::on_ping(const fd::beacon_msg& beacon, ::dsn::service::rpc_replier<fd::beacon_ack>& reply)
{
    fd::beacon_ack ack;
    ack.this_node = beacon.to;
    if (!is_primary())
    {
        end_point master;
        if (_state->get_meta_server_primary(master))
        {
            ack.time = beacon.time;
            ack.is_master = false;
            ack.primary_node = master;
        }
        else
        {
            ack.time = beacon.time;
            ack.is_master = false;
            ack.primary_node =  end_point::INVALID;
        }
    }
    else
    {
        failure_detector::on_ping_internal(beacon, ack);
        ack.primary_node = primary_address();
    }

    reply(ack);
}
//send final abort messages to other servers
void send_final_abort_messages(state_type *state, event_content_type * event_content, time_type now) {
    int s;
    // Get the server configuration from simulation state
    SERVER_lp_state_type *pointer = &state->type.server_state;
    transaction_metadata *transaction = get_transaction_metadata(event_content->applicative_content.tx_id, pointer);
    if (transaction == NULL) {
        printf("ERROR: no transaction found with id %d (from client id %d)\n", event_content->applicative_content.tx_id, event_content->applicative_content.client_id);
        exit(-1);
    }
    for (s = state->num_clients; s < state->num_clients + state->num_servers; s++) {
        // send a message to other servers containing at least an entry of the transaction write set
        int an_entry_founded = 0;
        data_set_entry *entry = transaction->write_set;
        while (entry != NULL && !an_entry_founded) {
            if (pointer->configuration.concurrency_control_type == PRIMARY_OWNER_CTL_2PL) {
                if (is_primary(entry->object_key_id, s, state->num_servers, state->num_clients))
                    an_entry_founded = 1;
            } else {
                if (is_owner(entry->object_key_id, s, state->num_servers, state->num_clients, state->object_replication_degree))
                    an_entry_founded = 1;
            }
            entry = entry->next;
        }
        if (s != event_content->applicative_content.server_id && an_entry_founded) {
            event_content->applicative_content.op_type = TX_REMOTE_ABORT;
            event_content->destination_object_id = s;
            event_content->applicative_content.write_set = transaction->write_set;
            transaction->expected_prepare_response_counter++;
            server_send_message(state, event_content, now);
            if (pointer->configuration.server_verbose)
                printf("S%d - function Server_ProcessEvent: TX_REMOTE_ABORT sent at time %f to server %i\n", event_content->applicative_content.server_id, now, s);
        }
    }
}
//send prepare messages to other servers
void send_final_commit_messages(state_type *state, event_content_type * event_content, time_type now) {
    int s;
    // Get the server configuration from simulation state
    SERVER_lp_state_type *pointer = &state->type.server_state;
    transaction_metadata *transaction = get_transaction_metadata(event_content->applicative_content.tx_id, pointer);
    if (transaction == NULL) {
        printf("ERROR: no transaction fouded with id %d (from cliendt %d)\n", event_content->applicative_content.tx_id, event_content->applicative_content.client_id);
        exit(-1);
    }
    for (s = state->num_clients; s < state->num_clients + state->num_servers; s++) {
        int a_server_founded = 0;
        data_set_entry *entry = transaction->write_set;
        while (entry != NULL && !a_server_founded) {
            if (pointer->configuration.concurrency_control_type == PRIMARY_OWNER_CTL_2PL) {
                if (is_primary(entry->object_key_id, s, state->num_servers, state->num_clients))
                    a_server_founded = 1;
            } else {
                if (is_owner(entry->object_key_id, s, state->num_servers, state->num_clients, state->object_replication_degree))
                    a_server_founded = 1;
            }
            entry = entry->next;
        }
        if (s != event_content->applicative_content.server_id && a_server_founded) {
            event_content_type new_event_content;
            memcpy(&new_event_content, event_content, sizeof(event_content_type));
            new_event_content.applicative_content.op_type = TX_DISTRIBUTED_FINAL_COMMIT;
            new_event_content.destination_object_id = s;
            new_event_content.applicative_content.write_set = transaction->write_set;
            transaction->expected_prepare_response_counter++;
            server_send_final_commit_message(state, &new_event_content, now);
            if (pointer->configuration.server_verbose)
                printf("S%d - function Server_ProcessEvent: TX_DISTRIBUTED_FINAL_COMMIT sent at time %f to server %i\n", event_content->applicative_content.server_id, now, s);
        }
    }
}
Exemple #4
0
int print_hash_chain(FILE *list,struct fcb *f, int ix)
{int next,cnt=0;

  next = f->buffer_pool.buf_hash_table[ix];
  while ( next>=0 ) {
    if ( is_primary(f,next) ) fprintf(list,"**");
    fprintf(list," %d(",next);
    print_leveln_pntr(list,"",&(f->buffer_pool.buffer[next].contents));
    fprintf(list,")(%d)",f->buffer_pool.buffer[next].b.level);
    if ( is_primary(f,next) ) fprintf(list,"**");
    cnt++;
    next = f->buffer_pool.buffer[next].hash_next;
  }
  fprintf(list,"\n");
  return(cnt); 
}
void meta_server_failure_detector::on_worker_disconnected(const std::vector< ::dsn::rpc_address>& nodes)
{
    if (!is_primary())
    {
        return;
    }

    if (!_svc->_started)
    {
        return;
    }

    node_states states;
    for (auto& n : nodes)
    {
        states.push_back(std::make_pair(n, false));

        dwarn("client expired: %s", n.to_string());
    }
    
    machine_fail_updates pris;
    _state->set_node_state(states, &pris);
    
    for (auto& pri : pris)
    {
        dinfo("%d.%d primary node for %s is gone, update configuration on meta server", 
            pri.first.app_id,
            pri.first.pidx,
            pri.second->node.to_string()
            );
        _svc->update_configuration_on_machine_failure(pri.second);
    }
}
static void remove_tx_locks(int tx_id, data_set_entry *data_set, state_type *state, double now) {

	SERVER_lp_state_type *pointer = &state->type.server_state;
	data_set_entry *entry = data_set;
	while (entry != NULL) {
		int need_to_unlock = 0;
		if (pointer->configuration.concurrency_control_type == ETL_2PL || pointer->configuration.concurrency_control_type == CTL_2PL)
			need_to_unlock = is_owner(entry->object_key_id, pointer->server_id, state->num_servers, state->num_clients, state->object_replication_degree);
		else if (pointer->configuration.concurrency_control_type == PRIMARY_OWNER_CTL_2PL)
			need_to_unlock = is_primary(entry->object_key_id, pointer->server_id, state->num_servers, state->num_clients);
		if (need_to_unlock) {
			if ((pointer->cc_metadata->locks[entry->object_key_id] != tx_id)) {
				if (pointer->configuration.cc_verbose)
					printf("cc%d - lock sull'oggetto %i della tx %d non trovato\n", pointer->server_id, entry->object_key_id, tx_id);
			} else {
				pointer->cc_metadata->locks[entry->object_key_id] = -1;
				if (pointer->configuration.cc_verbose)
					printf("cc%d - oggetto %d per la transizione %i unlockato al tempo %f \n", pointer->server_id, entry->object_key_id, tx_id, now);
				//Wake up waiting event for key 'object_key_id';
				reschedule_event(state, now, entry->object_key_id);
			}
		}
		entry = entry->next;
	}
}
void meta_server_failure_detector::on_worker_disconnected(const std::vector<end_point>& nodes)
{
    if (!is_primary())
    {
        return;
    }

    node_states states;
    for (auto& n : nodes)
    {
        states.push_back(std::make_pair(n, false));

        dwarn("client expired: %s:%hu", n.name.c_str(), n.port);
    }
    
    machine_fail_updates pris;
    _state->set_node_state(states, &pris);
    
    for (auto& pri : pris)
    {
        dinfo("%d.%d primary node for %s:%hu is gone, update configuration on meta server", 
            pri.first.app_id,
            pri.first.pidx,
            pri.second->node.name.c_str(),
            pri.second->node.port
            );
        _svc->update_configuration(pri.second);
    }
}
Exemple #8
0
ADDRESS_MAP_END

WRITE_LINE_MEMBER(isa16_ide_device::ide_interrupt)
{
	if (is_primary())
	{
		m_isa->irq14_w(state);
	}
	else
	{
		m_isa->irq15_w(state);
	}
}
void meta_server_failure_detector::on_worker_connected(const end_point& node)
{
    if (!is_primary())
    {
        return;
    }

    node_states states;
    states.push_back(std::make_pair(node, true));

    dwarn("Client reconnected",
        "Client %s:%hu", node.name.c_str(), node.port);

    _state->set_node_state(states, nullptr);
}
void meta_server_failure_detector::on_worker_connected(::dsn::rpc_address node)
{
    if (!is_primary())
    {
        return;
    }

    node_states states;
    states.push_back(std::make_pair(node, true));

    dwarn("Client reconnected",
        "Client %s", node.to_string());

    _state->set_node_state(states, nullptr);
}
Exemple #11
0
void print_buffer_caption(FILE *list, struct fcb *f, int ix)
{int index_type,level;

  index_type = f->buffer_pool.buffer[ix].b.index_type;
  level = f->buffer_pool.buffer[ix].b.level;
  fprintf(list,"%4d(%2d/" UINT64_formatf(-6),
    ix,f->buffer_pool.buffer[ix].contents.segment,f->buffer_pool.buffer[ix].contents.block);
  if (index_type==user_ix) {
    if ( is_primary(f,ix) ) fprintf(list,"X%2d",level);
    else fprintf(list,"x%2d",level);
  }
  else if (index_type==free_lc_ix) {
    if ( is_primary(f,ix) ) fprintf(list,"L%2d",level);
    else fprintf(list,"l%2d",level);
  }
  else if (index_type==free_rec_ix) {
    if ( is_primary(f,ix) ) fprintf(list,"R%2d",level);
    else fprintf(list,"r%2d",level);
  }
  if ( f->buffer_pool.buffer[ix].modified ) fprintf(list,"*");
  else fprintf(list," ");
  if ( f->buffer_pool.buffer[ix].lock_cnt>0 ) fprintf(list,"!)");
  else fprintf(list," )");
}
void meta_server_failure_detector::on_ping(const fd::beacon_msg& beacon, ::dsn::rpc_replier<fd::beacon_ack>& reply)
{
    fd::beacon_ack ack;
    ack.this_node = beacon.to;
    if (!is_primary())
    {
        ack.time = beacon.time;
        ack.is_master = false;
        ack.primary_node = _primary_address;
    }
    else
    {
        failure_detector::on_ping_internal(beacon, ack);
        ack.primary_node = primary_address();
    }

    reply(ack);
}
Exemple #13
0
MailBox::MailBox(MailDatabase* maildb, string name): name(name), maildb(maildb)
{
	inbox = is_inbox(name);
	primary = is_primary(name);
	
	if (inbox) {
		path = maildb->get_maildir();
	}
	
	else {
		path = "." + name; 
			
		// Generate directorypath
		size_t index = 0;	
		while((index = path.find("/", index)) != string::npos)
			path.replace(index, 1, ".");
	
		path = maildb->get_maildir() + path + "/";
	}
}
void meta_server_failure_detector::on_ping(const fd::beacon_msg& beacon, ::dsn::rpc_replier<fd::beacon_ack>& reply)
{
    fd::beacon_ack ack;
    ack.time = beacon.time;
    ack.this_node = beacon.to;
    ack.allowed = true;

    if ( !is_primary() )
    {
        ack.is_master = false;
        ack.primary_node = get_primary();
    }
    else 
    {
        ack.is_master = true;
        ack.primary_node = beacon.to;
        failure_detector::on_ping_internal(beacon, ack);
    }

    dinfo("on_ping, is_master(%s), this_node(%s), primary_node(%s)", ack.is_master?"true":"false",
          ack.this_node.to_string(), ack.primary_node.to_string());
    reply(ack);
}
//send prepare messages to other servers
int send_prepare_messages(state_type *state, transaction_metadata *transaction, event_content_type * event_content, time_type now) {
    int s;
    int involved_servers=0;
    // Get the server configuration from simulation state
    SERVER_lp_state_type *pointer = &state->type.server_state;
    for (s = state->num_clients; s < state->num_clients + state->num_servers; s++) {
        int has_an_object = 0;
        data_set_entry *entry = transaction->write_set;
        while (entry != NULL && !has_an_object) {
            if (pointer->configuration.concurrency_control_type == PRIMARY_OWNER_CTL_2PL) {
                if (is_primary(entry->object_key_id, s, state->num_servers, state->num_clients)) {
                    has_an_object = 1;
                    break;
                }
            } else {
                if (is_owner(entry->object_key_id, s, state->num_servers, state->num_clients, state->object_replication_degree)) {
                    has_an_object = 1;
                    break;
                }
            }
            entry = entry->next;
        }
        if (s != event_content->applicative_content.server_id && has_an_object) {
            event_content_type new_event_content;
            memcpy(&new_event_content, event_content, sizeof(event_content_type));
            new_event_content.applicative_content.op_type = TX_PREPARE;
            new_event_content.destination_object_id = s;
            new_event_content.applicative_content.write_set = transaction->write_set;
            transaction->expected_prepare_response_counter++;
            server_send_prepare_message(state, &new_event_content, now);
            involved_servers++;
            if (pointer->configuration.server_verbose)
                printf("S%d - function Server_ProcessEvent: TX_PREPARE sent at time %f to server %i\n", event_content->applicative_content.server_id, now, s);
        }
    }
    return involved_servers;
}
Exemple #16
0
static gboolean
accelerator_parse (const gchar         *accelerator,
                   MetaKeyCombo        *combo)
{
    guint keyval, keycode;
    MetaVirtualModifier mods;
    gint len;

    combo->keysym = 0;
    combo->keycode = 0;
    combo->modifiers = 0;

    if (accelerator == NULL)
        return FALSE;

    keyval = 0;
    keycode = 0;
    mods = 0;
    len = strlen (accelerator);
    while (len)
    {
        if (*accelerator == '<')
        {
            if (len >= 9 && is_primary (accelerator))
            {
                /* Primary is treated the same as Control */
                accelerator += 9;
                len -= 9;
                mods |= META_VIRTUAL_CONTROL_MASK;
            }
            else if (len >= 9 && is_control (accelerator))
            {
                accelerator += 9;
                len -= 9;
                mods |= META_VIRTUAL_CONTROL_MASK;
            }
            else if (len >= 7 && is_shift (accelerator))
            {
                accelerator += 7;
                len -= 7;
                mods |= META_VIRTUAL_SHIFT_MASK;
            }
            else if (len >= 6 && is_shft (accelerator))
            {
                accelerator += 6;
                len -= 6;
                mods |= META_VIRTUAL_SHIFT_MASK;
            }
            else if (len >= 6 && is_ctrl (accelerator))
            {
                accelerator += 6;
                len -= 6;
                mods |= META_VIRTUAL_CONTROL_MASK;
            }
            else if (len >= 6 && is_modx (accelerator))
            {
                static const guint mod_vals[] = {
                    META_VIRTUAL_ALT_MASK,
                    META_VIRTUAL_MOD2_MASK,
                    META_VIRTUAL_MOD3_MASK,
                    META_VIRTUAL_MOD4_MASK,
                    META_VIRTUAL_MOD5_MASK,
                };

                len -= 6;
                accelerator += 4;
                mods |= mod_vals[*accelerator - '1'];
                accelerator += 2;
            }
            else if (len >= 5 && is_ctl (accelerator))
            {
                accelerator += 5;
                len -= 5;
                mods |= META_VIRTUAL_CONTROL_MASK;
            }
            else if (len >= 5 && is_alt (accelerator))
            {
                accelerator += 5;
                len -= 5;
                mods |= META_VIRTUAL_ALT_MASK;
            }
            else if (len >= 6 && is_meta (accelerator))
            {
                accelerator += 6;
                len -= 6;
                mods |= META_VIRTUAL_META_MASK;
            }
            else if (len >= 7 && is_hyper (accelerator))
            {
                accelerator += 7;
                len -= 7;
                mods |= META_VIRTUAL_HYPER_MASK;
            }
            else if (len >= 7 && is_super (accelerator))
            {
                accelerator += 7;
                len -= 7;
                mods |= META_VIRTUAL_SUPER_MASK;
            }
            else
            {
                gchar last_ch;

                last_ch = *accelerator;
                while (last_ch && last_ch != '>')
                {
                    last_ch = *accelerator;
                    accelerator += 1;
                    len -= 1;
                }
            }
        }
        else
        {
            if (len >= 4 && is_keycode (accelerator))
            {
                keycode = strtoul (accelerator, NULL, 16);
                goto out;
            }
            else if (strcmp (accelerator, "Above_Tab") == 0)
            {
                keyval = META_KEY_ABOVE_TAB;
                goto out;
            }
            else
            {
                keyval = xkb_keysym_from_name (accelerator, XKB_KEYSYM_CASE_INSENSITIVE);
                if (keyval == XKB_KEY_NoSymbol)
                {
                    char *with_xf86 = g_strconcat ("XF86", accelerator, NULL);
                    keyval = xkb_keysym_from_name (with_xf86, XKB_KEYSYM_CASE_INSENSITIVE);
                    g_free (with_xf86);

                    if (keyval == XKB_KEY_NoSymbol)
                        return FALSE;
                }
            }

            accelerator += len;
            len -= len;
        }
    }

out:
    combo->keysym = keyval;
    combo->keycode = keycode;
    combo->modifiers = mods;
    return TRUE;
}
Exemple #17
0
/**
 * egg_accelerator_parse_virtual:
 * @accelerator:      string representing an accelerator
 * @accelerator_key:  return location for accelerator keyval
 * @accelerator_mods: return location for accelerator modifier mask
 *
 * Parses a string representing a virtual accelerator. The format
 * looks like "&lt;Control&gt;a" or "&lt;Shift&gt;&lt;Alt&gt;F1" or
 * "&lt;Release&gt;z" (the last one is for key release).  The parser
 * is fairly liberal and allows lower or upper case, and also
 * abbreviations such as "&lt;Ctl&gt;" and "&lt;Ctrl&gt;".
 *
 * If the parse fails, @accelerator_key and @accelerator_mods will
 * be set to 0 (zero) and %FALSE will be returned. If the string contains
 * only modifiers, @accelerator_key will be set to 0 but %TRUE will be
 * returned.
 *
 * The virtual vs. concrete accelerator distinction is a relic of
 * how the X Window System works; there are modifiers Mod2-Mod5 that
 * can represent various keyboard keys (numlock, meta, hyper, etc.),
 * the virtual modifier represents the keyboard key, the concrete
 * modifier the actual Mod2-Mod5 bits in the key press event.
 * 
 * Returns: %TRUE on success.
 */
gboolean
egg_accelerator_parse_virtual (const gchar            *accelerator,
                               guint                  *accelerator_key,
                               EggVirtualModifierType *accelerator_mods)
{
  guint keyval;
  GdkModifierType mods;
  gint len;
  gboolean bad_keyval;
  
  if (accelerator_key)
    *accelerator_key = 0;
  if (accelerator_mods)
    *accelerator_mods = 0;

  g_return_val_if_fail (accelerator != NULL, FALSE);

  bad_keyval = FALSE;
  
  keyval = 0;
  mods = 0;
  len = strlen (accelerator);
  while (len)
    {
      if (*accelerator == '<')
	{
	  if (len >= 9 && is_release (accelerator))
	    {
	      accelerator += 9;
	      len -= 9;
	      mods |= EGG_VIRTUAL_RELEASE_MASK;
	    }
	  else if (len >= 9 && is_control (accelerator))
	    {
	      accelerator += 9;
	      len -= 9;
	      mods |= EGG_VIRTUAL_CONTROL_MASK;
	    }
	  else if (len >= 7 && is_shift (accelerator))
	    {
	      accelerator += 7;
	      len -= 7;
	      mods |= EGG_VIRTUAL_SHIFT_MASK;
	    }
	  else if (len >= 6 && is_shft (accelerator))
	    {
	      accelerator += 6;
	      len -= 6;
	      mods |= EGG_VIRTUAL_SHIFT_MASK;
	    }
	  else if (len >= 6 && is_ctrl (accelerator))
	    {
	      accelerator += 6;
	      len -= 6;
	      mods |= EGG_VIRTUAL_CONTROL_MASK;
	    }
	  else if (len >= 6 && is_modx (accelerator))
	    {
	      static const guint mod_vals[] = {
		EGG_VIRTUAL_ALT_MASK, EGG_VIRTUAL_MOD2_MASK, EGG_VIRTUAL_MOD3_MASK,
		EGG_VIRTUAL_MOD4_MASK, EGG_VIRTUAL_MOD5_MASK
	      };

	      len -= 6;
	      accelerator += 4;
	      mods |= mod_vals[*accelerator - '1'];
	      accelerator += 2;
	    }
	  else if (len >= 5 && is_ctl (accelerator))
	    {
	      accelerator += 5;
	      len -= 5;
	      mods |= EGG_VIRTUAL_CONTROL_MASK;
	    }
	  else if (len >= 5 && is_alt (accelerator))
	    {
	      accelerator += 5;
	      len -= 5;
	      mods |= EGG_VIRTUAL_ALT_MASK;
	    }
          else if (len >= 6 && is_meta (accelerator))
	    {
	      accelerator += 6;
	      len -= 6;
	      mods |= EGG_VIRTUAL_META_MASK;
	    }
          else if (len >= 7 && is_hyper (accelerator))
	    {
	      accelerator += 7;
	      len -= 7;
	      mods |= EGG_VIRTUAL_HYPER_MASK;
	    }
          else if (len >= 7 && is_super (accelerator))
	    {
	      accelerator += 7;
	      len -= 7;
	      mods |= EGG_VIRTUAL_SUPER_MASK;
	    }
          else if (len >= 9 && is_primary (accelerator))
        {
          accelerator += 9;
          len -= 9;
          mods |= EGG_VIRTUAL_CONTROL_MASK;
        }
	      else
	    {
	      gchar last_ch;
	      
	      last_ch = *accelerator;
	      while (last_ch && last_ch != '>')
            {
		      last_ch = *accelerator;
		      accelerator += 1;
		      len -= 1;
		    }
	    }
	}
      else
	{
          keyval = gdk_keyval_from_name (accelerator);
          
          if (keyval == 0)
            bad_keyval = TRUE;
          
          accelerator += len;
          len -= len;              
	}
    }
  
  if (accelerator_key)
    *accelerator_key = gdk_keyval_to_lower (keyval);
  if (accelerator_mods)
    *accelerator_mods = mods;

  return !bad_keyval;
}
int acquire_local_locks(state_type *state, data_set_entry *data_set, time_type timeout, int timeout_event_type, event_content_type *event_content, double now) {
	SERVER_lp_state_type *pointer = &state->type.server_state;
	data_set_entry *entry = data_set;
	if (entry == NULL) {
		if (pointer->configuration.cc_verbose)
			printf("cc%d -  write set of transaction %d is empty\n", pointer->server_id, event_content->applicative_content.tx_id);
		return 1;
	}
	while (entry != NULL) {
		int need_to_lock = 0;
		if (pointer->configuration.concurrency_control_type == ETL_2PL || pointer->configuration.concurrency_control_type == CTL_2PL)
			need_to_lock = is_owner(entry->object_key_id, pointer->server_id, state->num_servers, state->num_clients, state->object_replication_degree);
		else if (pointer->configuration.concurrency_control_type == PRIMARY_OWNER_CTL_2PL)
			need_to_lock = is_primary(entry->object_key_id, pointer->server_id, state->num_servers, state->num_clients);
		if (need_to_lock) {
			if (pointer->configuration.cc_verbose)
				printf("cc%d - object %d for transaction %i to be locked\n", pointer->server_id, entry->object_key_id, event_content->applicative_content.tx_id);
			//check lock...
			if (pointer->cc_metadata->locks[entry->object_key_id] == -1) {
				//not locked
				pointer->cc_metadata->lock_retry_num = 0;
				//acquire lock
				pointer->cc_metadata->locks[entry->object_key_id] = event_content->applicative_content.tx_id;
				if (pointer->configuration.cc_verbose)
					printf("cc%d - pbject %d  for transaction  %i locked at time %f \n", pointer->server_id, entry->object_key_id, event_content->applicative_content.tx_id, now);
			} else if (pointer->cc_metadata->locks[entry->object_key_id] == event_content->applicative_content.tx_id) {
				// already locked by me
				// go to the next entry
			} else {
				//already locked by another transaction
				pointer->cc_metadata->lock_retry_num++;
				//check deadlock (if enabled)
				if (pointer->configuration.deadlock_detection_enabled && check_deadlock(event_content, pointer)) {
					return -1;
				}
				//add the timeout event
				event_content_type new_event_content;
				memcpy(&new_event_content, event_content, sizeof(event_content_type));
				ScheduleNewEvent(pointer->server_id, now + timeout, timeout_event_type, &new_event_content, sizeof(event_content_type));

				//enqueue transaction
				memcpy(&new_event_content, event_content, sizeof(event_content_type));
				new_event_content.applicative_content.object_key_id = entry->object_key_id;
				enqueue_event(pointer, &new_event_content);

				transaction_metadata *transaction = get_transaction_metadata(event_content->applicative_content.tx_id, pointer);
				if (transaction == NULL) {
					if (pointer->configuration.cc_verbose) {
						printf("cc%d - transaction %i is not local\n", pointer->server_id, event_content->applicative_content.tx_id);
						printf("cc%d - prepare of tx %i added in the waiting event queue %f due to a lock on object %d tx:%i\n", pointer->server_id, event_content->applicative_content.tx_id, now,
								entry->object_key_id, new_event_content.applicative_content.tx_id);
					}
					return 0;
				} else {
					transaction->is_blocked = 1;
					if (pointer->configuration.cc_verbose)
						printf("cc%d - transaction %i is waiting at time %f due to a lock on object%d tx:%i\n", pointer->server_id, event_content->applicative_content.tx_id, now, entry->object_key_id,
								new_event_content.applicative_content.tx_id);
					return 0;
				}
			}
		}
		entry = entry->next;
	}
	return 1;
}
 // Returns true if the edge is linear (segment, ray, line).
 // Returns false if the edge is curved (parabolic arc).
 bool is_linear() const {
   if (!is_primary())
     return true;
   return !(cell()->contains_segment() ^ twin()->cell()->contains_segment());
 }
 // Returns true if the edge is curved (parabolic arc).
 // Returns false if the edge is linear (segment, ray, line).
 bool is_curved() const {
   if (!is_primary())
     return false;
   return (cell()->contains_segment() ^ twin()->cell()->contains_segment());
 }
Exemple #21
0
 // The edge is labelled "secondary" if it is not adjacent
 // to a primary face. This means "polyline" edges are
 // also considered secondary.
 bool is_secondary() const { return !is_primary(); }