Hi there,

The Semaphore feature was a great addition to Ignite's synchronization 
primitive toolkit. I'd like to propose an enhancement to make Semaphore API 
even more useful.

My biggest complaint about the current API is its blocking nature. For example, 
the only way to acquire a permit is by using the blocking acquire() method 
(tryAcquire() is not very useful in the cases when you MUST acquire before you 
can proceed). I believe that in the 21st century blocking APIs is anachronism. 
:))) It's a bit embarrassing even. I'm sure Ignite can do better than that! :)

Usually a permit acquisition is followed by an action, followed by a release of 
the permit. I propose a simple enhancement to the Semaphore API that will 
reduce the boilerplate and make it possible to do all of that asynchronously! 
The new method might look like this:

<T> IgniteFuture<T> acquireAndExecute(Callable<T> action);
<T> IgniteFuture<T> acquireAndExecute(Callable<T> action, Executor executor);

(The name could be improved, of course...) The first method would immediately 
return a future to be later completed by the action's result. The action will 
be executed on a thread from the Ignite's public thread pool once a permit has 
been acquired. Optionally, the user could specify a different executor using 
the second signature.

Would the community be interested in such enhancement?

Thanks
Andrey

PS. A subject for a separate discussion, but I believe that in the next major 
release Ignite should just drop the clumsy withAsync() API and make all 
blocking calls explicitly async by returning a future. In my opinion it would 
greatly simplify the API and make it more modern. Besides, I'm pretty sure that 
internally Ignite already creates futures for pretty much most of the API 
calls, so it should not cause any performance issue.
                                          

Reply via email to