struct skynet_module * skynet_module_query(const char * name) { struct skynet_module * result = _query(name); if (result) return result; SPIN_LOCK(M) result = _query(name); // double check if (result == NULL && M->count < MAX_MODULE_TYPE) { int index = M->count; void * dl = _try_open(M,name); if (dl) { M->m[index].name = name; M->m[index].module = dl; if (_open_sym(&M->m[index]) == 0) { M->m[index].name = skynet_strdup(name); M->count ++; result = &M->m[index]; } } } SPIN_UNLOCK(M) return result; }
struct skynet_module * skynet_module_query(const char * name) { struct skynet_module * result = _query(name); if (result) return result; while(__sync_lock_test_and_set(&M->lock,1)) {} result = _query(name); // double check if (result == NULL && M->count < MAX_MODULE_TYPE) { int index = M->count; void * dl = _try_open(M,name); if (dl) { M->m[index].name = name; M->m[index].module = dl; if (_open_sym(&M->m[index])== 0) { M->m[index].name = strdup(name); M->count ++; result = &M->m[index]; } } } __sync_lock_release(&M->lock); return result; }