### 2.5.0 - Add `Amp\Iterator\discard()` (#315) - Fix potential warning on shutdown in UvDriver - Fix repeat watchers in `NativeDriver` that are disabled and re-enabled during callback invocation (#325) - Fix timer intervals being counted from timer creation instead of last tick time (#319) - `Loop::now()` / `Driver::now()` is no longer cached in each tick ### 2.4.4 - Fixed `Delayed::reference()` / `Delayed::unreference()` after the promise resolved - Changed return type of `Delayed::reference()` / `Delayed::unreference()` to `self` to allow fluid API usage - Add generics for `Amp\Promise\wait` - Improved types for `Amp\call` / `Amp\coroutine` ### 2.4.3 - Improved types for `Amp\call` - Improved types for `Deferred::resolve()` (#307) ### 2.4.2 - Provide useful exception trace in `TimeoutCancellationToken` (#303) - Add parameter for custom timeout message (#299) - Add psalm annotations for improved static analysis ### 2.4.1 - Fixed undefined index warning when `stream_select()` fails but `error_get_last()` returns `null`. 2.4.0 ----- - Added `getCurrentTime()` as public API, providing millisecond timestamps for runtime measurements with special support for 32 bit systems. Returned timestamps are relative to an arbitrary point in time, so this API is only suitable to compare two timestamps generated in the same process. ### 2.3.2 - Fixed cancellation trace recording in `TracingDriver` ### 2.3.1 - Fixed `TracingDriver` not overriding all methods. 2.3.0 ----- - Added `TracingDriver` to debug (hanging) tests / applications. The environment variable `AMP_DEBUG_TRACE_WATCHERS=true` can be set to automatically create a `TracingDriver` wrapping the actual driver. `TracingDriver::dump()` can be used to dump all enabled, referenced watchers keeping the loop running. ### 2.2.1 - Fixed backpressure release on `Emitter::emit()`, the backpressure is now released as soon as the value is consumed, instead of the next value being requested. 2.2.0 ----- - Added `CombinedCancellationToken` - Added `delay()` as shortcut for `new Delayed` ### 2.1.2 - Fixed issue where the loop time in `NativeDriver` was not refreshed after waiting for I/O streams (#256) - Fixed compatibility issue of `NativeDriver` with `pcntl_async_signals()` (#264) - A custom queue is now used for timers in `NativeDriver` to allow cancelled timers to be garbage collected immediately instead of after their original expiration time (#220) - Resolving a promise with an object that throws when destructed will now forward that exception to the event loop error handler (#271) - Fixed loop time to support 32-bit systems (#252, #273) ### 2.1.1 - Fixed a bug in NativeDriver causing 100% CPU usage when any timers were used (#251) 2.1.0 ----- - Make use of `hrtime()` as monotonic time source if available (PHP 7.3) - Added `Amp\Iterator\toArray()` - Added `Amp\Promise\timeoutWithDefault()` (#245) - Added `Amp\Promise\wrap()` (#234) - Added `Amp\Loop::now()` - Fixed stale `NativeDriver::$now` values (#243) ### 2.0.7 - Fixed recording of stack traces for double resolution in case `AMP_DEBUG` was not set as environment variable, defaulting to `0` now. (#217) - `Loop::unreference()` is ignored on invalid watchers now. - Invoke UV watchers in case no events or `UV_DISCONNECT` is indicated. - Ignore `Loop::$driver` not being set during shutdown, which might happen due to the unreliable shutdown order. (#212) ### 2.0.6 - Resolution methods are now hidden in the `Promise` returned from `Deferred::promise()`. Their exposure was an implementation detail and never promised by the return type of `Deferred::promise()`. - A named class is now used for promises, so you don't end up with an anonymous class in `var_dump()` and stack traces, which can be confusing. ### 2.0.5 - Fixed possible notices in `formatStacktrace()`. This is an internal API, but the notices might appear on certain stack traces when running with `AMP_DEBUG=true`. - Fixed segfault with `ev`, see amphp/parallel-functions#3. - Dropped multiple definitions of `Deferred` and `Emitter`. These were introduced as performance hack, but relied on `zend.assertions` being disabled to change behavior, which is bad. The performance impact is believed to be rather low, because coroutines are used a lot more than `Deferred` in Amp v2. ### 2.0.4 - Allow `AMP_DEBUG` to be defined via the environment. - Fix formatting of stack traces used for double resolution debugging. ### 2.0.3 - `Loop::set()` replaces the current driver with a dummy driver for the time of `gc_collect_cycles()` now. This allows cyclic references to be cleaned up properly before the new driver is set. Without such a fix, cyclic references might have been cleaned up later, e.g. cancelling their watcher IDs on the new loop, thereby cancelling the wrong watchers. - Promise combinator functions (`all(), `any()`, `first()`, `some()`) now preserve order of the given `$promises` array argument. ### 2.0.2 - Fixed warnings and timers in `EventDriver`. - Does no longer hide warnings from `stream_select`. ### 2.0.1 - Fixed an issue where the loop blocks even though all watchers are unreferenced. 2.0.0 ----- * `Amp\reactor()` has been replaced with `Amp\Loop::set()` and `Amp\Loop::get()`. * `Amp\driver()` has been replaced with `Amp\Loop\Factory::create()`. * `Amp\tick()` no longer exists and doesn't have a replacement. Ticks are an internal detail. * Functions for creating and managing watchers are now static methods of `Amp\Loop` instead of functions in the `Amp` namespace. * `once()` is now `delay()` and `immediately()` is `defer()`. * Parameter order for `delay()` and `repeat()` has been changed. * `reference()` and `unreference()` have been added. * `Amp\Pause` has been renamed to `Amp\Delayed` and accepts an optional resolution value now. Additionally `reference()` and `unreference()` methods have been added. * Promise accepting functions have been moved to the `Amp\Promise` namespace. * `Amp\Promise\some()` accepts an additional `$required` parameter. * `Amp\call()`, `Amp\asyncCall()`, `Amp\coroutine()` and `Amp\asyncCoroutine()` have been added. * `Amp\resolve()` has been removed, use `Amp\call()` instead. * `Promise::when()` has been renamed to `Promise::onResolve()` * `Promise::watch()` has been removed, use `Amp\Iterator`, [`amphp/byte-stream`](https://github.com/amphp/byte-stream) or a custom implementation that implements `Amp\Promise` instead and provides dedicated APIs to access the previously data shared via the `watch()` mechanism. * `Amp\Iterator`, `Amp\Emitter` and `Amp\Producer` have been added with several functions in the `Amp\Iterator` namespace. * Various other changes. ### 1.2.2 - Fix notice in `NativeReactor` when removing a handle while an event is waiting for it. (Regression fix from 1.1.1) ### 1.2.1 - Fix `uv_run()` potentially exiting earlier than intended, leading to an infinite loop in `UvReactor::run()`. 1.2.0 ----- - `resolve()` now also accepts callables returning generators. ### 1.1.1 - Fix memory leak in `NativeReactor`, retaining an empty array for each stream. - Remove circular references in `UvReactor` to avoid garbage collector calls. 1.1.0 ----- - Add `getExceptions()` method to `CombinatorException` to get an array of all the exceptions (affecting `some()` and `first()`). - Fix `NativeReactor` not ending up in stopped state if primary callback didn't install any events. ### 1.0.8 - Fix `NativeReactor` running a busy loop if no timers are active. Properly block now in NativeReactor inside `stream_select()`. ### 1.0.7 - Several combinator functions could result in a promise already resolved exception in case some values of the array weren't promises. ### 1.0.6 - Fix issue in `NativeReactor` causing `stop()` to be delayed by one second. ### 1.0.5 - Convert general `RuntimeException` to more specific `Amp\CombinatorException`. ### 1.0.4 - Repeat watchers in `LibeventReactor` internally were handled in microsecond intervals instead of milliseconds. ### 1.0.3 - Fix issue in `NativeReactor` capable of causing keep alive counter corruption when a watcher was cancelled inside its own callback. - Fix issue in `UvReactor` with `libuv` >= 1.1.0 causing busy loop with immediates present, but no watchers being triggered. ### 1.0.2 - Fix PHP 7 issue in which top-level `Throwable`s weren't caught in certain coroutine contexts. - Remove error suppression operator on optionally `null` option assignment to avoid spurious `E_NOTICE` output when custom error handlers are used. ### 1.0.1 - Fix bug preventing `UvReactor::tick()` from returning when no events are ready for a single active IO watcher. 1.0.0 ----- - Initial stable API release