1.13
-date 2010.12.01.12.22.08; author rusty; state Exp;
+date 2011.03.01.11.46.54; author rusty; state Exp;
branches;
next 1.12;
1.13
log
-@Merged changes.
+@Thread-safe API
@
text
@#LyX 1.6.7 created this file. For more info see http://www.lyx.org/
\end_layout
\begin_layout Standard
+
+\change_deleted 0 1298979572
Incomplete; nesting flag is still defined as per tdb1.
+\change_inserted 0 1298979584
+Complete; the nesting flag has been removed.
+\change_unchanged
+
\end_layout
\begin_layout Subsection
\begin_layout Standard
Reachitecting the API to include a tdb_errcode pointer would be a great
- deal of churn; we are better to guarantee that the tdb_errcode is per-thread
- so the current programming model can be maintained.
+ deal of churn
+\change_inserted 0 1298979557
+, but fortunately most functions return 0 on success and -1 on error: we
+ can change these to return 0 on success and a negative error code on error,
+ and the API remains similar to previous.
+ The tdb_fetch, tdb_firstkey and tdb_nextkey functions need to take a TDB_DATA
+ pointer and return an error code.
+ It is also simpler to have tdb_nextkey replace its key argument in place,
+ freeing up any old .dptr.
+\end_layout
+
+\begin_layout Standard
+
+\change_deleted 0 1298979438
+; we are better to guarantee that the tdb_errcode is per-thread so the current
+ programming model can be maintained.
\end_layout
\begin_layout Standard
+
+\change_deleted 0 1298979438
This requires dynamic per-thread allocations, which is awkward with POSIX
threads (pthread_key_create space is limited and we cannot simply allocate
a key for every TDB).
+\change_unchanged
+
\end_layout
\begin_layout Standard
\end_layout
\begin_layout Standard
-Incomplete.
+Incomplete
+\change_inserted 0 1298979681
+; API has been changed but thread safety has not been implemented.
+\change_deleted 0 1298979669
+.
+\change_unchanged
+
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Standard
+
+\change_deleted 0 1298979699
Incomplete, TDB_CLEAR_IF_FIRST still defined, but not implemented.
+\change_inserted 0 1298979700
+Complete.
+\change_unchanged
+
\end_layout
\begin_layout Subsection
\end_layout
\begin_layout Standard
+
+\change_deleted 0 1298979837
Incomplete; TDB_CLEAR_IF_FIRST still defined, but does nothing.
+\change_inserted 0 1298979837
+Complete.
+\change_unchanged
+
\end_layout
\begin_layout Subsection
a696 2
\change_inserted 0 1291204640
-a700 2
-
+d702 1
+a702 1
\change_inserted 0 1291204665
-a701 2
-\change_unchanged
-
-a722 2
+d704 2
+a728 2
\change_inserted 0 1291204671
-a725 2
+a731 2
\change_inserted 0 1291204671
-a729 2
+a735 2
\change_inserted 0 1291204673
-a730 2
+a736 2
\change_unchanged
-a774 2
+a780 2
\change_inserted 0 1291204731
-a777 2
+a783 2
\change_inserted 0 1291204732
-a781 2
+a787 2
\change_inserted 0 1291204779
-a784 2
+a790 2
\change_unchanged
-a836 2
+a842 2
\change_inserted 0 1291204830
-a839 2
+a845 2
\change_inserted 0 1291204831
-a843 2
+a849 2
\change_inserted 0 1291204834
-a844 2
+a850 2
\change_unchanged
-a898 2
+d879 9
+a887 2
+ deal of churn; we are better to guarantee that the tdb_errcode is per-thread
+ so the current programming model can be maintained.
+d891 9
+d903 2
+a922 2
\change_inserted 0 1291204847
-a901 2
+a925 2
\change_inserted 0 1291204847
-a905 2
+d930 5
+a934 3
\change_inserted 0 1291204852
-a906 2
-\change_unchanged
-
-a1021 2
+Incomplete.
+a1051 2
\change_inserted 0 1291204881
-a1024 2
+a1054 2
\change_inserted 0 1291204881
-a1028 2
+a1058 2
\change_inserted 0 1291204885
-a1029 2
+a1059 2
\change_unchanged
-a1110 2
+a1140 2
\change_inserted 0 1291204898
-a1113 2
+a1143 2
\change_inserted 0 1291204898
-a1117 2
+a1147 2
\change_inserted 0 1291204901
-a1118 2
+a1148 2
\change_unchanged
-a1194 2
+a1224 2
\change_inserted 0 1291204908
-a1197 2
+a1227 2
\change_inserted 0 1291204908
-a1201 2
+a1231 2
\change_inserted 0 1291204908
-a1202 2
+a1232 2
\change_unchanged
-a1241 2
+a1271 2
\change_inserted 0 1291204917
-a1244 2
+a1274 2
\change_inserted 0 1291204917
-a1248 2
+a1278 2
\change_inserted 0 1291204920
-a1249 2
+a1279 2
\change_unchanged
-a1286 2
+a1316 2
\change_inserted 0 1291204927
-a1289 2
+a1319 2
\change_inserted 0 1291204928
-a1293 2
-
+d1325 1
+a1325 1
\change_inserted 0 1291204942
-a1294 2
-\change_unchanged
-
-a1345 2
+d1327 2
+a1381 2
\change_inserted 0 1291205003
-a1348 2
+a1384 2
\change_inserted 0 1291205004
-a1352 2
+a1388 2
\change_inserted 0 1291205007
-a1375 2
+a1411 2
\change_inserted 0 1291205019
-a1378 2
+a1414 2
\change_inserted 0 1291205019
-a1382 2
+a1418 2
\change_inserted 0 1291205023
-a1383 2
+a1419 2
\change_unchanged
-a1429 2
+a1465 2
\change_inserted 0 1291205029
-a1432 2
+a1468 2
\change_inserted 0 1291205029
-a1436 2
+a1472 2
\change_inserted 0 1291206020
-a1437 2
+a1473 2
\change_unchanged
-a1492 2
+a1528 2
\change_inserted 0 1291205043
-a1495 2
+a1531 2
\change_inserted 0 1291205043
-a1499 2
-
+d1537 1
+a1537 1
\change_inserted 0 1291205057
-a1500 2
-\change_unchanged
-
-a1547 2
+d1539 2
+a1589 2
\change_inserted 0 1291205062
-a1550 2
+a1592 2
\change_inserted 0 1291205062
-a1554 2
+a1596 2
\change_inserted 0 1291205062
-a1555 2
+a1597 2
\change_unchanged
-a1584 2
+a1626 2
\change_inserted 0 1291205072
-a1587 2
+a1629 2
\change_inserted 0 1291205073
-a1591 2
+a1633 2
\change_inserted 0 1291205073
-a1592 2
+a1634 2
\change_unchanged
-a1632 4
+a1674 4
\change_deleted 0 1291204504
\change_unchanged
-a1657 2
+a1699 2
\change_inserted 0 1291205079
-a1660 2
+a1702 2
\change_inserted 0 1291205080
-a1664 2
+a1706 2
\change_inserted 0 1291205080
-a1665 2
+a1707 2
\change_unchanged
-a1791 2
+a1833 2
\change_inserted 0 1291205090
-d1827 2
-a1828 7
+d1869 2
+a1870 7
is to divide the file into zones, and using a free list (or
\change_inserted 0 1291205498
table
set
\change_unchanged
of free lists) for each.
-a1829 2
+a1871 2
\change_inserted 0 1291205203
-a1832 2
+a1874 2
\change_inserted 0 1291205358
-a1848 21
+a1890 21
\change_unchanged
\end_layout
pair of free lists.
\change_unchanged
-d1857 1
-a1857 7
+d1899 1
+a1899 7
Identify the correct
\change_inserted 0 1291205366
free list
zone
\change_unchanged
.
-d1865 2
-a1866 7
+d1907 2
+a1908 7
Re-check the
\change_inserted 0 1291205372
list
zone
\change_unchanged
(we didn't have a lock, sizes could have changed): relock if necessary.
-d1870 1
-a1870 5
+d1912 1
+a1912 5
Place the freed entry in the list
\change_deleted 0 1291205382
for that zone
\change_unchanged
.
-d1879 1
-a1879 15
+d1921 1
+a1921 15
Pick a
\change_deleted 0 1291205403
zone either the zone we last freed into, or based on a
free table; usually the previous one.
\change_unchanged
-a1883 10
+a1925 10
\change_deleted 0 1291205432
\end_layout
Re-check the zone: relock if necessary.
\change_unchanged
-d1892 1
-a1892 7
+d1934 1
+a1934 7
unlock the list and try the next
\change_inserted 0 1291205455
largest list
zone.
\change_inserted 0 1291205457
-a1895 2
+a1937 2
\change_inserted 0 1291205476
-a1896 2
+a1938 2
\change_unchanged
-a1924 2
+a1966 2
\change_inserted 0 1291205542
-a1927 2
+a1969 2
\change_inserted 0 1291205591
-a1929 70
+a1971 70
\change_unchanged
\end_layout
\change_inserted 0 1291205139
-d2176 1
-a2176 5
+d2218 1
+a2218 5
uint32_t
\change_inserted 0 1291205758
used_
\change_unchanged
magic : 16,
-a2180 4
+a2222 4
\change_deleted 0 1291205693
prev_is_free: 1,
\change_unchanged
-d2188 1
-a2188 7
+d2230 1
+a2230 7
top_hash: 1
\change_inserted 0 1291205704
1
0
\change_unchanged
;
-d2212 1
-a2212 9
+d2254 1
+a2254 9
uint
\change_inserted 0 1291205725
64
_t
\change_inserted 0 1291205753
free_magic: 8,
-a2215 2
+a2257 2
\change_inserted 0 1291205746
-a2220 24
+a2262 24
\change_deleted 0 1291205749
free_magic;
\change_unchanged
;
\change_unchanged
-d2224 1
-a2224 7
+d2266 1
+a2266 7
uint64_t
\change_deleted 0 1291205801
prev,
next;
\change_deleted 0 1291205811
-d2228 1
-a2228 3
+d2270 1
+a2270 3
\change_deleted 0 1291205811
...
-d2232 1
-a2232 5
+d2274 1
+a2274 5
\change_deleted 0 1291205808
uint64_t tailer
\change_unchanged
;
-d2241 5
-a2245 16
+d2283 5
+a2287 16
\change_deleted 0 1291205827
We might want to take some bits from the used record's top_hash (and the
free record which has 32 bits of padding to spare anyway) if we use variable
\change_inserted 0 1291205885
Note that by limiting valid offsets to 56 bits, we can pack everything
we need into 3 64-byte words, meaning our minimum record size is 8 bytes.
-a2248 2
+a2290 2
\change_inserted 0 1291205886
-a2252 2
+a2294 2
\change_inserted 0 1291205886
-a2253 2
+a2295 2
\change_unchanged
-a2343 2
+a2385 2
\change_inserted 0 1291205894
-a2346 2
+a2388 2
\change_inserted 0 1291205894
-a2350 2
+a2392 2
\change_inserted 0 1291205902
-a2351 2
+a2393 2
\change_unchanged
-a2373 4
+a2415 4
\change_deleted 0 1291204504
\change_unchanged
-a2403 2
+a2445 2
\change_inserted 0 1291205910
-a2406 2
+a2448 2
\change_inserted 0 1291205910
-a2410 2
+a2452 2
\change_inserted 0 1291205914
-a2411 2
+a2453 2
\change_unchanged
-a2443 2
+a2485 2
\change_inserted 0 1291205919
-a2446 2
+a2488 2
\change_inserted 0 1291205919
-a2450 2
+a2492 2
\change_inserted 0 1291205922
-a2451 2
+a2493 2
\change_unchanged
-a2491 2
+a2533 2
\change_inserted 0 1291205929
-a2494 2
+a2536 2
\change_inserted 0 1291205929
-a2498 2
+a2540 2
\change_inserted 0 1291205929
-a2499 2
+a2541 2
\change_unchanged
-a2536 2
+a2578 2
\change_inserted 0 1291205932
-a2539 2
+a2581 2
\change_inserted 0 1291205933
-a2543 2
+a2585 2
\change_inserted 0 1291205933
-a2544 2
+a2586 2
\change_unchanged
-a2682 2
+a2724 2
\change_inserted 0 1291205944
-a2685 2
+a2727 2
\change_inserted 0 1291205945
-a2689 2
+a2731 2
\change_inserted 0 1291205948
-a2690 2
+a2732 2
\change_unchanged
@