static int stop(sox_effect_t * effp) { priv_t * p = (priv_t *) effp->priv; fifo_delete(&p->input_fifo); fifo_delete(&p->output_fifo); free(p->filter_ptr->coefs); memset(p->filter_ptr, 0, sizeof(*p->filter_ptr)); return SOX_SUCCESS; }
int rtapi_exit(int module_id) { module_data *module; int n; if (rtapi_data == NULL) { rtapi_print_msg(RTAPI_MSG_ERR, "RTAPI: ERROR: exit called before init\n"); return -EINVAL; } rtapi_print_msg(RTAPI_MSG_DBG, "RTAPI: module %02d exiting\n", module_id); /* validate module ID */ if ((module_id < 1) || (module_id > RTAPI_MAX_MODULES)) { rtapi_print_msg(RTAPI_MSG_ERR, "RTAPI: ERROR: bad module id\n"); return -EINVAL; } /* get mutex */ rtapi_mutex_get(&(rtapi_data->mutex)); /* point to the module's data */ module = &(module_array[module_id]); /* check module status */ if (module->state != USERSPACE) { rtapi_print_msg(RTAPI_MSG_ERR, "RTAPI: ERROR: not a userspace module\n"); rtapi_mutex_give(&(rtapi_data->mutex)); return -EINVAL; } /* clean up any mess left behind by the module */ for (n = 1; n <= RTAPI_MAX_SHMEMS; n++) { if (test_bit(module_id, shmem_array[n].bitmap)) { fprintf(stderr, "ULAPI: WARNING: module '%s' failed to delete shmem %02d\n", module->name, n); shmem_delete(n, module_id); } } for (n = 1; n <= RTAPI_MAX_FIFOS; n++) { if ((fifo_array[n].reader == module_id) || (fifo_array[n].writer == module_id)) { fprintf(stderr, "ULAPI: WARNING: module '%s' failed to delete fifo %02d\n", module->name, n); fifo_delete(n, module_id); } } /* update module data */ rtapi_print_msg(RTAPI_MSG_DBG, "RTAPI: module %02d exited, name = '%s'\n", module_id, module->name); module->state = NO_MODULE; module->name[0] = '\0'; rtapi_data->ul_module_count--; rtapi_mutex_give(&(rtapi_data->mutex)); nummods--; if(nummods == 0) { rtai_free(RTAPI_KEY, rtapi_data); rtapi_data = 0; } return 0; }
void server_run(server_context_t *c, void *(*popper_thread)(void *)) { fifo_init(&c->fifo, c->fifo_size_in_bits, c->fifo_packet_size_in_bits); c->server_thread_arg.fifo = &c->fifo; c->popper_thread_arg.fifo = &c->fifo; c->server_thread_arg.max_packet_size = 1 << c->fifo_packet_size_in_bits; c->popper_thread_arg.max_packet_size = 1 << c->fifo_packet_size_in_bits; c->server_thread_arg.sleep_usec = c->sleep_usec; c->popper_thread_arg.sleep_usec = c->sleep_usec; c->server_thread_arg.max_mbps = c->max_mbps; c->popper_thread_arg.max_mbps = c->max_mbps; socket_open(c); pthread_create(&c->server_th, NULL, (void* (*)(void*))server_thread, &c->server_thread_arg); pthread_create(&c->popper_th, NULL, popper_thread, &c->popper_thread_arg); pthread_join(c->popper_th, NULL); #ifdef __ANDROID__ // this is wrong, but android has no pthread_cancel // see stack overflow for a better solution that uses a SIGUSR1 handler // that I don't have time to implement right now // http://stackoverflow.com/questions/4610086/pthread-cancel-alternatives-in-android-ndk // pthread_kill(c->server_th, SIGUSR1); #else pthread_cancel(c->server_th); #endif socket_close(c); fifo_delete(&c->fifo); }
int rtapi_fifo_delete(int fifo_id, int module_id) { int retval; rtapi_mutex_get(&(rtapi_data->mutex)); retval = fifo_delete(fifo_id, module_id); rtapi_mutex_give(&(rtapi_data->mutex)); return retval; }
int main() { struct fifo * list = fifo_create_thread_safe_fifo(); int i = 0; /*pop empty queue*/ fifo_pop(list); printf("length: %d\n",fifo_length(list)); for(;i<10;i++) { fifo_push(list,(void*)i); } printf("length: %d\n",fifo_length(list)); for(i=0;i<5;i++) { printf("%d\n",(int)fifo_pop(list)); } printf("length: %d\n",fifo_length(list)); for(i=0;i<2;i++) { fifo_push(list,(void*)(i+10)); } printf("length: %d\n",fifo_length(list)); for(i=0;i<7;i++) { printf("%d\n",(int)fifo_pop(list)); } printf("length: %d\n",fifo_length(list)); for(i=0;i<2;i++) { fifo_push(list,(void*)(i+10)); } printf("length: %d\n",fifo_length(list)); for(i=0;i<2;i++) { printf("%d\n",(int)fifo_pop(list)); } printf("length: %d\n",fifo_length(list)); fifo_delete(list,NULL); }
static bool __fifo_elem_cleaner(struct list_t *e) { struct __fifo_elem_t *p; list_downcast(p,e); if(p->fifo) { fifo_delete(p->fifo); } FREE(p); return true; }
static void fifo_close(struct fifo_data *fd) { struct stat st; if (fd->input >= 0) { close(fd->input); fd->input = -1; } if (fd->output >= 0) { close(fd->output); fd->output = -1; } if (fd->created && (stat(fd->path, &st) == 0)) fifo_delete(fd); }