int swTable_create(swTable *table) { uint32_t row_num = table->size * (1 + SW_TABLE_CONFLICT_PROPORTION); uint32_t row_memory_size = sizeof(swTableRow) + table->item_size; size_t memory_size = (row_num * row_memory_size) + (table->size * sizeof(swTableRow *)) + sizeof(swMemoryPool) + sizeof(swFixedPool) + ((row_num - table->size) * sizeof(swFixedPool_slice)); void *memory = sw_shm_malloc(memory_size); if (memory == NULL) { return SW_ERR; } memset(memory, 0, memory_size); table->memory = memory; table->rows = memory; memory += table->size * sizeof(swTableRow *); memory_size -= table->size * sizeof(swTableRow *); int i; for (i = 0; i < table->size; i++) { table->rows[i] = memory + (row_memory_size * i); } memory += row_memory_size * table->size; memory_size -= row_memory_size * table->size; table->pool = swFixedPool_new2(row_memory_size, memory, memory_size); return SW_OK; }
int swTable_create(swTable *table) { uint32_t row_num = table->size * (1 + SW_TABLE_CONFLICT_PROPORTION); //header + data uint32_t row_memory_size = sizeof(swTableRow) + table->item_size; /** * row data & header */ size_t memory_size = row_num * row_memory_size; /** * memory pool for conflict rows */ memory_size += sizeof(swMemoryPool) + sizeof(swFixedPool) + ((row_num - table->size) * sizeof(swFixedPool_slice)); /** * for iterator, Iterate through all the elements */ memory_size += table->size * sizeof(swTableRow *); void *memory = sw_shm_malloc(memory_size); if (memory == NULL) { return SW_ERR; } memset(memory, 0, memory_size); table->memory = memory; table->compress_threshold = table->size * SW_TABLE_COMPRESS_PROPORTION; table->rows = memory; memory += table->size * sizeof(swTableRow *); memory_size -= table->size * sizeof(swTableRow *); #if SW_TABLE_USE_SPINLOCK == 0 pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP); #endif int i; for (i = 0; i < table->size; i++) { table->rows[i] = memory + (row_memory_size * i); #if SW_TABLE_USE_SPINLOCK == 0 pthread_mutex_init(&table->rows[i]->lock, &attr); #endif } memory += row_memory_size * table->size; memory_size -= row_memory_size * table->size; table->pool = swFixedPool_new2(row_memory_size, memory, memory_size); return SW_OK; }
int swTable_create(swTable *table) { uint32_t row_num = table->size * (1 + SW_TABLE_CONFLICT_PROPORTION); //header + data uint32_t row_memory_size = sizeof(swTableRow) + table->item_size; /** * row data & header */ size_t memory_size = row_num * row_memory_size; /** * row point */ memory_size += table->size * sizeof(swTableRow *); /** * memory pool for conflict rows */ memory_size += sizeof(swMemoryPool) + sizeof(swFixedPool) + ((row_num - table->size) * sizeof(swFixedPool_slice)); /** * for iterator, Iterate through all the elements */ memory_size += table->size * sizeof(swTableRow *); void *memory = sw_shm_malloc(memory_size); if (memory == NULL) { return SW_ERR; } memset(memory, 0, memory_size); table->memory = memory; table->compress_threshold = table->size * SW_TABLE_COMPRESS_PROPORTION; table->rows_list = memory; memory += table->size * sizeof(swTableRow *); memory_size -= table->size * sizeof(swTableRow *); table->rows = memory; memory += table->size * sizeof(swTableRow *); memory_size -= table->size * sizeof(swTableRow *); int i; for (i = 0; i < table->size; i++) { table->rows[i] = memory + (row_memory_size * i); } memory += row_memory_size * table->size; memory_size -= row_memory_size * table->size; table->pool = swFixedPool_new2(row_memory_size, memory, memory_size); return SW_OK; }