Răsfoiți Sursa

htable: Fix expiry on assignment

Update cell expiry on assignment for htables w/o updateexpiry (analogue to #4079).
Bastian Triller 8 luni în urmă
părinte
comite
75994f40c9
2 a modificat fișierele cu 12 adăugiri și 19 ștergeri
  1. 5 19
      src/modules/htable/ht_api.c
  2. 7 0
      src/modules/htable/ht_api.h

+ 5 - 19
src/modules/htable/ht_api.c

@@ -496,9 +496,7 @@ int ht_set_cell_ex(
 						it->value.s.s[it->value.s.len] = '\0';
 
 						if(exv <= 0) {
-							if(ht->updateexpire) {
-								it->expire = now + ht->htexpire;
-							}
+							HT_UPDATE_EXPIRE(ht, it, now);
 						} else {
 							it->expire = now + exv;
 						}
@@ -514,11 +512,7 @@ int ht_set_cell_ex(
 						cell->next = it->next;
 						cell->prev = it->prev;
 						if(exv <= 0) {
-							if(ht->updateexpire) {
-								cell->expire = now + ht->htexpire;
-							} else {
-								cell->expire = it->expire;
-							}
+							HT_COPY_EXPIRE(ht, cell, now, it);
 						} else {
 							it->expire = now + exv;
 						}
@@ -535,9 +529,7 @@ int ht_set_cell_ex(
 					it->value.n = val->n;
 
 					if(exv <= 0) {
-						if(ht->updateexpire) {
-							it->expire = now + ht->htexpire;
-						}
+						HT_UPDATE_EXPIRE(ht, it, now);
 					} else {
 						it->expire = now + exv;
 					}
@@ -556,11 +548,7 @@ int ht_set_cell_ex(
 						return -1;
 					}
 					if(exv <= 0) {
-						if(ht->updateexpire) {
-							cell->expire = now + ht->htexpire;
-						} else {
-							cell->expire = it->expire;
-						}
+						HT_COPY_EXPIRE(ht, cell, now, it);
 					} else {
 						it->expire = now + exv;
 					}
@@ -578,9 +566,7 @@ int ht_set_cell_ex(
 					it->value.n = val->n;
 
 					if(exv <= 0) {
-						if(ht->updateexpire) {
-							it->expire = now + ht->htexpire;
-						}
+						HT_UPDATE_EXPIRE(ht, it, now);
 					} else {
 						it->expire = now + exv;
 					}

+ 7 - 0
src/modules/htable/ht_api.h

@@ -143,4 +143,11 @@ ht_cell_t *ht_iterator_get_current(str *iname);
 
 void ht_slot_lock(ht_t *ht, int idx);
 void ht_slot_unlock(ht_t *ht, int idx);
+
+#define HT_UPDATE_EXPIRE(ht, it, now)                               \
+	if(ht->updateexpire || (now && it->expire && it->expire < now)) \
+	it->expire = now + ht->htexpire
+#define HT_COPY_EXPIRE(ht, it, now, src) \
+	HT_UPDATE_EXPIRE(ht, it, now);       \
+	else it->expire = src->expire
 #endif