Ejemplo n.º 1
0
void CORBA_BOA_impl_is_ready(CORBA_BOA ths, CORBA_Environment *ev)
{
	trapeze_mcp_init(1 /* yes, I'm the server */);
	
	/* Accept new clients, read client requests & send replies forever. */
	while (1) {
		FLICK_TARGET obj;
		FLICK_BUFFER msg;
		void *buffer;
		
		flick_trapeze_server_get_request(&msg);
		buffer = tpz_mtod(msg);
		
		obj = find_implementation(
			ths, buffer, ev);
		if (ev->_major != CORBA_NO_EXCEPTION) {
			/* Error finding object. */
			flick_trapeze_server_send_corba_exception(
				msg,
				CORBA_exception_id(ev));
			ev->_major = CORBA_NO_EXCEPTION;
		} else {
			switch ((*obj->server_func)(msg, buffer, obj)) {
			case FLICK_OPERATION_SUCCESS:
				/* end_encode already sent reply */
				break;
				
			case FLICK_OPERATION_SUCCESS_NOREPLY:
				break;
				
			default:
				/* FLICK_OPERATION_FAILURE */
				/*
				 * XXX --- The server dispatch function may
				 * have already encoded an exception
				 * `..._decode_error'.  We should send it, or
				 * the dispatch func should return FLICK_
				 * OPERATION_SUCCESS in that case.
				 */
				flick_trapeze_server_send_corba_exception(
					msg,
					ex_CORBA_NO_IMPLEMENT);
				break;
			}
		}
		if (!CORBA_Object_is_nil(obj, ev))
			CORBA_Object_release(obj, ev);
	}
	
	/* Should never be reached. */
	flick_set_exception(ths, ev, ex_CORBA_INTERNAL,
			    0, CORBA_COMPLETED_YES);
}
Ejemplo n.º 2
0
static bool create_filter_graph(rarch_dsp_filter_t *dsp, float sample_rate)
{
   unsigned i, filters = 0;

   if (!config_get_uint(dsp->conf, "filters", &filters))
      return false;

   dsp->instances = (struct rarch_dsp_instance*)
      calloc(filters, sizeof(*dsp->instances));
   if (!dsp->instances)
      return false;

   dsp->num_instances = filters;

   for (i = 0; i < filters; i++)
   {
      struct config_file_userdata userdata;
      struct dspfilter_info info;
      char key[64]                         = {0};
      char name[64]                        = {0};

      info.input_rate = sample_rate;

      snprintf(key, sizeof(key), "filter%u", i);

      if (!config_get_array(dsp->conf, key, name, sizeof(name)))
         return false;

      dsp->instances[i].impl = find_implementation(dsp, name);
      if (!dsp->instances[i].impl)
         return false;

      userdata.conf = dsp->conf;
      /* Index-specific configs take priority over ident-specific. */
      userdata.prefix[0] = key;
      userdata.prefix[1] = dsp->instances[i].impl->short_ident;

      dsp->instances[i].impl_data = dsp->instances[i].impl->init(&info, &dspfilter_config, &userdata);
      if (!dsp->instances[i].impl_data)
         return false;
   }

   return true;
}
Ejemplo n.º 3
0
void CORBA_BOA_impl_is_ready(CORBA_BOA ths, CORBA_Environment *ev)
{
	int maxconn = -1;
	fd_set fds;
	struct sockaddr_in server;
	int sock, i;
	int len = sizeof(struct sockaddr_in);
	FLICK_BUFFER the_buf, return_buf;
	int *clients = 0;
	int client_cur = 0;
	int client_max = 0;
	
	/* allocate our own buffers.  This is in preparation for being
           thread-safe. */
	the_buf.real_buf_start = the_buf.buf_read = the_buf.buf_start =
	         the_buf.buf_current = t_calloc(char, 8192);
	the_buf.real_buf_end = the_buf.buf_end = (((char *) the_buf.buf_start)
						  + 8192);
	
	return_buf.real_buf_start = return_buf.real_buf_end =
	      return_buf.buf_read = 0;
	return_buf.buf_start  = return_buf.buf_current = t_calloc(char, 8192);
	return_buf.buf_end = ((char *) return_buf.buf_start) + 8192;
	
	if(!the_buf.buf_start || !return_buf.buf_start) {
		flick_set_exception(ths, ev, ex_CORBA_NO_MEMORY,
				    0, CORBA_COMPLETED_NO);
		perror("Insufficient memory for server buffers"); 
		return;
	}
	
	FD_ZERO(&fds);
	
	/* Get the listening socket & port for this machine */
	sock = ths->socket_fd;
	memset((char *)&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	
	/* Bind a port for this skelecton function */
	server.sin_port = htons(ths->hostport);
	if (bind(sock, (struct sockaddr *)&server, len) != 0) {
		perror("cannot `bind' to socket");
		flick_set_exception(ths, ev, ex_CORBA_COMM_FAILURE,
				    0, CORBA_COMPLETED_NO);
		return;
	}
	
	if ((getsockname(sock, (struct sockaddr *)&server, &len) != 0)
	    || (listen(sock, 8) != 0)) {
		perror("cannot `getsockname' or `listen', port may be in use");
		flick_set_exception(ths, ev, ex_CORBA_COMM_FAILURE,
				    0, CORBA_COMPLETED_NO);
		return;
	}
	
	FD_SET(sock, &fds);
	
	if (sock > maxconn)
		maxconn = sock;
	
	/* Accept new clients, read client requests & send replies forever. */
	while (1) {
		FLICK_TARGET obj;
		unsigned int request_id;
		
		int qty = select(maxconn + 1, &fds, 0, 0, 0);
		
		for (i = 0; i < client_cur && qty; i++) {
			if ((clients[i] >= 0)
			    && FD_ISSET(clients[i], &fds)) {
				do {
					obj = 0;
					request_id = 0;
					
					if (!flick_server_get_request(
						clients[i],
						&the_buf)) {
						/*
						 * Error receiving the mesg.
						 * Client FD is closed by
						 * `flick_server_get_request'.
						 */
						clients[i] = -1;
					} else {
						obj = find_implementation(
							ths, &the_buf,
							&request_id, ev);
						if (ev->_major
						    != CORBA_NO_EXCEPTION) {
							/* Error finding
							   object. */
							flick_server_send_exception(
								clients[i],
								request_id,
								CORBA_exception_id(ev));
							ev->_major = CORBA_NO_EXCEPTION;
						} else {
							switch ((*obj->
								 server_func)(
									 &the_buf,
									 &return_buf,
									 request_id,
									 obj)) {
							case FLICK_OPERATION_SUCCESS:
								flick_server_send_reply(
									clients[i],
									&return_buf);
								break;
								
							case FLICK_OPERATION_SUCCESS_NOREPLY:
								break;
								
							default:
								/* FLICK_OPERATION_FAILURE */
								/*
								 * XXX --- The server
								 * dispatch function
								 * may have already
								 * encoded an exception
								 * `..._decode_error'.
								 * We should send it,
								 * or the dispatch func
								 * should return FLICK_
								 * OPERATION_SUCCESS in
								 * that case.
								 */
								flick_server_send_exception(
									clients[i],
									request_id,
									ex_CORBA_NO_IMPLEMENT);
								break;
							}
						}
					}
					if (!CORBA_Object_is_nil(obj, ev))
						CORBA_Object_release(obj, ev);
					
				} while (flick_buffer_contains_more(&the_buf));
				qty--;
			}
		}
		
		if (FD_ISSET(sock, &fds)) {
			int pos = -1;
			qty--;
			for (i = 0; i < client_cur; i++)
				if (clients[i] < 0)
					break;
			if (i < client_cur)
				pos = i;
			else {
				pos = client_cur++;
				if (client_cur > client_max) {
					client_max += 10;
					clients = t_realloc(clients, int, client_max);
					if (!clients) {			
						flick_set_exception(
							ths, ev,
							ex_CORBA_NO_MEMORY,
							0, CORBA_COMPLETED_NO);
						return;
					}
				}
			}
			clients[pos] = accept(sock, 0, 0);
			if (clients[pos] > maxconn)
				maxconn = clients[pos];
		}