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); }
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; }
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]; }