@@ -87,100 +87,127 @@ int swTableColumn_add(swTable *table, char *name, int len, int type, int size)
87
87
int swTable_create (swTable * table )
88
88
{
89
89
uint32_t row_num = table -> size * (1 + SW_TABLE_CONFLICT_PROPORTION );
90
- size_t memory_size = row_num * ( sizeof (swTableRow ) + table -> item_size ) ;
90
+ uint32_t row_memory_size = sizeof (swTableRow ) + table -> item_size ;
91
91
92
+ size_t memory_size = row_num * row_memory_size ;
92
93
void * memory = sw_shm_malloc (memory_size );
93
94
if (memory == NULL )
94
95
{
95
96
return SW_ERR ;
96
97
}
97
98
table -> memory = memory ;
98
99
table -> rows = memory ;
99
- memory += sizeof (swTableRow ) * table -> size ;
100
- memory_size -= sizeof (swTableRow ) * table -> size ;
101
100
102
101
int i ;
103
102
for (i = 0 ; i < table -> size ; i ++ )
104
103
{
105
- table -> rows [i ] = memory + (sizeof ( swTableRow ) + table -> item_size ) * i ;
104
+ table -> rows [i ] = memory + (row_memory_size * i ) ;
106
105
}
107
- memory += ( sizeof ( swTableRow ) + table -> item_size ) * table -> size ;
108
- memory_size -= ( sizeof ( swTableRow ) + table -> item_size ) * table -> size ;
109
- table -> pool = swFixedPool_new2 (table -> item_size , memory , memory_size );
106
+ memory += row_memory_size * table -> size ;
107
+ memory_size -= row_memory_size * table -> size ;
108
+ table -> pool = swFixedPool_new2 (row_memory_size , memory , memory_size );
110
109
return SW_OK ;
111
110
}
112
111
113
112
void swTable_free (swTable * table )
114
113
{
115
-
116
- //TODO free columns
117
- // if (table->item_size > 0)
118
- // {
119
- //
120
- // }
121
114
sw_shm_free (table -> memory );
122
115
}
123
116
124
-
125
117
static sw_inline swTableRow * swTable_hash (swTable * table , char * key , int keylen )
126
118
{
127
119
uint64_t hashv = swoole_hash_austin (key , keylen );
128
120
uint32_t index = hashv & (table -> size - 1 );
129
121
return table -> rows [index ];
130
122
}
131
123
132
- swTableRow * swTableRow_add (swTable * table , char * key , int keylen )
124
+ swTableRow * swTableRow_set (swTable * table , char * key , int keylen )
125
+ {
126
+ swTableRow * row = swTable_hash (table , key , keylen );
127
+ uint32_t crc32 = swoole_crc32 (key , keylen );
128
+
129
+ sw_spinlock (& row -> lock );
130
+ if (row -> active )
131
+ {
132
+ for (;;)
133
+ {
134
+ if (row -> crc32 == crc32 )
135
+ {
136
+ break ;
137
+ }
138
+ else if (row -> next == NULL )
139
+ {
140
+ swTableRow * new_row = table -> pool -> alloc (table -> pool , 0 );
141
+ row -> next = new_row ;
142
+ row = new_row ;
143
+ break ;
144
+ }
145
+ else
146
+ {
147
+ row = row -> next ;
148
+ }
149
+ }
150
+ }
151
+ row -> crc32 = crc32 ;
152
+ row -> active = 1 ;
153
+ swTrace ("row=%p, crc32=%u, key=%s\n" , row , crc32 , key );
154
+ sw_spinlock_release (& row -> lock );
155
+ return row ;
156
+ }
157
+
158
+ swTableRow * swTableRow_get (swTable * table , char * key , int keylen )
133
159
{
134
160
swTableRow * row = swTable_hash (table , key , keylen );
161
+ uint32_t crc32 = swoole_crc32 (key , keylen );
135
162
163
+ swTrace ("row=%p, crc32=%u, key=%s\n" , row , crc32 , key );
136
164
sw_spinlock (& row -> lock );
137
- while ( 1 )
165
+ for (;; )
138
166
{
139
- //empty slot
140
- if (row -> active == 0 )
167
+ if (row -> crc32 == crc32 )
141
168
{
142
169
break ;
143
170
}
144
- else if (row -> next )
171
+ else if (row -> next == NULL )
145
172
{
146
- row = row -> next ;
173
+ row = NULL ;
174
+ break ;
147
175
}
148
176
else
149
177
{
150
- swTableRow * new_row = table -> pool -> alloc (table -> pool , 0 );
151
- row -> next = new_row ;
152
- row = new_row ;
153
- break ;
178
+ row = row -> next ;
154
179
}
155
180
}
156
- row -> active = 1 ;
157
181
sw_spinlock_release (& row -> lock );
158
182
return row ;
159
183
}
160
184
161
- swTableRow * swTableRow_get (swTable * table , char * key , int keylen )
185
+ int swTableRow_del (swTable * table , char * key , int keylen )
162
186
{
163
187
swTableRow * row = swTable_hash (table , key , keylen );
188
+ uint32_t crc32 = swoole_crc32 (key , keylen );
164
189
165
- // for(;;)
166
- // {
167
- // //empty slot
168
- // if (row->active == 0)
169
- // {
170
- // break;
171
- // }
172
- // else if (row->next)
173
- // {
174
- // row = row->next;
175
- // }
176
- // else
177
- // {
178
- // swTableRow *new_row = swTable_alloc(table);
179
- // row->next = new_row;
180
- // row = new_row;
181
- // break;
182
- // }
183
- // }
184
- return row ;
190
+ sw_spinlock (& row -> lock );
191
+ while (row -> active )
192
+ {
193
+ for (;;)
194
+ {
195
+ if (row -> crc32 == crc32 )
196
+ {
197
+ table -> pool -> free (table -> pool , row );
198
+ break ;
199
+ }
200
+ else if (row -> next == NULL )
201
+ {
202
+ return SW_ERR ;
203
+ }
204
+ else
205
+ {
206
+ row = row -> next ;
207
+ }
208
+ }
209
+ }
210
+ row -> active = 0 ;
211
+ sw_spinlock_release (& row -> lock );
212
+ return SW_OK ;
185
213
}
186
-
0 commit comments