Exemple #1
0
static void read_cb(void *user_data, int success) {
  struct read_socket_state *state = (struct read_socket_state *)user_data;
  ssize_t read_bytes;
  int current_data;

  GPR_ASSERT(success);

  gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
  current_data = state->read_bytes % 256;
  read_bytes = count_slices(state->incoming.slices, state->incoming.count,
                            &current_data);
  state->read_bytes += read_bytes;
  gpr_log(GPR_INFO, "Read %d bytes of %d", read_bytes,
          state->target_read_bytes);
  if (state->read_bytes >= state->target_read_bytes) {
    gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
  } else {
    switch (grpc_endpoint_read(state->ep, &state->incoming, &state->read_cb)) {
      case GRPC_ENDPOINT_DONE:
        gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
        read_cb(user_data, 1);
        break;
      case GRPC_ENDPOINT_ERROR:
        gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
        read_cb(user_data, 0);
        break;
      case GRPC_ENDPOINT_PENDING:
        gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));
        break;
    }
  }
}
Exemple #2
0
/* Write to a socket until it fills up, then read from it using the grpc_tcp
   API. */
static void large_read_test(ssize_t slice_size) {
  int sv[2];
  grpc_endpoint *ep;
  struct read_socket_state state;
  ssize_t written_bytes;
  gpr_timespec deadline = GRPC_TIMEOUT_SECONDS_TO_DEADLINE(20);

  gpr_log(GPR_INFO, "Start large read test, slice size %d", slice_size);

  create_sockets(sv);

  ep = grpc_tcp_create(grpc_fd_create(sv[1], "large_read_test"), slice_size,
                       "test");
  grpc_endpoint_add_to_pollset(ep, &g_pollset);

  written_bytes = fill_socket(sv[0]);
  gpr_log(GPR_INFO, "Wrote %d bytes", written_bytes);

  state.ep = ep;
  state.read_bytes = 0;
  state.target_read_bytes = written_bytes;
  gpr_slice_buffer_init(&state.incoming);
  grpc_iomgr_closure_init(&state.read_cb, read_cb, &state);

  switch (grpc_endpoint_read(ep, &state.incoming, &state.read_cb)) {
    case GRPC_ENDPOINT_DONE:
      read_cb(&state, 1);
      break;
    case GRPC_ENDPOINT_ERROR:
      read_cb(&state, 0);
      break;
    case GRPC_ENDPOINT_PENDING:
      break;
  }

  gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset));
  while (state.read_bytes < state.target_read_bytes) {
    grpc_pollset_worker worker;
    grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC),
                      deadline);
  }
  GPR_ASSERT(state.read_bytes == state.target_read_bytes);
  gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset));

  gpr_slice_buffer_destroy(&state.incoming);
  grpc_endpoint_destroy(ep);
}
Exemple #3
0
/*
 * main()
 */
int main (int argc, char **argv)
{
  if (init_socket(&sockfd) < 0) {
    printf("Init the socket failed.\n");
    return -1;
  }

  /*
   * Clean fd set.
   */
  FD_ZERO(&active_fd_set);
  FD_SET(sockfd, &active_fd_set);
  max_fd = sockfd;

  while (1) {
    int             err;
    struct timeval  tv;
    fd_set          read_fds;  // Only use in current run.

    /*
     * Set select timeout.
     */
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    /*
     * Copy fd set.
     */
    read_fds = active_fd_set;
    err = select(max_fd + 1, &read_fds, NULL, NULL, &tv);
    if (err == -1) {
      perror("select()");
      return -1;

    } else if (err == 0) {
      printf("Select timeout\n");
      continue;

    } else {
      /*
       * Service all sockets.
       */
      int i;
      for (i = 0; i < FD_SETSIZE; i++) {
        if (FD_ISSET(i, &read_fds)) {
          if (i == sockfd) {
            accept_cb();
          } else {
            read_cb(i);
          }
        }
      } // end of for

    } // end of if

  } // end of while

  return 0;
}
Exemple #4
0
void event_cb( struct bufferevent *buf_ev, short events, void *arg )
{
  	if( events & BEV_EVENT_ERROR ) {
    		fprintf(stderr, "Ошибка объекта bufferevent.\n" );
    		bufferevent_free( buf_ev );
    	}
  	if( events & BEV_EVENT_EOF ) {
  		read_cb( buf_ev, arg );
    		bufferevent_free( buf_ev );
    	}
}
Exemple #5
0
static _IO_ssize_t
_IO_cookie_read (_IO_FILE *fp, void *buf, _IO_ssize_t size)
{
  struct _IO_cookie_file *cfile = (struct _IO_cookie_file *) fp;
  cookie_read_function_t *read_cb = cfile->__io_functions.read;
#ifdef PTR_DEMANGLE
  PTR_DEMANGLE (read_cb);
#endif

  if (read_cb == NULL)
    return -1;

  return read_cb (cfile->__cookie, buf, size);
}
Exemple #6
0
void ws_connection::callback(async_fd & async) {

  if (async.ready_read()) {
    read_cb();
  }

  if (tcp_connection_.close_connection) {
    VLOG(3) << "close_connection";
    return;
  }

  if (async.ready_write()) {
    write_cb();
  }

}
Exemple #7
0
void
purple_keyring_set_inuse(PurpleKeyring *newkeyring, gboolean force,
                         PurpleKeyringSetInUseCallback cb, gpointer data)
{
    PurpleKeyring *oldkeyring;
    PurpleKeyringChangeTracker *tracker;
    GList *it;
    PurpleKeyringRead read_cb;

    if (current_change_tracker != NULL) {
        GError *error;
        purple_debug_error("keyring", "There is password migration "
                           "session already running.\n");
        if (cb == NULL)
            return;
        error = g_error_new(PURPLE_KEYRING_ERROR,
                            PURPLE_KEYRING_ERROR_INTERNAL,
                            _("There is a password migration session already "
                              "running."));
        cb(error, data);
        g_error_free(error);
        return;
    }

    oldkeyring = purple_keyring_get_inuse();

    if (oldkeyring == newkeyring) {
        if (purple_debug_is_verbose()) {
            purple_debug_misc("keyring",
                              "Old and new keyring are the same: %s.\n",
                              (newkeyring != NULL) ?
                              newkeyring->id : "(null)");
        }
        if (cb != NULL)
            cb(NULL, data);
        return;
    }

    purple_debug_info("keyring", "Attempting to set new keyring: %s.\n",
                      (newkeyring != NULL) ? newkeyring->id : "(null)");

    if (oldkeyring == NULL) { /* No keyring was set before. */
        if (purple_debug_is_verbose()) {
            purple_debug_misc("keyring", "Setting keyring for the "
                              "first time: %s.\n", newkeyring->id);
        }

        purple_keyring_inuse = newkeyring;
        g_assert(current_change_tracker == NULL);
        if (cb != NULL)
            cb(NULL, data);
        return;
    }

    /* Starting a migration. */

    read_cb = purple_keyring_get_read_password(oldkeyring);
    g_assert(read_cb != NULL);

    purple_debug_misc("keyring", "Starting migration from: %s.\n",
                      oldkeyring->id);

    tracker = g_new0(PurpleKeyringChangeTracker, 1);
    current_change_tracker = tracker;

    tracker->cb = cb;
    tracker->cb_data = data;
    tracker->new_kr = newkeyring;
    tracker->old_kr = oldkeyring;
    tracker->force = force;

    for (it = purple_accounts_get_all(); it != NULL; it = it->next) {
        if (tracker->abort) {
            tracker->finished = TRUE;
            break;
        }
        tracker->read_outstanding++;

        if (it->next == NULL)
            tracker->finished = TRUE;

        read_cb(it->data, purple_keyring_set_inuse_read_cb, tracker);
    }
}
//void udp_cb(EV_P_ ev_io *w, int revents) {
void udp_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
    //printf("udp data:");
    read_cb(loop, watcher, revents);
}
/*General read requests*/
void worker_cb(struct ev_loop *loop, struct ev_io *watcher, int revents) {
printf(">%s on thread %d\n", __FUNCTION__, pthread_self());
    //printf("I should do something!!");
    //read_cb(loop, watcher, revents);
    read_cb(loop, watcher, revents);
}
Exemple #10
0
/*
* NET_Monitor
* Monitors the given sockets with the given timeout in milliseconds
* It ignores closed and loopback sockets.
* Calls the callback function read_cb(socket_t *) with the socket as parameter the socket when incoming data was detected on it
* Calls the callback function exception_cb(socket_t *) with the socket as parameter when a socket exception was detected on that socket
* For both callbacks, NULL can be passed. When NULL is passed for the exception_cb, no exception detection is performed
* Incoming data is always detected, even if the 'read_cb' callback was NULL.
*/
int NET_Monitor( int msec, socket_t *sockets[], void (*read_cb)(socket_t *, void*), void (*exception_cb)(socket_t *, void*), void *privatep[] )
{
    struct timeval timeout;
    fd_set fdsetr, fdsete;
    fd_set *p_fdsete = NULL;
    int i, ret;
    int fdmax = 0;

    if( !sockets || !sockets[0] )
        return 0;

    FD_ZERO( &fdsetr );
    if (exception_cb) {
        FD_ZERO( &fdsete );
        p_fdsete = &fdsete;
    }

    for( i = 0; sockets[i]; i++ )
    {
        if (!sockets[i]->open)
            continue;
        switch( sockets[i]->type )
        {
        case SOCKET_UDP:
#ifdef TCP_SUPPORT
        case SOCKET_TCP:
#endif
            assert( sockets[i]->handle > 0 );
            fdmax = max( (int)sockets[i]->handle, fdmax );
            FD_SET( sockets[i]->handle, &fdsetr ); // network socket
            if( p_fdsete )
                FD_SET( sockets[i]->handle, p_fdsete );
            break;
        case SOCKET_LOOPBACK:
        default:
            continue;
        }
    }

    timeout.tv_sec = msec / 1000;
    timeout.tv_usec = ( msec % 1000 ) * 1000;
    ret = select( fdmax+1, &fdsetr, NULL, p_fdsete, &timeout );
    if ( ( ret > 0) && ( (read_cb) || (exception_cb)) ) {
        // Launch callbacks
        for( i = 0; sockets[i]; i++ ) {
            if (!sockets[i]->open)
                continue;

            switch( sockets[i]->type ) {
            case SOCKET_UDP:
#ifdef TCP_SUPPORT
            case SOCKET_TCP:
#endif
                if ( (exception_cb) && (p_fdsete) && (FD_ISSET(sockets[i]->handle, p_fdsete )) ) {
                    exception_cb(sockets[i], privatep ? privatep[i] : NULL);
                }
                if ( (read_cb) && (FD_ISSET(sockets[i]->handle, &fdsetr )) ) {
                    read_cb(sockets[i], privatep ? privatep[i] : NULL);
                }
                break;
            case SOCKET_LOOPBACK:
            default:
                continue;
            }
        }
    }
    return ret;
}
Exemple #11
0
int select_work(int listenfd)
{	
	int fdcount = 0;
	int sock[FD_SETSIZE] = {0};
	sock[fdcount++] = listenfd;
	
	while(1)
	{
		fd_set read_set, write_set, error_set;
		FD_ZERO(&read_set);
		FD_ZERO(&write_set);
		FD_ZERO(&error_set);		
	
		struct timeval tval;
		tval.tv_sec = 0;
		tval.tv_usec = 100 * 1000;	// 100ms		
		
		int ready = 0;
		int i = 0;
		int nfds = 0;
		for (i = 0; i < fdcount; i++)
		{
			if (sock[i] > 0)
			{
				FD_SET(sock[i], &read_set);
				FD_SET(sock[i], &write_set);
				FD_SET(sock[i], &error_set);
			}
			if (sock[i] > nfds)
			{
				nfds = sock[i];
			}			
		}
		ready = select(nfds + 1, &read_set, &write_set, &error_set, &tval);
		if (ready < 0)
		{
			perror("select error");
			return -1;
		}
		else if (ready == 0)
		{
			//printf("no select events\n");
			usleep(100);
		}
		else
		{
			for (i = 0; i < fdcount; i++)
			{
					if (FD_ISSET(sock[i], &write_set) && sock[i] > 0)
					{
						if (write_cb(sock[i]) < 0)
						{
							sock[i] = 0;
						}
					}
					if (FD_ISSET(sock[i], &read_set) && sock[i] > 0)
					{
						if (sock[i] == listenfd)
						{
							// accept events
							struct sockaddr_in client_addr;
							bzero(&client_addr, sizeof(client_addr));
							socklen_t socklen = sizeof(struct sockaddr_in);
							int fd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
							if (fd < 0)
							{
								perror("accept error");
								return -1;
							}
							printf("accept client from[%s]\n", inet_ntoa(client_addr.sin_addr));
							sock[fdcount++] = fd;
							FD_SET(fd, &read_set);
						}
						else
						{
							if (read_cb(sock[i]) < 0)
							{
								sock[i] = 0;
							}
						}						
					}
			}			
		}
	}
	return 0;
}
Exemple #12
0
void
read_thunk(struct ev_io *w, int revents)
{
    read_cb (w->fd, revents, w->data);
}
Exemple #13
0
int main(int argc, char *argv[])
{
    int free_parking_lots = PARKING_LOT_SIZE;
    char *entrance_log,*exit_log; // Strings para log files
    char msg_buffer[30];
    char time_string[30];
    
    /* Auxiliares */
    int status;       // Estatus de procedimientos
    int i;            // Iteraciones
    int last_ticket;  // Último ticket
    struct msg *m;    // Auxiliar para lectura de mensajes
    pthread_t tid;    // Thread para socket
    

    if (argc != 7) {
        printf ("Uso: sem_svr -l <puerto_sem_svr> -i <bitácora_entrada> -o <bitácora_salida> \n");
        exit(0);
    }

    /* Port get for listening */
    if      (strcmp("-l",argv[1]) == 0 ) listen_port = atoi(argv[2]);
    else if (strcmp("-l",argv[3]) == 0 ) listen_port = atoi(argv[4]);
    else if (strcmp("-l",argv[5]) == 0 ) listen_port = atoi(argv[6]);
    else {
        perror("Error: No se ha especificado del puerto");
        exit(0);
    }

    if      (strcmp("-i",argv[1]) == 0 ) entrance_log = argv[2];
    else if (strcmp("-i",argv[3]) == 0 ) entrance_log = argv[4];
    else if (strcmp("-i",argv[5]) == 0 ) entrance_log = argv[6];
    else {
        perror("Error: No se ha especificado la bitacora de entrada");
        exit(0);
    }

    if      (strcmp("-o",argv[1]) == 0 ) exit_log = argv[2];
    else if (strcmp("-o",argv[3]) == 0 ) exit_log = argv[4];
    else if (strcmp("-o",argv[5]) == 0 ) exit_log = argv[6];
    else {
        perror("Error: No se ha especificado la bitacora de salida");
        exit(0);
    }
    /* Initialize parking lot */
    for (i = 0; i < PARKING_LOT_SIZE; ++i)
        parking_space[i] = NULL;
    /* initialize circular buffer for messages*/
    init_buffer(&cb,(sizeof(struct msg)));


    /* Iniciando hilo de socket de lectura */ 
    pthread_create(&tid, NULL, read_messages, NULL);
    pthread_detach(tid);

    /* Ciclo indefinido de espera de mensajes, procesamiento y respuesta*/
    while (1){
        // Entrega de tickets y aceptar tickets de salida
        while(free_parking_lots > 0 ) {

            /* Esperar a el socket haya recibido alg'un mensaje */
            while (its_empty(cb))
                sleep(0.5); 
            
            /* Consumir mensaje */
            m = read_cb(&cb);

            if (m->in_out=='e')
            {   
                last_ticket = new_ticket();
                --free_parking_lots;

                strftime(time_string
                        ,30
                        ,"%d%m%Y%H%M"
                        ,parking_space[last_ticket]);

                // formato BDDMMYYYYHHMMSSS con SSS como ticket serial
                sprintf(msg_buffer,"1%s%03d",time_string,last_ticket);

                write_action(entrance_log,WENT_IN,last_ticket);
                answerClient(m->client.sin_addr,msg_buffer); 

            }
            else if (m->in_out=='s' && parking_space[m->car_id] != NULL)
            {
                ++free_parking_lots;

                last_payment = ticket_price(m->car_id);

                sprintf(msg_buffer,"X%d",last_payment);
                answerClient(m->client.sin_addr,msg_buffer);

                write_action(exit_log,WENT_OUT,m->car_id);

                
            }
            else if (m->in_out=='s' && parking_space[m->car_id] == NULL)
                printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n");
            else printf("Accion inesperada\n");
            
        }
        

        /* Indicar que no hay puestos libres o aceptar ticket de salida */
        while(free_parking_lots == 0)
        {   
            while (its_empty(cb)) 
                sleep(0.5); 

            m = read_cb(&cb);

            if (m->in_out=='e') {
                strftime(time_string
                        ,20
                        ,"%d%m%Y%H%M"
                        ,parking_space[last_ticket]);

                sprintf(msg_buffer,"0%sXXX",time_string);

                answerClient(m->client.sin_addr,msg_buffer);  
                write_action(entrance_log,FULL,last_ticket);
            }
            else if (m->in_out=='s' && parking_space[m->car_id] != NULL){
                ++free_parking_lots;

                last_payment = ticket_price(m->car_id);

                sprintf(msg_buffer,"X%d",last_payment);
                answerClient(m->client.sin_addr,msg_buffer); 

                write_action(exit_log,WENT_OUT,m->car_id);
                
            }
            else if (m->in_out=='s' && parking_space[m->car_id] == NULL)
                printf("Ese ticket no est'a en circulaci'on, intente de nuevo\n");
            else printf("Accion inesperada\n");
        }   
    }

}