/** * Destroys the worker structures. */ void worker_destroy() { int i; // LOG(L_CRIT,"-1-\n"); /* lock_get(tasks->lock);*/ for(i=0;i<tasks->max;i++){ if (tasks->queue[i].msg) AAAFreeMessage(&(tasks->queue[i].msg)); } // LOG(L_CRIT,"-2-\n"); shm_free(tasks->queue); lock_destroy(tasks->lock); lock_dealloc((void*)tasks->lock); // LOG(L_CRIT,"-3-\n"); //lock_release(tasks->empty); semctl(tasks->empty, 0, IPC_RMID, cdp_semun_destroy); // LOG(L_CRIT,"-4-\n"); semctl(tasks->full, 0, IPC_RMID, cdp_semun_destroy); shm_free(tasks); while(callbacks->head) cb_remove(callbacks->head); shm_free(callbacks); }
/** * Destroys the worker structures. */ void worker_destroy() { int i,sval=0; if (callbacks){ while(callbacks->head) cb_remove(callbacks->head); shm_free(callbacks); } // to deny runing the poison queue again config->workers = 0; if (tasks) { // LOG(L_CRIT,"-1-\n"); lock_get(tasks->lock); for(i=0;i<tasks->max;i++){ if (tasks->queue[i].msg) AAAFreeMessage(&(tasks->queue[i].msg)); tasks->queue[i].msg = 0; tasks->queue[i].p = 0; } lock_release(tasks->lock); LOG(L_INFO,"Unlocking workers waiting on empty queue...\n"); for(i=0;i<config->workers;i++) sem_release(tasks->empty); LOG(L_INFO,"Unlocking workers waiting on full queue...\n"); i=0; while(sem_getvalue(tasks->full,&sval)==0) if (sval<=0) { sem_release(tasks->full); i=1; } else break; sleep(i); lock_get(tasks->lock); // LOG(L_CRIT,"-2-\n"); shm_free(tasks->queue); lock_destroy(tasks->lock); lock_dealloc((void*)tasks->lock); // LOG(L_CRIT,"-3-\n"); //lock_release(tasks->empty); sem_free(tasks->full); sem_free(tasks->empty); shm_free(tasks); } }
int main(int arg, char** argv) { sbinder_start(); int ret; ret = cb_add(_cb_callback); printf("main 1ret = %d\n",ret); ret = cb_add(_cb_callback1); printf("main 2ret = %d\n",ret); ret = cb_invoke(10); printf("main 3ret = %d\n",ret); sleep(5); ret = cb_invoke(11); printf("main 4ret = %d\n",ret); sleep(5); ret = cb_remove(_cb_callback1); printf("main 5ret = %d\n",ret); startThread(13); printf("main 6ret = %d\n",ret); startThread(14); printf("main 7ret = %d\n",ret); startThread(15); printf("main 8ret = %d\n",ret); startThread(16); printf("main 9ret = %d\n",ret); startThread(17); printf("main 10ret = %d\n",ret); ret = cb_invoke(12); printf("main 11ret = %d\n",ret); return sbinder_serv(); }