/*
ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio.
This file is part of ChibiOS/RT.
ChibiOS/RT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
ChibiOS/RT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**
* @page article_atomic Invoking multiple primitives as a single atomic operation
* It is often necessary to invoke multiple operations involving a
* reschedulation as a single atomic operation.
* ChibiOS/RT already implements APIs that perform complex operations, as
* example the API @p chSemSignalWait() performs two operations atomically.
* If more complex operations are required in your application then it is
* possible to build macro-operations, see the following example:
* @code
chSysLock();
chSemSignalI(&sem1);
chSemSignalI(&sem2);
chMtxUnlockS();
chSchRescheduleS();
chSysUnlock();
* @endcode
* The above example performs a signal operation on two semaphores, unlocks the
* last aquired mutex and finally performs a reschedulation. All the operations
* are performed atomically.
* An hypotetical @p chSemSignalSignalWait() operation could be implemented as
* follow:
* @code
chSysLock();
chSemSignalI(&sem1);
chSemSignalI(&sem2);
chSemWaitS(&Sem3); /* May reschedule or not. */
chSchRescheduleS(); /* This one reschedules if necessary. */
chSysUnlock();
* @endcode
* In general multiple @ref I-Class and (non rescheduling) @ref S-Class APIs
* can be included and the block is terminated by a rescheduling @ref S-Class
* API. An extra @p chSchRescheduleS() can be present at the very end of the
* block, it only reschedules if a reschedulation is still required.
*/