コード例 #1
0
ファイル: message_queue_test.c プロジェクト: Milstein/trema
static void
test_multiple_queueing() {
  message_queue *queue = create_message_queue();
  assert_true( queue != NULL );

  buffer *first_buf = alloc_buffer();
  assert_true( enqueue_message( queue, first_buf ) );
  assert_int_equal( queue->length, 1 );

  buffer *deq_buf = dequeue_message( queue );
  assert_true( deq_buf == first_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 0 );


  first_buf = alloc_buffer();
  assert_true( enqueue_message( queue, first_buf ) );
  assert_int_equal( queue->length, 1 );
  buffer *second_buf = alloc_buffer();
  assert_true( enqueue_message( queue, second_buf ) );
  assert_int_equal( queue->length, 2 );

  deq_buf = dequeue_message( queue );
  assert_true( deq_buf == first_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 1 );

  buffer *third_buf = alloc_buffer();
  assert_true( enqueue_message( queue, third_buf ) );
  assert_int_equal( queue->length, 2 );
  buffer *fourth_buf = alloc_buffer();
  assert_true( enqueue_message( queue, fourth_buf ) );
  assert_int_equal( queue->length, 3 );

  deq_buf = dequeue_message( queue );
  assert_true( deq_buf == second_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 2 );
  deq_buf = dequeue_message( queue );
  assert_true( deq_buf == third_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 1 );
  deq_buf = dequeue_message( queue );
  assert_true( deq_buf == fourth_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 0 );


  assert_true( delete_message_queue( queue ) );
}
コード例 #2
0
ファイル: message_queue_test.c プロジェクト: Milstein/trema
static void
test_foreach_message_queue() {
  message_queue *queue = create_message_queue();
  assert_true( queue != NULL );

  buffer *first_buf = alloc_buffer();
  append_string( first_buf, "first_buffer" );
  assert_true( enqueue_message( queue, first_buf ) );
  assert_int_equal( queue->length, 1 );
  buffer *second_buf = alloc_buffer();
  append_string( second_buf, "second_buffer" );
  assert_true( enqueue_message( queue, second_buf ) );
  assert_int_equal( queue->length, 2 );
  buffer *third_buf = alloc_buffer();
  append_string( third_buf, "third_buffer" );
  assert_true( enqueue_message( queue, third_buf ) );
  assert_int_equal( queue->length, 3 );

  buffer *deq_buf = dequeue_message( queue );
  assert_true( deq_buf == first_buf );

  char *user_data = xstrdup( "user_data" );
  count = 0;

  foreach_message_queue( queue, test_foreach_message_queue_helper, user_data );

  assert_int_equal( count, 2 );

  xfree( user_data );
  assert_true( delete_message_queue( queue ) );
}
コード例 #3
0
ファイル: secure_channel.c プロジェクト: TakumiKomada/trema
static void
flush_send_queue( int fd, void *user_data ) {
  UNUSED( fd );
  UNUSED( user_data );

  assert( send_queue != NULL );
  assert( connection.fd >= 0 );

  debug( "Flushing send queue ( length = %u ).", send_queue->length );

  set_writable( connection.fd, false );

  buffer *buf = NULL;
  while ( ( buf = peek_message( send_queue ) ) != NULL ) {
    ssize_t write_length = write( connection.fd, buf->data, buf->length );
    if ( write_length < 0 ) {
      if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
        set_writable( connection.fd, true );
        return;
      }
      error( "Failed to send a message to secure channel ( errno = %s [%d] ).",
             strerror( errno ), errno );
      return;
    }
    if ( ( size_t ) write_length < buf->length ) {
      remove_front_buffer( buf, ( size_t ) write_length );
      set_writable( connection.fd, true );
      return;
    }

    buf = dequeue_message( send_queue );
    free_buffer( buf );
  }
}
コード例 #4
0
ファイル: secure_channel_sender.c プロジェクト: n-tada/trema
int
flush_secure_channel( struct switch_info *sw_info ) {
  assert( sw_info != NULL );
  assert( sw_info->send_queue != NULL );
  assert( sw_info->secure_channel_fd >= 0 );

  buffer *buf;
  ssize_t write_length;

  while ( ( buf = peek_message( sw_info->send_queue ) ) != NULL ) {
    write_length = write( sw_info->secure_channel_fd, buf->data, buf->length );
    if ( write_length < 0 ) {
      if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
        return 0;
      }
      error( "Failed to send a message to secure channel ( errno = %s [%d] ).",
             strerror( errno ), errno );
      return -1;
    }
    if ( ( size_t ) write_length < buf->length ) {
      remove_front_buffer( buf, ( size_t ) write_length );
      return 0;
    }
    buf = dequeue_message( sw_info->send_queue );
    free_buffer( buf );
  }

  return 0;
}
コード例 #5
0
ファイル: message_queue_test.c プロジェクト: Milstein/trema
static void
test_enqueue_and_dequeue_message_queue() {
  message_queue *queue = create_message_queue();
  assert_true( queue != NULL );

  buffer *enq_buf = alloc_buffer();
  assert_true( enqueue_message( queue, enq_buf ) );
  assert_int_equal( queue->length, 1 );

  buffer *deq_buf = dequeue_message( queue );
  assert_true( deq_buf == enq_buf );
  free_buffer( deq_buf );
  assert_int_equal( queue->length, 0 );

  deq_buf = dequeue_message( queue );
  assert_true( deq_buf == NULL );
  assert_int_equal( queue->length, 0 );

  assert_true( delete_message_queue( queue ) );
}
コード例 #6
0
ファイル: secure_channel_sender.c プロジェクト: Darma/trema
int
flush_secure_channel( struct switch_info *sw_info ) {
  assert( sw_info != NULL );
  assert( sw_info->send_queue != NULL );
  assert( sw_info->secure_channel_fd >= 0 );

  buffer *buf;
  ssize_t write_length;

  if ( sw_info->send_queue->length == 0 ) {
    return 0;
  }
  set_writable( sw_info->secure_channel_fd, false );
  writev_args args;
  args.iov = xmalloc( sizeof( struct iovec ) * ( size_t ) sw_info->send_queue->length );
  args.iovcnt = 0;
  foreach_message_queue( sw_info->send_queue, append_to_writev_args, &args );
  if ( args.iovcnt == 0 ) {
    xfree( args.iov );
    return 0;
  }
  write_length = writev( sw_info->secure_channel_fd, args.iov, args.iovcnt );
  xfree( args.iov );
  if ( write_length < 0 ) {
    if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
      set_writable( sw_info->secure_channel_fd, true );
      return 0;
    }
    error( "Failed to send a message to secure channel ( errno = %s [%d] ).",
           strerror( errno ), errno );
    return -1;
  }
  if ( write_length == 0 ) {
    return 0;
  }
  while ( ( buf = peek_message( sw_info->send_queue ) ) != NULL ) {
    if ( write_length == 0 ) {
      set_writable( sw_info->secure_channel_fd, true );
      return 0;
    }
    if ( ( size_t ) write_length < buf->length ) {
      remove_front_buffer( buf, ( size_t ) write_length );
      set_writable( sw_info->secure_channel_fd, true );
      return 0;
    }
    write_length -= ( ssize_t ) buf->length;
    buf = dequeue_message( sw_info->send_queue );
    free_buffer( buf );
  }

  return 0;
}
コード例 #7
0
ファイル: away.c プロジェクト: catalinmiron/misc
gint dequeue_cb(GtkWidget *treeview, GdkEventButton *event, gpointer data) {
	GtkTreeIter iter;
	GtkTreeSelection *select;

	if(!(event->type == GDK_2BUTTON_PRESS && event->button == 1))
		return FALSE; /* Double clicking on the list will dequeue that user's messages. */

	select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
	if(gtk_tree_selection_get_selected(select, NULL, &iter))
			dequeue_message(&iter);

	return FALSE;
}
コード例 #8
0
ファイル: secure_channel.c プロジェクト: TakumiKomada/trema
static bool
recv_message_from_secure_channel() {
  assert( recv_queue != NULL );

  if ( recv_queue->length == 0 ) {
    return false;
  }

  buffer *message = dequeue_message( recv_queue );
  handle_secure_channel_message( message ); // FIXME: handle error properly
  free_buffer( message );

  return true;
}
コード例 #9
0
void status_draw(game_t *p_game)
{
  int32_t diamonds = p_game->p_cur_level->diamonds_required - p_game->player.diamonds;
  int32_t time_left = p_game->p_cur_level->time - ((vGetTickCount() - p_game->start_ticks) / 1000);
  int16_t x_start;
  int16_t y_start;
  int i;

  if (diamonds < 0)
    diamonds = 0;
  if (time_left < 0)
    time_left = 0;

  y_start = PLAYFIELD_HEIGHT;
  x_start = -6;

  /* FIXME! */
  vSetForeColor(vRGB(0,128,0));
  vFillRect(x_start, y_start+1, screen_w, screen_h);

  vSetForeColor(vRGB(0,255,0));
  vFillRect(x_start, y_start, screen_w, y_start);

  /* Print the number of diamonds and bombs */
  print_status_entry_with_symbol(p_game, 2, x_start + 8, y_start + 1,
		     p_game->pp_sprite_frames[FRAMES_DIAMOND], diamonds);
  print_status_entry_with_symbol(p_game, 2, x_start + 8, y_start + 9,
		     p_game->pp_sprite_frames[FRAMES_BOMB], p_game->player.bombs);

  for (i=0; i<METAL_MAX; i++)
    {
      if (p_game->player.keys[i])
	vDrawObject(x_start + 64 + i*9, y_start + 1, p_game->pp_sprite_frames[FRAMES_IRON_KEY + i]);
    }
  print_status_entry(p_game, 3, PLAYFIELD_WIDTH-16, y_start + 2, time_left);

  /* Display the queued messages */
  if (queue.msgs[queue.front].p_str)
    {
      if (--queue.msgs[queue.front].countdown > 0)
	game_draw_message(p_game, queue.msgs[queue.front].p_str);
      else
	dequeue_message(p_game, &queue);
    }
}
コード例 #10
0
static void
gdm_smartcard_extension_queue_message (GdmLoginExtension   *login_extension,
                                       GdmServiceMessageType  type,
                                       const char            *text)
{
        GdmSmartcardExtension *extension = GDM_SMARTCARD_EXTENSION (login_extension);

        QueuedMessage *message = g_slice_new (QueuedMessage);

        message->text = g_strdup (text);
        message->type = type;

        g_queue_push_tail (extension->priv->message_queue, message);

        if (extension->priv->message_timeout_id == 0) {
                dequeue_message (extension);
        }
}
コード例 #11
0
static void
gdm_fingerprint_extension_queue_message (GdmLoginExtension *login_extension,
                                         GdmServiceMessageType type,
                                         const char      *text)
{
        GdmFingerprintExtension *extension = GDM_FINGERPRINT_EXTENSION (login_extension);

        QueuedMessage *message = g_slice_new (QueuedMessage);

        message->text = g_strdup (text);
        message->type = type;

        g_queue_push_tail (extension->priv->message_queue, message);

        if (extension->priv->message_timeout_id == 0) {
                dequeue_message (extension);
        }
}
コード例 #12
0
ファイル: demultiplex.c プロジェクト: ryanolson/Spindle
static int check_for_msg(void *session, int id, void *buf, size_t size, size_t *bytes_read)
{
   unsigned char *recv_buf = ((unsigned char *) buf) + *bytes_read;
   size_t recv_buf_size = size - *bytes_read;
   int result;

   result = dequeue_message(id, recv_buf, recv_buf_size, session);
   if (result == -1) {
      set_last_error("Error in dequeue message");
      return -1;
   }
   else if (result == 0) {
      return 0;
   }
   else {
      *bytes_read += result;
      return result;
   }
}
コード例 #13
0
int
handle_messages_from_secure_channel( struct switch_info *sw_info ) {
    assert( sw_info != NULL );
    assert( sw_info->recv_queue != NULL );

    int ret;
    int errors = 0;
    buffer *message;

    while ( ( message = dequeue_message( sw_info->recv_queue ) ) != NULL ) {
        ret = ofpmsg_recv( sw_info, message );
        if ( ret < 0 ) {
            error( "Failed to handle message to application." );
            errors++;
        }
    }

    return errors == 0 ? 0 : -1;
}
コード例 #14
0
uint_t
receive_message(MBFCB *p_mbfcb, void *msg, bool_t *p_dspreq)
{
	TCB		*p_tcb;
	uint_t	msgsz;

	if (p_mbfcb->smbfcnt > 0) {
		msgsz = dequeue_message(p_mbfcb, msg);
		*p_dspreq = messagebuf_signal(p_mbfcb);
		return(msgsz);
	}
	else if (!queue_empty(&(p_mbfcb->swait_queue))) {
		p_tcb = (TCB *) queue_delete_next(&(p_mbfcb->swait_queue));
		msgsz = ((WINFO_MBF *)(p_tcb->p_winfo))->msgsz;
		memcpy(msg, ((WINFO_MBF *)(p_tcb->p_winfo))->msg, msgsz);
		*p_dspreq = wait_complete(p_tcb);
		return(msgsz);
	}
	else {
		return(0U);
	}
}
コード例 #15
0
static int
flush_secure_channel_tls( struct switch_info *sw_info ) {
  assert( sw_info != NULL );
  assert( sw_info->tls );
  assert( sw_info->ssl != NULL );
  assert( sw_info->send_queue->length > 0 );

  buffer *buf = NULL;
  while ( ( buf = peek_message( sw_info->send_queue ) ) != NULL ) {
    int write_length = SSL_write( sw_info->ssl, buf->data, ( int ) buf->length );
    if ( write_length < 0 ) {
      int error_no = SSL_get_error( sw_info->ssl, write_length );
      switch ( error_no ) {
        case SSL_ERROR_WANT_READ:
          set_readable( sw_info->secure_channel_fd, true );
        case SSL_ERROR_WANT_WRITE:
          set_writable( sw_info->secure_channel_fd, true );
          return 0;

        default:
          error( "Failed to send a message to secure channel ( error = %d ).", error_no );
          return -1;
      }
    }
    if ( write_length == 0 ) {
      set_writable( sw_info->secure_channel_fd, true );
      return 0;
    }
    if ( ( size_t ) write_length < buf->length ) {
      remove_front_buffer( buf, ( size_t ) write_length );
      set_writable( sw_info->secure_channel_fd, true );
      return 0;
    }
    buf = dequeue_message( sw_info->send_queue );
    free_buffer( buf );
  }

  return 0;
}
コード例 #16
0
ファイル: message_queue_test.c プロジェクト: Milstein/trema
static void
test_dequeue_message_if_queue_is_not_created() {
  message_queue *queue = NULL;
  expect_assert_failure( dequeue_message( queue ) );
}
コード例 #17
0
int
main(int argc, char **argv)
{
/*****************test 1********************************/
	message_queue *tmp_queue;
	if((tmp_queue = create_message_queue()) == NULL)
	{
		printf("create queue error!\n");
    	return -1;
    }

    int i = 1;
    buffer *tmp_buf;
    char *tmp_char;

	tmp_char = *sample_string;
    while( tmp_char != NULL )
    {
       	tmp_buf = alloc_buffer_with_length(10);
        strcpy(tmp_buf->data, tmp_char);
        printf("the insert is %s, and %d\n",(char*)tmp_buf->data,sizeof(*(tmp_buf->data)));
        enqueue_message(tmp_queue, tmp_buf);
		tmp_char = sample_string[i];
        if(tmp_char == NULL)
            break;
        i++;
    }  

    int len;
    buffer *out;
    for( len = tmp_queue->length; len > 0; len-- )
    {
    	out = dequeue_message(tmp_queue);
        if(out->data == NULL)
            break;
        printf("%s\n", out->data);
        free_buffer(out);
  	}

    delete_message_queue(tmp_queue);
/*****************test 2********************************/

	message_queue *tmp_queue_;
   	if((tmp_queue_ = create_message_queue()) == NULL)
	{
		printf("create queue error!\n");
    	return -1;
    }
    int j = 1;
    buffer *tmp_buf_;
    char *tmp_char_;    
    
	tmp_char_ = *sample_string;
    while( tmp_char_ != NULL )
    {
       	tmp_buf_ = alloc_buffer_with_length(10);
        strcpy(tmp_buf_->data, tmp_char_);
        printf("the insert is %s, and %d\n",(char*)tmp_buf_->data,sizeof(*(tmp_buf_->data)));
        enqueue_message(tmp_queue_, tmp_buf_);
		tmp_char_ = sample_string[j];
        if(tmp_char_ == NULL)
            break;
        j++;
    }  

    delete_message_queue(tmp_queue_);
/*****************end of test********************************/


    return 0;
}