mirror of
https://github.com/dunglas/frankenphp.git
synced 2025-09-27 03:45:59 +08:00

* Decouple workers. * Moves code to separate file. * Cleans up the exponential backoff. * Initial working implementation. * Refactors php threads to take callbacks. * Cleanup. * Cleanup. * Cleanup. * Cleanup. * Adjusts watcher logic. * Adjusts the watcher logic. * Fix opcache_reset race condition. * Fixing merge conflicts and formatting. * Prevents overlapping of TSRM reservation and script execution. * Adjustments as suggested by @dunglas. * Adds error assertions. * Adds comments. * Removes logs and explicitly compares to C.false. * Resets check. * Adds cast for safety. * Fixes waitgroup overflow. * Resolves waitgroup race condition on startup. * Moves worker request logic to worker.go. * Removes defer. * Removes call from go to c. * Fixes merge conflict. * Adds fibers test back in. * Refactors new thread loop approach. * Removes redundant check. * Adds compareAndSwap. * Refactor: removes global waitgroups and uses a 'thread state' abstraction instead. * Removes unnecessary method. * Updates comment. * Removes unnecessary booleans. * test * First state machine steps. * Splits threads. * Minimal working implementation with broken tests. * Fixes tests. * Refactoring. * Fixes merge conflicts. * Formatting * C formatting. * More cleanup. * Allows for clean state transitions. * Adds state tests. * Adds support for thread transitioning. * Fixes the testdata path. * Formatting. * Allows transitioning back to inactive state. * Fixes go linting. * Formatting. * Removes duplication. * Applies suggestions by @dunglas * Removes redundant check. * Locks the handler on restart. * Removes unnecessary log. * Changes Unpin() logic as suggested by @withinboredom * Adds suggestions by @dunglas and resolves TODO. * Makes restarts fully safe. * Will make the initial startup fail even if the watcher is enabled (as is currently the case) * Also adds compareAndSwap to the test. * Adds comment. * Prevents panic on initial watcher startup.
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package frankenphp
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test2GoroutinesYieldToEachOtherViaStates(t *testing.T) {
|
|
threadState := &threadState{currentState: stateBooting}
|
|
|
|
go func() {
|
|
threadState.waitFor(stateInactive)
|
|
assert.True(t, threadState.is(stateInactive))
|
|
threadState.set(stateReady)
|
|
}()
|
|
|
|
threadState.set(stateInactive)
|
|
threadState.waitFor(stateReady)
|
|
assert.True(t, threadState.is(stateReady))
|
|
}
|
|
|
|
func TestStateShouldHaveCorrectAmountOfSubscribers(t *testing.T) {
|
|
threadState := &threadState{currentState: stateBooting}
|
|
|
|
// 3 subscribers waiting for different states
|
|
go threadState.waitFor(stateInactive)
|
|
go threadState.waitFor(stateInactive, stateShuttingDown)
|
|
go threadState.waitFor(stateShuttingDown)
|
|
|
|
assertNumberOfSubscribers(t, threadState, 3)
|
|
|
|
threadState.set(stateInactive)
|
|
assertNumberOfSubscribers(t, threadState, 1)
|
|
|
|
assert.True(t, threadState.compareAndSwap(stateInactive, stateShuttingDown))
|
|
assertNumberOfSubscribers(t, threadState, 0)
|
|
}
|
|
|
|
func assertNumberOfSubscribers(t *testing.T, threadState *threadState, expected int) {
|
|
maxWaits := 10_000 // wait for 1 second max
|
|
|
|
for i := 0; i < maxWaits; i++ {
|
|
time.Sleep(100 * time.Microsecond)
|
|
threadState.mu.RLock()
|
|
if len(threadState.subscribers) == expected {
|
|
threadState.mu.RUnlock()
|
|
break
|
|
}
|
|
threadState.mu.RUnlock()
|
|
}
|
|
threadState.mu.RLock()
|
|
assert.Len(t, threadState.subscribers, expected)
|
|
threadState.mu.RUnlock()
|
|
}
|