/*!
 * Modify existing alarm (change its values)
 * \param alarm Alarm parameters
 * \return status (0 for success)
 */
int k_alarm_set ( void *id, alarm_t *alarm )
{
	kalarm_t *kalarm = id;

	ASSERT ( kalarm && kalarm->magic == ALARM_MAGIC );

	kalarm->alarm.action = alarm->action;
	kalarm->alarm.param = alarm->param;
	kalarm->alarm.flags = alarm->flags;
	kalarm->alarm.period = alarm->period;

	/* is activation time changed? */
	if ( time_cmp ( &kalarm->alarm.exp_time, &alarm->exp_time ) )
	{
		/* remove from active alarms */
		if ( kalarm->active )
			list_remove ( &kalarms, FIRST, &kalarm->list );

		kalarm->alarm.exp_time = alarm->exp_time;

		k_alarm_add ( kalarm );
	}

	return SUCCESS;
}
/*!
 * Create new alarm
 * \param alarm Alarm parameters
 * \return status (0 for success), but also in 'param->alarm.id' is pointer to
 *		newly created alarm (handler)
 */
int k_alarm_new ( void **id, alarm_t *alarm )
{
	kalarm_t *kalarm;

	kalarm = kmalloc ( sizeof (kalarm_t) );
	ASSERT ( kalarm );

	kalarm->alarm = *alarm; /* copy alarm data */
	/* param checking is skipped - assuming all is OK */

#ifdef DEBUG
	kalarm->magic = ALARM_MAGIC;
#endif
	*id = kalarm; /* return value = handler */

	k_alarm_add ( kalarm );

	return SUCCESS;
}
/*!
 * Create new alarm
 * \param alarm Alarm parameters
 * \returns status (0 for success), but also in 'param->alarm.id' is pointer to
 *		newly created alarm (handler)
 */
int k_alarm_new ( void **id, alarm_t *alarm )
{
	kalarm_t *kalarm;

	kalarm = kmalloc ( sizeof (kalarm_t) );
	ASSERT ( kalarm );

	kalarm->alarm = *alarm; /* copy alarm data */
	/* param checking is skipped - assuming all is OK */

	k_threadq_init ( &kalarm->queue );

#ifdef DEBUG
	kalarm->magic = ALARM_MAGIC;
#endif
	*id = kalarm; /* return value = handler */

	kalarm->thread = k_get_active_thread ();

	k_alarm_add ( kalarm );

	RETURN ( SUCCESS );
}