int swFactoryProcess_shutdown(swFactory *factory) { swFactoryProcess *this = factory->object; int i; //kill all child process for (i = 0; i < this->worker_num; i++) { swTrace("[Main]kill worker processor\n"); kill(this->workers[i].pid, SIGTERM); } #ifdef SW_USE_SHM_CHAN //kill all child process for (i = 0; i < this->writer_num; i++) { #if defined(SW_CHAN_USE_MMAP) || SW_CHAN_USE_MMAP==1 swShareMemory_mmap_free(&this->writers[i].shm); #else swShareMemory_sysv_free(&this->writers[i].shm); #endif } #endif free(this->workers); free(this->writers); free(this); return SW_OK; }
void sw_shm_free(void *ptr) { //object对象在头部,如果释放了错误的对象可能会发生段错误 swShareMemory *object = ptr - sizeof(swShareMemory); #ifdef SW_DEBUG char check = *(char *)(ptr + object->size); //尝试访问 #endif swShareMemory_mmap_free(object); }