Changeset 2fa80a in git for Singular/links/semaphore.c


Ignore:
Timestamp:
Nov 6, 2013, 6:07:39 PM (10 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
823679a657c538153cba3a477bf92e2c9102c451
Parents:
2ea781ea236dc6d65399e46b262e9954538749a1d600e1863951bfc5135d0138b61badb20b1ec70a
Message:
Merge pull request #414 from steenpass/resources_sw

release acquired semaphores before shutdown
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/links/semaphore.c

    r2ea781 r2fa80a  
    99# include "simpleipc.h"
    1010
     11#include <Singular/cntrlc.h>
    1112#include <Singular/si_signals.h>
    1213
     
    2324// but are supported more widely.
    2425
    25 static sem_t *semaphore[SIPC_MAX_SEMAPHORES];
     26sem_t *semaphore[SIPC_MAX_SEMAPHORES];
     27int sem_acquired[SIPC_MAX_SEMAPHORES];
    2628
    2729/* return 1 on success,
     
    7476{
    7577  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL))  return -1;
     78  defer_shutdown++;
    7679  si_sem_wait(semaphore[id]);
     80  sem_acquired[id]++;
     81  defer_shutdown--;
     82  if (!defer_shutdown && do_shutdown) m2_end(1);
    7783  return 1;
    7884}
     
    8187{
    8288  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL))  return -1;
    83   return !si_sem_trywait(semaphore[id]);
     89  defer_shutdown++;
     90  int trywait = si_sem_trywait(semaphore[id]);
     91  if (!trywait)
     92  {
     93    sem_acquired[id]++;
     94  }
     95  defer_shutdown--;
     96  if (!defer_shutdown && do_shutdown) m2_end(1);
     97  return !trywait;
    8498}
    8599
     
    87101{
    88102  if ((id<0) || (id >= SIPC_MAX_SEMAPHORES) || (semaphore[id]==NULL))  return -1;
     103  defer_shutdown++;
    89104  sem_post(semaphore[id]);
     105  sem_acquired[id]--;
     106  defer_shutdown--;
     107  if (!defer_shutdown && do_shutdown) m2_end(1);
    90108  return 1;
    91109}
Note: See TracChangeset for help on using the changeset viewer.