Skip to content

Commit

Permalink
Move m_index from {ExternalThreadEvent,Sleep}WaitHandle to the union …
Browse files Browse the repository at this point in the history
…in WaitHandle

Summary: This reduces sizeof(c_{ExternalThreadEvent,Sleep}WaitHandle) by 16
bytes (not used heavily so no impact) and makes it easier to use
the same pattern for queue registration by c_AsyncFunctionWaitHandle.

Reviewed By: @jdelong

Differential Revision: D1358778
  • Loading branch information
jano authored and JoelMarcey committed Jun 2, 2014
1 parent f5445e1 commit 2a4a27d
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 23 deletions.
10 changes: 5 additions & 5 deletions hphp/runtime/ext/asio/asio_context-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ uint32_t AsioContext::registerTo(smart::vector<TWaitHandle*>& vec,

template <class TWaitHandle>
void AsioContext::unregisterFrom(smart::vector<TWaitHandle*>& vec,
uint32_t ev_idx) {
assert(ev_idx < vec.size());
if (ev_idx != vec.size() - 1) {
vec[ev_idx] = vec.back();
vec[ev_idx]->setIndex(ev_idx);
uint32_t idx) {
assert(idx < vec.size());
if (idx != vec.size() - 1) {
vec[idx] = vec.back();
vec[idx]->setContextVectorIndex(idx);
}
vec.pop_back();
}
Expand Down
2 changes: 1 addition & 1 deletion hphp/runtime/ext/asio/asio_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class AsioContext {
uint32_t registerTo(smart::vector<TWaitHandle*>& vec, TWaitHandle* wh);

template <class TWaitHandle>
void unregisterFrom(smart::vector<TWaitHandle*>& vec, uint32_t ev_idx);
void unregisterFrom(smart::vector<TWaitHandle*>& vec, uint32_t idx);

smart::vector<c_SleepWaitHandle*>& getSleepEvents() {
return m_sleepEvents;
Expand Down
4 changes: 2 additions & 2 deletions hphp/runtime/ext/asio/external_thread_event_wait_handle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,12 +171,12 @@ void c_ExternalThreadEventWaitHandle::exitContext(context_idx_t ctx_idx) {

void c_ExternalThreadEventWaitHandle::registerToContext() {
AsioContext *ctx = getContext();
m_index = ctx->registerTo(ctx->getExternalThreadEvents(), this);
m_ctxVecIndex = ctx->registerTo(ctx->getExternalThreadEvents(), this);
}

void c_ExternalThreadEventWaitHandle::unregisterFromContext() {
AsioContext *ctx = getContext();
ctx->unregisterFrom(ctx->getExternalThreadEvents(), m_index);
ctx->unregisterFrom(ctx->getExternalThreadEvents(), m_ctxVecIndex);
}

///////////////////////////////////////////////////////////////////////////////
Expand Down
5 changes: 0 additions & 5 deletions hphp/runtime/ext/asio/external_thread_event_wait_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ class c_ExternalThreadEventWaitHandle
m_nextToProcess = next;
}
ObjectData* getPrivData() { return m_privData.get(); }
void setIndex(uint32_t ete_idx) {
assert(getState() == STATE_WAITING);
m_index = ete_idx;
}

void abandon(bool sweeping);
void process();
Expand All @@ -79,7 +75,6 @@ class c_ExternalThreadEventWaitHandle
c_ExternalThreadEventWaitHandle* m_nextToProcess;
AsioExternalThreadEvent* m_event;
Object m_privData;
uint32_t m_index;

static const uint8_t STATE_WAITING = 2;
};
Expand Down
4 changes: 2 additions & 2 deletions hphp/runtime/ext/asio/sleep_wait_handle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,12 @@ void c_SleepWaitHandle::exitContext(context_idx_t ctx_idx) {

void c_SleepWaitHandle::registerToContext() {
AsioContext *ctx = getContext();
m_index = ctx->registerTo<c_SleepWaitHandle>(ctx->getSleepEvents(), this);
m_ctxVecIndex = ctx->registerTo(ctx->getSleepEvents(), this);
}

void c_SleepWaitHandle::unregisterFromContext() {
AsioContext *ctx = getContext();
ctx->unregisterFrom<c_SleepWaitHandle>(ctx->getSleepEvents(), m_index);
ctx->unregisterFrom(ctx->getSleepEvents(), m_ctxVecIndex);
}

///////////////////////////////////////////////////////////////////////////////
Expand Down
6 changes: 0 additions & 6 deletions hphp/runtime/ext/asio/sleep_wait_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,13 @@ class c_SleepWaitHandle : public c_WaitableWaitHandle {
void exitContext(context_idx_t ctx_idx);
AsioSession::TimePoint getWakeTime() const { return m_waketime; };

void setIndex(uint32_t ev_idx) {
assert(getState() == STATE_WAITING);
m_index = ev_idx;
}

private:
void setState(uint8_t state) { setKindState(Kind::Sleep, state); }
void initialize(int64_t usecs);
void registerToContext();
void unregisterFromContext();

AsioSession::TimePoint m_waketime;
uint32_t m_index;

static const int8_t STATE_WAITING = 2;
};
Expand Down
13 changes: 11 additions & 2 deletions hphp/runtime/ext/asio/wait_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,9 @@ class c_WaitHandle : public ExtObjectDataFlags<ObjectData::IsWaitHandle> {
void setKindState(Kind kind, uint8_t state) {
o_subclassData.u8[0] = toKindState(kind, state);
}
void setContextVectorIndex(uint32_t idx) {
m_ctxVecIndex = idx;
}

// The code in the TC will depend on the values of these constants.
// See emitAwait().
Expand All @@ -133,8 +136,14 @@ class c_WaitHandle : public ExtObjectDataFlags<ObjectData::IsWaitHandle> {
// WaitableWaitHandle: !STATE_SUCCEEDED && !STATE_FAILED
c_BlockableWaitHandle* m_firstParent;

// BlockableWaitHandle: STATE_BLOCKED
c_BlockableWaitHandle* m_nextParent;
union {
// BlockableWaitHandle: STATE_BLOCKED
c_BlockableWaitHandle* m_nextParent;

// ExternalThreadEventWaitHandle: STATE_WAITING
// SleepWaitHandle: STATE_WAITING
uint32_t m_ctxVecIndex;
};
};
};
};
Expand Down

0 comments on commit 2a4a27d

Please sign in to comment.