odph_table_t odph_linear_table_create(const char *name, uint32_t capacity, uint32_t ODP_IGNORED, uint32_t value_size) { int idx; uint32_t node_num; odp_shm_t shmem; odph_linear_table_imp *tbl; if (strlen(name) >= ODPH_TABLE_NAME_LEN || capacity < 1 || capacity >= 0x1000 || value_size == 0) { printf("create para input error or less than !"); return NULL; } /* check name confict in shm*/ tbl = (odph_linear_table_imp *)odp_shm_addr(odp_shm_lookup(name)); if (tbl != NULL) { ODPH_DBG("name already exist\n"); return NULL; } /* alloc memory from shm */ shmem = odp_shm_reserve(name, capacity << 20, 64, ODP_SHM_SW_ONLY); if (shmem == ODP_SHM_INVALID) { ODPH_DBG("shm reserve fail\n"); return NULL; } tbl = (odph_linear_table_imp *)odp_shm_addr(shmem); /* clean this block of memory */ memset(tbl, 0, capacity << 20); tbl->init_cap = capacity < 20; strncpy(tbl->name, name, ODPH_TABLE_NAME_LEN - 1); /* for linear table, the key is just the index, without confict * so we just need to record the value content * there is a rwlock in the head of every node */ tbl->value_size = value_size + sizeof(odp_rwlock_t); node_num = tbl->init_cap / tbl->value_size; tbl->node_sum = node_num; tbl->value_array = (void *)((char *)tbl + sizeof(odph_linear_table_imp)); /* initialize rwlock*/ for (idx = 0; idx < tbl->node_sum; idx++) { odp_rwlock_t *lock = (odp_rwlock_t *)((char *)tbl->value_array + idx * tbl->value_size); odp_rwlock_init(lock); } tbl->magicword = ODPH_LINEAR_TABLE_MAGIC_WORD; return (odph_table_t)(tbl); }
void odp_rwlock_recursive_init(odp_rwlock_recursive_t *rlock) { INVALIDATE(rlock); memset(rlock, 0, sizeof(odp_rwlock_recursive_t)); rlock->wr_owner = NO_OWNER; __builtin_k1_wpurge(); odp_rwlock_init(&rlock->lock); }
void odp_rwlock_recursive_init(odp_rwlock_recursive_t *rlock) { memset(rlock, 0, sizeof(odp_rwlock_recursive_t)); odp_rwlock_init(&rlock->lock); rlock->wr_owner = NO_OWNER; }