Счетчик ссылок для ПЕРЕКРЫТОЙ структуры

Я нашел статью, которую нахожу довольно интересной. Есть только одна вещь, которую я не могу обернуть вокруг себя.
(http://molecularmusings.wordpress.com/2011/08/31/file-system-part-1-platform-specific-api-design/)
Автор описывает класс File, который способен обрабатывать синхронные и асинхронные файловые операции. Для асинхронной операции он использует автономный объект, который самостоятельно отслеживает асинхронную операцию.
Класс выглядит так:

class OsAsyncFileOperation
{
public:
OsAsyncFileOperation(HANDLE file, size_t position);
OsAsyncFileOperation(const OsAsyncFileOperation& other);
OsAsyncFileOperation& operator=(const OsAsyncFileOperation& other);
~OsAsyncFileOperation(void);

/// Returns whether or not the asynchronous operation has finished
bool HasFinished(void) const;

/// Waits until the asynchronous operation has finished. Returns the number of transferred bytes.
size_t WaitUntilFinished(void) const;

/// Cancels the asynchronous operation
void Cancel(void);

private:
HANDLE m_file;
ReferenceCountedItem<OVERLAPPED>* m_overlapped;
};

И используется так:

OsAsyncFileOperation ReadAsync(void* buffer, size_t length, size_t position);

Теперь мне интересно: какова роль ReferenceCountedItem<OVERLAPPED>* m_overlapped; переменная? Я знаю, что это как-то подсчитывает ссылки, но я не уверен, как это используется здесь, тем более что конструктор не проходит OVERLAPPED состав. Как этот класс сейчас о OVERLAPPED структура, используемая в ReadAsync или же WriteAsync метод?
Я пытался реализовать ReferenceCountedItem класс, так как он не указан в статье:

#pragma once

template <typename T>
class ReferenceCountedItem {

public:
ReferenceCountedItem(T* data) :m_data(data), m_refCounter(1)
{}

~ReferenceCountedItem() {}

int addReference()
{
return ++this->m_refCounter;
}

int removeReference()
{
return --this->m_refCounter;
}

private:
T* m_data;
int m_refCounter;
};

Я в основном не уверен, как все это склеивается. Может быть, кто-то может объяснить немного больше об этом. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

0

Решение

Где-то автор размещает структуру OVERLAPPED в куче, new или же GlobalAlloc, Затем в конструкторе копирования и operator=он копирует указатель. Поскольку указатель может быть несколько объектов, он использует подсчет ссылок, чтобы узнать, когда можно удалить указатель OVERLAPPED.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]