
рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдЬрдм рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдПрдХ рд░реИрдкрд┐рдб
рдЬреИрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрдЯреНрд░реАрдо
рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдорд╛рдирдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рдЖрд╡рдВрдЯрди pthread_mutex / рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рдорд╛рд░рд╛ рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╣рд▓реЗ рдЧрд┐рдпрд░ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдФрд░ рдЙрджрд╛рд╕ рд░реВрдк рд╕реЗ рд╕рд╡рд╛рд░реА рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдЪрд▓реЛ рд╕реНрдХреИрд▓реЗрдмрд▓ рд▓реЙрдХ-рдлреНрд░реА рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдПрдоред рдорд╛рдЗрдХрд▓ред рдЖрдИрдмреАрдПрдо рдереЙрдорд╕ рдЬреЗ рд╡рд╛рдЯрд╕рди рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗрдВрджреНрд░ред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреЛрдб рдЬреЛ рдореБрдЭреЗ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд╡рд╣ рд╕реНрдХреЙрдЯ рд╢реНрдирд╛рдЗрдбрд░ рдФрд░ рдХреНрд░рд┐рд╕реНрдЯреЛрд╕ рдПрдВрдЯреЛрдиреЛрдкреЛрд▓реЛрд╕ рджреНрд╡рд╛рд░рд╛ рдПрд▓рдЬреАрдкреАрдПрд▓ рдХрд╛рдорд░реЗрдбреНрд╕ рдХреЗ рддрд╣рдд рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЪрд▓реЛ рд╢реБрд░реВ рд╕реЗ

рддреЛ - рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд╛рд▓реЗ рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ?
рдЬрд╡рд╛рдм рд╕рддрд╣ рдкрд░ рд╣реИ - рдЖрдкрдХреЛ рд▓реЙрдХ-рдлреНрд░реА рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ - рд▓реЗрдХрд┐рди рдРрд╕реА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдкрд░рдорд╛рдгреБ рдЕрднрд┐рдпрд╛рди рд╣рдорд╛рд░реА рдорджрдж рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВред рд╡реЗ рдЬреЛ рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдП рдЧрдПCompareExchange рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ - рдЬрд┐рд╕ рдЕрдзрд┐рдХрддрдо рдкрд░ рд╣рдо рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд▓рдВрдмрд╛ рд╣реИ, рдпрд╣ __int64 рд╣реИред рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдФрд░ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ - рдПрдХ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред
рдкрддрд╛ рдЖрдХрд╛рд░ рдХреЛ 46 рдмрд┐рдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдХреЗ, рд╣рдо 64 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдРрдб-рдСрди рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
#pragma pack(1) typedef struct { volatile unsigned __int64 top:46, ocount:18; } top_aba_t;
рд╡реИрд╕реЗ, 8/16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП - рд╣рдо 2 рд╕реЗ 46 рдбрд┐рдЧреНрд░реА рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ред рдорд╛рдирдХ рд╡рд┐рдзрд┐ - рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрддрд╛ рд╡рд┐рд╖рдо рдФрд░ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПредрдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд - рдХреЛрдб рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рд╣реИ, рдПрдХ рдорд╛рдирдХ рдлреБрдЯрдХреНрд▓реЙрде
desc->Next = queue_head; queue_head = desc;
рдРрд╕реЗ рдкрд╛рд╕реНрддрд╛ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
descriptor_queue old_queue, new_queue; do { old_queue = queue_head; desc->Next = (descriptor*)old_queue.DescAvail; new_queue.DescAvail = (unsigned __int64)desc; new_queue.tag = old_queue.tag + 1; } while (!compare_and_swap64k(queue_head, old_queue, new_queue));
рдЬреЛ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрдо рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИрдВред
рд▓реЙрдХ-рдлреНрд░реА FIFO рдХрддрд╛рд░

рдЪреВрдВрдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕реВрдЪрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реВрдЪреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ - рд╕рдВрд░реЗрдЦрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣
typedef struct { unsigned __int64 _pad0[8]; top_aba_t both; unsigned __int64 _pad1[8]; } lf_fifo_queue_t;
рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯреЗрдВ рдХрд╛рдо

рдЕрдм рдЖрдЗрдП рдХреБрдЫ рд╕рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реЛ рд╕рдХреЗ (Win32 рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
Win32 рдХреЗ рд▓рд┐рдП рдПрдЯрдо рд░реИрдк #define fetch_and_store(address, value) InterlockedExchange((PLONG)(address), (value)) #define atmc_add(address, value) InterlockedExchangeAdd((PLONG)(address), (value)) #define compare_and_swap32(address, old_value, new_value) \ (InterlockedCompareExchange(\ (PLONG)(address), (new_value), (old_value))\ == (old_value)) #define compare_and_swap64(address, old_value, new_value) \ (InterlockedCompareExchange64(\ (PLONGLONG)(address), (__int64)(new_value), (__int64)(old_value)) \ == (__int64)(old_value)) #define compare_and_swap_ptr(address, old_value, new_value) \ (InterlockedCompareExchangePointer((address), \ (new_value), (old_value)) \ == (old_value))
рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рддрд╛рдХрд┐ __int64 рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рди рд╣реЛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреЗрдд рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
#define compare_and_swap64k(a,b,c) \ compare_and_swap64((volatile unsigned __int64*)&(a), \ *((unsigned __int64*)&(b)), \ *((unsigned __int64*)&(c)))
рдФрд░ рдЕрдм рд╣рдо рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ (рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

static inline int lf_fifo_enqueue(lf_fifo_queue_t *queue, void *element) { top_aba_t old_top; top_aba_t new_top; for(;;) { old_top.ocount = queue->both.ocount; old_top.top = queue->both.top; ((queue_elem_t *)element)->next = (queue_elem_t *)old_top.top; new_top.top = (unsigned __int64)element; new_top.ocount += 1; if (compare_and_swap64k(queue->both, old_top, new_top)) return 0; } }
рдореБрдЭреЗ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдПрдХ рд▓реВрдк рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд░рд╛рд╕реНрддрд╛ рд╣реИ - рд╣рдордиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреБрд░рд╛рдиреЗ рдХреЗ рдКрдкрд░ рдПрдХ рдирдпрд╛ рдорд╛рди рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА рд╕рдордп рдХрд┐рд╕реА рдФрд░ рдиреЗ рдкреБрд░рд╛рдиреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдмрджрд▓рд╛ - рддреЛ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕рдм рдХреБрдЫ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдФрд░ рдХреНрд╖рдг - рд╣рдорд╛рд░реЗ рдорд╣рд╛рд╕рд╛рдЧрд░ рдореЗрдВ рд╣рдо рдЙрд╕ рдкреНрд░рдпрд╛рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕рдлрд▓ рд╣реБрдПред рдПрдХ рддрд┐рдкрд╣рд┐рдпрд╛, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдпрд╛рд╕ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп 64 рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЫрд╛рдпрд╛рд╡рд╛рдж рдкрд░ рд╣реИ рдХрд┐ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ FIFO рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рдирд┐рд╖реНрдХрд╛рд╕рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Lf_fifo_dequeue рдХреЗ рд╕рдорд╛рди static inline void *lf_fifo_dequeue(lf_fifo_queue_t *queue) { top_aba_t head; top_aba_t next; for(;;) { head.top = queue->both.top; head.ocount = queue->both.ocount; if (head.top == 0) return NULL; next.top = (unsigned __int64)(((struct queue_elem_t *)head.top)->next); next.ocount += 1; if (compare_and_swap64k(queue->both, head, next)) return ((void *)head.top); } }
рдпрд╣рд╛рдВ рд╣рдо рдареАрдХ рдЙрд╕реА рдЪреАрдЬ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ - рдЬрд┐рд╕ рдЪрдХреНрд░ рдореЗрдВ рд╣рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдкреБрд░рд╛рдирд╛ рдореВрд▓реНрдп рдЕрднреА рднреА рд╕рд╣реА рд╣реЛ - рдпрд╣ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ - рд╣рдо рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ рддреБрдЪреНрдЫ рдмрдирд╛рдирд╛ - рдпрд╣рд╛рдБ рд╣реИ:
lf_fifo_queue_init static inline void lf_fifo_queue_init(lf_fifo_queue_t *queue) { queue->both.top = 0; queue->both.ocount = 0; }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рд╡рд┐рдЪрд╛рд░

рдЕрдм рд╣рдо рд╕реАрдзреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рд▓рд┐рдП, рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рдмрдбрд╝реЗ (рд╕реАрдзреЗ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛), рдФрд░ рдЫреЛрдЯрд╛, рдХрдИ рджреНрд╡рд╛рд░рд╛ рдкреАрдЯрд╛ рдЧрдпрд╛, 8 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ 2 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рддрдХ рдЖрдХрд╛рд░ рдореЗрдВ рдХрдИ рдЫреЛрдЯреЗ рдЙрдкрд╡рд░реНрдЧред
рдШреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрджрдо рд╣рдореЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдкрд╣рд▓реЗ - рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЗ рд╕реБрдкрд░рдлрд╛рд╕реНрдЯ рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛрдВрдЧреЗ, рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╡реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ - рд╡реЗ рдПрдХ рдмрдбрд╝реА рд╕реВрдЪреА рдореЗрдВ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓реЗрдВрдЧреЗред рдФрд░ рд╕реНрдореГрддрд┐ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдЕрдВрдбрд░рдлреБрдЯ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд┐рдЦрдВрдбрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрд╡рд░реНрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рд╕рднреА рдмреНрд▓реЙрдХ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдФрд░ рдПрдХ рдкрд▓! рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЪрдпрди рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВрдЧреЗ (рд▓реЗрдХрд┐рди рд░рд┐рд▓реАрдЬ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рджреЛ рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдкрддреНрдерд░ рд╕реЗ рдорд╛рд░ рджреЗрдВрдЧреЗ - рдЖрд╡рдВрдЯрди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рд░рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рджреНрд╡реАрдк - рдлрд┐рд░ рд╕реЗ рдорд┐рд╢реНрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:

рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣рдо 4 рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ
- рд╕рдХреНрд░рд┐рдп рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдореЗрдВ 5 рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ 4 рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
- рдФрд░ рдЕрдм рд╣рдордиреЗ рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдХреНрд░реЗрдбрд┐рдЯ рджреЗрдЦреЗрдВ)
- рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмреНрд▓реЙрдХ рдирдВрдмрд░ 5 рдЬрд╛рд░реА рдХрд┐рдпрд╛
- рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ (рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛)
рд╣рдо рд╣рд┐рдк рдФрд░ рдмреНрд▓реЙрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ

рджреЗрд╡реА рдХреЛ рдкреНрд░рдгрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдЯреЗрдХреНрдиреЛ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
рдмрд╛рд▓рдирд╛рдпрд╡рд╛рдж рдПрдХ рд▓рд╛ GRANULARITY рдФрд░ PAGE_SIZE struct Descriptor; typedef struct Descriptor descriptor; struct Procheap; typedef struct Procheap procheap; #define TYPE_SIZE sizeof(void*) #define PTR_SIZE sizeof(void*) #define HEADER_SIZE (TYPE_SIZE + PTR_SIZE) #define LARGE 0 #define SMALL 1 #define PAGESIZE 4096 #define SBSIZE (16 * PAGESIZE) #define DESCSBSIZE (1024 * sizeof(descriptor)) #define ACTIVE 0 #define FULL 1 #define PARTIAL 2 #define EMPTY 3 #define MAXCREDITS 64
рдФрд░ рдЪрд▓реЛ рд░рдЪрдирд╛рддреНрдордХ рд╣реЛ рдЬрд╛рдПрдВ, рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕реЗ рдХреВрд▓реНрд╣реЗ рд╣реЛрдВрдЧреЗ - рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рд╛рдБ рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧреЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖред рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ рд╣реЛрдВрдЧреЗ - рд╕рдХреНрд░рд┐рдп рд╕реВрдЪреА рдФрд░ рдПрдХ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рддред
рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ - рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХреНрдпреЛрдВ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдореБрдЦреНрдп рдмрд╛рдд рд╣реИ - рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреА рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд╣реИ - рд▓рд╛рдЦреЛрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рд╕реВрдЪреА рдирд░рдХ рдФрд░ рдЗрд╕рд░рд╛рдЗрд▓ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП, 8/16 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реВрдЪреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЛ рджреЛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕рдВрдХреЗрдд рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрдпрд╛ рдпрд╣ рд▓рд╛рднрджрд╛рдпрдХ рд╣реИ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдирд╣реАрдВ! рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди 500 (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ (рд╕реНрдЯреНрд░рд╛рдЗрдк) рдореЗрдВ рд╣рдорд╛рд░реА рд╕реВрдЪреА рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░реЗрдВред рдФрд░ рд╣рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рдореВрд╣реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рдХрд┐рдлрд╛рдпрддреА, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ, рдЖрдк рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рдХреЗ рдЧреИрд░-рдорд╛рдирдХ рдЖрд╡рдВрдЯрди рдореЗрдВ рд╕рднреА рдкреНрд░рд╢реНрдиред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╕рднреА рдЕрдЧрд▓рд╛ рдХреЗрд╡рд▓ рд╕рд░рдгреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдкрдЯреНрдЯреА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрдЯреНрдЯреА рдореЗрдВ рдЕрдВрддрд┐рдо рдЕрдЧрд▓рд╛ рдЕрдЧрд▓реА рдкрдЯреНрдЯреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЙрд╕реА рддрд░рд╣ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рднреА - рд╕рдХреНрд░рд┐рдп рдПрди рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдореЗрдореЛрд░реА рдХреЗ рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рд╕рдХреНрд░рд┐рдп рдкрдЯреНрдЯреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдлрдЖрдИрдПрдлрдУ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореЗрдореЛрд░реА рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдкрдЯреНрдЯреА рдореЗрдВ рдЬрдЧрд╣ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдХреНрд▓рд╛рд╕рд┐рдХ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рд╡рд╣рд╛рдБ рди рддреЛ рд╣реИ рдпрд╛ рд╡рд╣рд╛рдБ - рдЙрддреНрдХреГрд╖реНрдЯ, рд╣рдо рдПрдХ рдирдИ рдкрдЯреНрдЯреА рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ред
рджреВрд╕рд░рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ "рдмреИрдВрдбрд┐рдВрдЧ" рд╕реЗ рдХреБрдЫ рдореЗрдореЛрд░реА рдЦрддреНрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 64K рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдк рдЖрд╡рдВрдЯрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдХреЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдлрд┐рд░ рднреА, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдХреНрд░рд┐рдп рдзрд╛рд░рд┐рдпрд╛рдВ рд╣реИрдВ, рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдФрд░ рдмрдврд╝рд╛ рджреЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЧрддрд┐ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓рд╛рдн рджреЗрдЧрд╛ред
рдпрд╣рд╛рдБ рдХреВрд▓реНрд╣реЗ рд╣реА рд╣реИ
struct Procheap { volatile active Active;
рдФрд░ рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдЬрд░реВрд░рдд рд╣реИ:
рдпрд╣ рд╕рдХреНрд░рд┐рдп / рдЖрдВрд╢рд┐рдХ рдХреНрдпрд╛ рд╣реИ? typedef struct { unsigned __int64 ptr:58, credits:6; } active; typedef struct { unsigned __int64 DescAvail:46, tag:18; } descriptor_queue; typedef struct { unsigned __int64 avail:24,count:24, state:2, tag:14; } anchor; typedef struct { lf_fifo_queue_t Partial;
рдФрд░ рд╡рд┐рд╡рд░рдгрдХ рд╣реА рд╣рдорд╛рд░реЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИред
struct Descriptor { struct queue_elem_t lf_fifo_queue_padding; volatile anchor Anchor;
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ - рдЕрд▓реМрдХрд┐рдХ рдХреБрдЫ рднреА рдирд╣реАрдВред рд╣рдореЗрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рдвреЗрд░ рдФрд░ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рдХреЛ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ

рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдЪрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдвреЗрд░, рдЖрдХрд╛рд░, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рдмрд┐рдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ sizeclass sizeclasses[2048 / GRANULARITY] = { {LF_FIFO_QUEUE_STATIC_INIT, 8, SBSIZE}, {LF_FIFO_QUEUE_STATIC_INIT, 16, SBSIZE}, ... {LF_FIFO_QUEUE_STATIC_INIT, 2024, SBSIZE}, {LF_FIFO_QUEUE_STATIC_INIT, 2032, SBSIZE}, {LF_FIFO_QUEUE_STATIC_INIT, 2040, SBSIZE}, {LF_FIFO_QUEUE_STATIC_INIT, 2048, SBSIZE}, }; #define LF_FIFO_QUEUE_STATIC_INIT {{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}} __declspec(thread) procheap* heaps[2048 / GRANULARITY];
рдпрд╣рд╛рдВ рд╣рдо рд╡рд╣ рд╕рдм рдХреБрдЫ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛:
__declspec(thread) procheap* heaps[2048 / GRANULARITY];
рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░рддрд┐ рдереНрд░реЗрдб рд╣рд┐рдк рд╣реИред рдФрд░ - рд╕рднреА рдкреНрд░рддрд┐-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред
рдорд▓реНрд▓реЛрдХ - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЕрд░реНрдерд╛рддреН:
- рдпрджрд┐ рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдХрд╛рд░ рдореЗрдВ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреВрд▓реНрд╣реЗ рдирд╣реАрдВ рд╣реИрдВ - рдмрд╕ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреВрдЫреЗрдВ
- рд╣рдо рдмрджрд▓реЗ рдореЗрдВ рдореЗрдореЛрд░реА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ - рдкрд╣рд▓реЗ рд╕рдХреНрд░рд┐рдп рд╕реВрдЪреА рд╕реЗ, рдлрд┐рд░ рдЯреБрдХрдбрд╝реЗ рдХреА рд╕реВрдЪреА рд╕реЗ, рдФрд░ рдЕрдВрдд рдореЗрдВ - рд╣рдо рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ рдирдП рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдореЗрдореЛрд░реА рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдореЗрдВ рдмрд╕ рд▓реВрдк рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред
void* my_malloc(size_t sz) { procheap *heap; void* addr;
рд╣рдо рд╡рд┐рд╖рдп рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ - рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рдЬреЛрдбрд╝рдХрд░ред
MallocFromNewSB static void* MallocFromNewSB(procheap* heap) { descriptor* desc; void* addr; active newactive, oldactive; *((unsigned __int64*)&oldactive) = 0; desc = DescAlloc(); desc->sb = AllocNewSB(heap->sc->sbsize, SBSIZE); desc->heap = heap; desc->Anchor.avail = 1; desc->sz = heap->sc->sz; desc->maxcount = heap->sc->sbsize / desc->sz;
рдХреЛрдИ рдЪрдорддреНрдХрд╛рд░ рдирд╣реАрдВ - рдмрд╕ рдПрдХ рд╕реБрдкрд░рдмреНрд▓реЙрдХ, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдирд╛рдирд╛ рдФрд░ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ред рдФрд░ рд╕рдХреНрд░рд┐рдп рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝рдирд╛ред рдпрд╣рд╛рдВ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд▓реВрдк рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рд╛, рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдЗрд╕реЗ рдбрд╛рд▓рд╛ рдФрд░ рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЕрдм рд╕рдХреНрд░рд┐рдп рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рдПрдХ рдмреНрд▓реЙрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ - рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдХреИрд╕реЗ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПред
MallocFromActive static void* MallocFromActive(procheap *heap) { active newactive, oldactive; descriptor* desc; anchor oldanchor, newanchor; void* addr; unsigned __int64 morecredits = 0; unsigned long next = 0;
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реНрд╡рдпрдВ рд╕рд░рд▓ рд╣реИ, рдХреЗрд╡рд▓ рд▓реЗрдЦрди рдХрд╛ рдмреЛрдЭрд┐рд▓ рд░реВрдк рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЧрд░ рдХреБрдЫ рд▓реЗрдирд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реБрдкрд░рдмреНрд▓реЙрдХ рд╕реЗ рдПрдХ рдирдпрд╛ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЛ рдиреЛрдЯ рдХрд░рддреЗ рд╣реИрдВред рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдордиреЗ рдЖрдЦрд┐рд░реА рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдпрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рдПрдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЕрдЧрд░ рдпрд╣ рдЕрдЪрд╛рдирдХ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╣рдордиреЗ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рд╕реЗ рдЖрдЦрд┐рд░реА рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдпрд╛, рддреЛ рд╣рдорд╛рд░реЗ рдмрд╛рдж рдЕрдЧрд▓рд╛ рдЕрдиреБрд░реЛрдз рдПрдХ рдирдП рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрдереНрдп рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рдореЗрдВ рд╕рд┐рд░реНрдл рдЪрдпрдирд┐рдд рдЯреБрдХрдбрд╝рд╛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред
UpdateActive static void UpdateActive(procheap* heap, descriptor* desc, unsigned __int64 morecredits) { active oldactive, newactive; anchor oldanchor, newanchor; *((unsigned __int64*)&oldactive) = 0; newactive.ptr = (__int64)desc; newactive.credits = morecredits - 1; if (compare_and_swap64k(heap->Active, oldactive, newactive)) return;
рдЗрд╕ рдирд┐рдмрдВрдз рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реИрдВрдбрд▓ рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВред рдкрд░ рдХрд╣рд╛рдБ? рджрд░рдЕрд╕рд▓, рдЕрдЧрд░ рдХреЛрдИ рднреВрд▓ рдЧрдпрд╛ - рд╣рдо рд╕рд┐рд░реНрдл рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдорд╛рдиреНрдп рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕ - рдпрд╣ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдордЬрд╛рдХ pkunzip.zip рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдорд╛рди рд╣реИ - рд╣рдо рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╡рд╛рд▓реЗ рдПрдХ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рд╕рд░рдгреА рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛрддреА рд╣реИ, рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдорд░реНрдЬ рдХрд░реЗрдВред
DescAlloc static descriptor* DescAlloc() { descriptor_queue old_queue, new_queue; descriptor* desc; for(;;) { old_queue = queue_head; if (old_queue.DescAvail) { new_queue.DescAvail = (unsigned __int64)((descriptor*)old_queue.DescAvail)->Next; new_queue.tag = old_queue.tag + 1; if (compare_and_swap64k(queue_head, old_queue, new_queue)) { desc = (descriptor*)old_queue.DescAvail; break; } } else { desc = AllocNewSB(DESCSBSIZE, sizeof(descriptor)); organize_desc_list((void *)desc, DESCSBSIZE / sizeof(descriptor), sizeof(descriptor)); new_queue.DescAvail = (unsigned long)desc->Next; new_queue.tag = old_queue.tag + 1; if (compare_and_swap64k(queue_head, old_queue, new_queue)) break; munmap((void*)desc, DESCSBSIZE); } } return desc; }
рдЦреИрд░, рдЕрдм рдмрд╛рдд рдХрдо рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЯреЛрдиреЗ-рдЯреЛрдЯрдХреЗ рдХреА рдирд╣реАрдВ рд╣реИ - рд╣рдореЗрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдирд╛ рднреА рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЙрд╕реА рдПрдлрдЖрдИрдПрдлрдУ рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗ - рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЧрд▓рддреА рд╕реЗ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рд╣реА рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдпрд╣ рддрдереНрдп рддреБрд░рдВрдд рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдЬреНрдпрд╛рджрд╛ рд╕рд░рд▓ рд╣реИ
DescRetire void DescRetire(descriptor* desc) { descriptor_queue old_queue, new_queue; do { old_queue = queue_head; desc->Next = (descriptor*)old_queue.DescAvail; new_queue.DescAvail = (unsigned __int64)desc; new_queue.tag = old_queue.tag + 1; } while (!compare_and_swap64k(queue_head, old_queue, new_queue)); }
рд╕рд╣рд╛рдпрдХреЛрдВ

рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рднреА рджреЗрддреЗ рд╣реИрдВ, рдЖрджрд┐ рдХрд╛рд░реНрдп рдЗрддрдиреЗ рд╕реНрд╡-рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИред
organize_list static void organize_list(void* start, unsigned long count, unsigned long stride) { char* ptr; unsigned long i; ptr = (char*)start; for (i = 1; i < count - 1; i++) { ptr += stride; *((unsigned long*)ptr) = i + 1; } }
organize_desc_list static void organize_desc_list(descriptor* start, unsigned long count, unsigned long stride) { char* ptr; unsigned int i; start->Next = (descriptor*)(start + stride); ptr = (char*)start; for (i = 1; i < count - 1; i++) { ptr += stride; ((descriptor*)ptr)->Next = (descriptor*)((char*)ptr + stride); } ptr += stride; ((descriptor*)ptr)->Next = NULL; }
mask_credits static descriptor* mask_credits(active oldactive) { return (descriptor*)oldactive.ptr; }
рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдмрд╕ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
static void* AllocNewSB(size_t size, unsigned long alignement) { return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); }
рдЙрд╕реА рддрд░рд╣, рд╣рдо рдмреНрд▓реЙрдХ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдХрд░рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
alloc_large_block static void* alloc_large_block(size_t sz) { void* addr = VirtualAlloc(NULL, sz + HEADER_SIZE, MEM_COMMIT, PAGE_READWRITE);
рдФрд░ рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реАрдк рдХреА рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЦреЛрдЬ рд╣реИ (рдпрджрд┐ рдЖрдХрд╛рд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рддреЛ bkb рд╢реВрдиреНрдп):
find_heap static procheap* find_heap(size_t sz) { procheap* heap;
рдФрд░ рдпрд╣рд╛рдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реИрдкрд░ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рд╕реНрддрд╛ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рдорд╛рдгреБрдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрд╛рд░рд╣ рдЪрдХреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдФрд░ рдПрдХ yt рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрд╡реИрдк рдХрд░рдирд╛ рд╣реИ
ListGetPartial static descriptor* ListGetPartial(sizeclass* sc) { return (descriptor*)lf_fifo_dequeue(&sc->Partial); }
ListPutPartial static void ListPutPartial(descriptor* desc) { lf_fifo_enqueue(&desc->heap->sc->Partial, (void*)desc); }
рд╣рдЯрд╛рдП рдЧрдП рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╕реВрдЪреА рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд:
ListRemoveEmptyDesc static void ListRemoveEmptyDesc(sizeclass* sc) { descriptor *desc; lf_fifo_queue_t temp = LF_FIFO_QUEUE_STATIC_INIT; while (desc = (descriptor *)lf_fifo_dequeue(&sc->Partial)) { lf_fifo_enqueue(&temp, (void *)desc); if (desc->sb == NULL) DescRetire(desc); else break; } while (desc = (descriptor *)lf_fifo_dequeue(&temp)) lf_fifo_enqueue(&sc->Partial, (void *)desc); }
рдФрд░ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рд░реИрдкрд░
RemoveEmptyDesc static void RemoveEmptyDesc(procheap* heap, descriptor* desc) { if (compare_and_swap_ptr(&heap->Partial, desc, NULL)) DescRetire(desc); else ListRemoveEmptyDesc(heap->sc); }
HeapGetPartial static descriptor* HeapGetPartial(procheap* heap) { descriptor* desc; do { desc = *((descriptor**)&heap->Partial);
HeapPutPartial static void HeapPutPartial(descriptor* desc) { descriptor* prev; do { prev = (descriptor*)desc->heap->Partial;
рдЕрдВрддрд┐рдо рдЭрдЯрдХрд╛ - рдЖрд╡рдВрдЯрд┐рдд / рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░!

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЛ рд╕реНрдЯреНрд░рд┐рдк рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЕрдкрдиреА рд╕реВрдЪреА рдкрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╕рд╛рде рд╣реА рдЦрд╛рд▓реА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ), рдФрд░ рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
MallocFromPartial static void* MallocFromPartial(procheap* heap) { descriptor* desc; anchor oldanchor, newanchor; unsigned __int64 morecredits; void* addr; retry: desc = HeapGetPartial(heap); if (!desc) return NULL; desc->heap = heap; do {
рдЕрдм рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдореЗрдореЛрд░реА рдХреЛ рд╡рд╛рдкрд╕ рд╕реВрдЪреА рдореЗрдВ рдХреИрд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╢рд╛рд╕реНрддреНрд░реАрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо: рд╣рдо рдЕрдкрдиреЗ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдВрдХрд░ - рд╣рдореЗрдВ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреА рдЬрдЧрд╣ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдореБрдлреНрдд рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдЕрднреА рднреА рдмреАрдпрд░ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВред рдФрд░ рд╣рд╛рдВ, рдХреБрдЫ рдЬреЛрдбрд╝реЗ - рдЪрд╛рд╣реЗ рд╣рдореЗрдВ рдкреВрд░реЗ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЖрдЦрд┐рд░реА рд╣реИ рдЬрд┐рд╕реЗ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
void my_free(void* ptr) { descriptor* desc; void* sb; anchor oldanchor, newanchor; procheap* heap = NULL; if (!ptr) return;
рдЖрдкрдХреЛ рдХреНрдпрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореБрдХреНрдд рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рдЪреЗрдХ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ - рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдЯреБрдХрдбрд╝рд╛ рд╕рдХреНрд░рд┐рдп рдкрдЯреНрдЯреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкрддрд┐рдд рдорд╛рдорд▓реЗ рдХреА рджрдХреНрд╖рддрд╛ рдмрдврд╝ рдЬрд╛рдПрдЧреА "рд▓реВрдк рдореЗрдВ рдЪрдпрди рдФрд░ рдирд┐: рд╢реБрд▓реНрдХ"ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдмреЗрд╣рдж рдЙрдмрд╛рдК рдФрд░ рд▓рдВрдмреЗ рдХрд╛рдо рдореЗрдВ, рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдЖрдк рд▓реЙрдХ-рдлрд╝рд┐рдлрд╝реЛ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕реАрдЦрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдПрдЯрдорд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░рдХреАрдмреЗрдВ рд╕реАрдЦреАрдВред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕рдореВрд╣ рд╕реВрдЪреА рдХреА рдХреНрд╖рдорддрд╛ рди рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАредрдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА
- рд╕реНрдХреЗрд▓реЗрдмрд▓ рд▓реЙрдХ-рдлреНрд░реА рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди
- рдмреЛрд░реНрдб рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛
- рд╕реНрдХреЗрд▓реЗрдмрд▓ рд▓реЛрдХрд▓рд┐рдЯреА-рдХреЙрдиреНрд╢рд┐рдпрд╕ рдорд▓реНрд▓рд┐рдереНрд░реЗрдбреЗрдб рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди
рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреА рдЧрддрд┐ (рдЪрд┐рддреНрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ [3]ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рд╛рджрдЧреА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдирдореВрдиреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХрдИ рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдПред рдЕрдкрдбреЗрдЯ: рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХрд┐рдбрд╛рдиреЛрд╡рдПрд▓реЗрдХреНрд╕ рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж : рдпрд╣ рд▓реЗрдЦ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдСрдХрд╛рдЙрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдЯреИрдЧреЗрдб рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реЛрддрд╛, рддреЛ рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ (рдЬрд┐рд╕реЗ ABA рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП, рд▓реЗрдЦ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЛ top_aba_t рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ): рдкреЙрдк рдСрдкрд░реЗрд╢рди рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдиреЗ рджреЗрдВ:

do { long snapshot = stack->head; long next = snapshot->next; } while (!cas(&stack->head, next, snapshot));
рдЕрд╕рд▓ рдореЗрдВ, рд▓реЗрдЦ рдореЗрдВ deque рдХреЛрдб рдмрд╕ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдХрд╛рдЙрдВрдЯ рдХреЗ рд╕рд╛рдеред рдЕрдм рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдвреЗрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рддрддреНрд╡ рдП рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдПрдХ рддрддреНрд╡ рдмреА (рд╕реНрдЯреИрдХ рдП -> рдмреА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ)ред рд╣рдордиреЗ рд╕реНрдиреИрдкрд╢реЙрдЯ = рдП, рдиреЗрдХреНрд╕реНрдЯ = рдмреА рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ред рдЙрд╕ рдкрд▓ рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рдереНрд░реЗрдб рдиреЗ рдП рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдлрд┐рд░ рдП рддрддреНрд╡ рдХреЛ рдбрд╛рд▓рд╛ рдФрд░ рдП рдХреЛ рд╡рд╛рдкрд╕ рдбрд╛рд▓рд╛ред рдЕрдм рд╕реНрдЯреИрдХ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:рдП -> рд╕реА -> рдмреАрдкреЙрдк рдСрдкрд░реЗрд╢рди рдЬрд╛рдЧ рдЙрдарддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХреИрд╕ рдореЗрдВ рдЖрдЧ рд▓рдЧ рдЬрд╛рддреА рд╣реИред (рд╕реНрдЯреИрдХ-> рд╣реЗрдб == рд╕реНрдиреИрдкрд╢реЙрдЯ, рд╡реЗ рджреЛрдиреЛрдВ рдП рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ), рдФрд░ рд╕реНрдЯреИрдХ-> рд╣реЗрдб рдХреЗ рд╕рд╛рде рдмреАред рд╕реА рддрддреНрд╡ рдЦреЛ рдЬрд╛рддрд╛ рд╣реИредрдпрд╣ рдСрдХрд╛рдЙрдВрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рддрд╛рдЬрд╛ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдП рдЕрд▓рдЧ рдСрдЙрдЯрдлрд┐рдЯ рд╣реЛрдЧрд╛, рдФрд░ рдХреИрд╕ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛редрд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд╣реА рдмрдЪрдд рд╣реЛрддреА рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЬрдм рд╣рдо рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ A 2 ^ 18 рдмрд╛рд░ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ ocount рдЙрд╕реА рдорд╛рди рдХреЛ рдорд╛рди рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ ABA рд╕рдорд╕реНрдпрд╛ рдлрд┐рд░ рд╕реЗ рд╣реЛрдЧреАредрдЖрдзреБрдирд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рднреА рд╕реВрдЪрдХ рдХреЛ 48 рдмрд┐рдЯреНрд╕ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджреЛ 64-рдмрд┐рдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓рд╛ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдиреАрдЪреЗ, рджреВрд╕рд░рд╛ рдЕрдВрдбрд░ рдСрдХрд╛рдЙрдВрдЯ (рддрддреНрд╡ рдП рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЗ рд╕рд╛рде рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рдХрдИ рдмрд╛рд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдбрдмрд▓ рдХреИрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред