Project

General

Profile

Download (5.59 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / message / EffectMessageSender.java @ d23592bb

1 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 3a54358a Leszek Koltunski
// Copyright 2016 Leszek Koltunski  leszek@koltunski.pl                                          //
3 d333eb6b Leszek Koltunski
//                                                                                               //
4 46b572b5 Leszek Koltunski
// This file is part of Distorted.                                                               //
5 d333eb6b Leszek Koltunski
//                                                                                               //
6 3a54358a Leszek Koltunski
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10 d333eb6b Leszek Koltunski
//                                                                                               //
11 3a54358a Leszek Koltunski
// This library is distributed in the hope that it will be useful,                               //
12 d333eb6b Leszek Koltunski
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13 3a54358a Leszek Koltunski
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15 d333eb6b Leszek Koltunski
//                                                                                               //
16 3a54358a Leszek Koltunski
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 d333eb6b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 ed06301f Leszek Koltunski
package org.distorted.library.message;
22 e458a4ba Leszek Koltunski
23 20dbec0e Leszek Koltunski
import org.distorted.library.effect.Effect;
24
25 9ef86c9f Leszek Koltunski
import java.util.Vector;
26 6a06a912 Leszek Koltunski
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28 ed06301f Leszek Koltunski
/**
29
 * Not part of public API, do not document (public only because has to be used in Meshes)
30
 *
31
 * @y.exclude
32
 */
33
public final class EffectMessageSender extends Thread
34 6a06a912 Leszek Koltunski
  {
35 19e77994 Leszek Koltunski
  private static class Message
36 6a06a912 Leszek Koltunski
    {
37
    EffectListener mListener;
38
    long mEffectID;
39 c6e1c219 Leszek Koltunski
40 20dbec0e Leszek Koltunski
    Message(EffectListener listener, long effectID)
41 6a06a912 Leszek Koltunski
      {
42 20dbec0e Leszek Koltunski
      mListener = listener;
43
      mEffectID = effectID;
44 6a06a912 Leszek Koltunski
      }
45
    }
46 19e77994 Leszek Koltunski
47
  private static final Object mLock        = new Object();
48 9ef86c9f Leszek Koltunski
  private static Vector<Message> mList     = null;
49 19e77994 Leszek Koltunski
  private static EffectMessageSender mThis = null;
50 5fd28c26 Leszek Koltunski
  private static volatile boolean mNotify  = false;
51 6613266b Leszek Koltunski
52 2f40484b Leszek Koltunski
  // debug only, to be removed later
53
  private static int mNumStarts = 0;
54 7d151b69 Leszek Koltunski
  private static long mStartTime, mStopTime;
55
56 6a06a912 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
57
   
58
  private EffectMessageSender() 
59
    {
60 46b572b5 Leszek Koltunski
61 6a06a912 Leszek Koltunski
    }
62
63
///////////////////////////////////////////////////////////////////////////////////////////////////
64
65 ed06301f Leszek Koltunski
  public static void startSending()
66 6a06a912 Leszek Koltunski
    {
67 43eecb4c Leszek Koltunski
    synchronized(mLock)
68 6a06a912 Leszek Koltunski
      {
69 43eecb4c Leszek Koltunski
      if( mThis==null )
70 6a06a912 Leszek Koltunski
        {
71 c38f3d33 Leszek Koltunski
        mStartTime = System.currentTimeMillis();
72
        mNumStarts++;
73
74 9ef86c9f Leszek Koltunski
        mList = new Vector<>();
75 43eecb4c Leszek Koltunski
        mThis = new EffectMessageSender();
76
        mThis.start();
77 6a06a912 Leszek Koltunski
        }
78
      }
79
    }
80
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
  
83 ed06301f Leszek Koltunski
  public static void stopSending()
84 6a06a912 Leszek Koltunski
    {
85 43eecb4c Leszek Koltunski
    synchronized(mLock)
86 5fd28c26 Leszek Koltunski
      {
87 c337dd1c Leszek Koltunski
      if( mThis!=null )
88
        {
89 c38f3d33 Leszek Koltunski
        mStopTime = System.currentTimeMillis();
90
        mNumStarts--;
91
92 c337dd1c Leszek Koltunski
        mThis=null;
93
        mLock.notify();
94
        }
95 5fd28c26 Leszek Koltunski
      }
96 6a06a912 Leszek Koltunski
    }
97
  
98
///////////////////////////////////////////////////////////////////////////////////////////////////
99
  
100
  public void run()
101
    {
102
    Message tmp;  
103
     
104 c337dd1c Leszek Koltunski
    while(mThis!=null)
105 6a06a912 Leszek Koltunski
      {
106 9ef86c9f Leszek Koltunski
      while( mList.size()>0 )
107 6a06a912 Leszek Koltunski
        {
108 9ef86c9f Leszek Koltunski
        tmp = mList.remove(0);
109
        tmp.mListener.effectFinished(tmp.mEffectID);
110 6a06a912 Leszek Koltunski
        }
111 6613266b Leszek Koltunski
112 19e77994 Leszek Koltunski
      synchronized(mLock)
113 6a06a912 Leszek Koltunski
        {
114 6613266b Leszek Koltunski
        if (!mNotify)
115 6a06a912 Leszek Koltunski
          {
116 19e77994 Leszek Koltunski
          try  { mLock.wait(); }
117
          catch(InterruptedException ignored) { }
118 6a06a912 Leszek Koltunski
          }
119 6613266b Leszek Koltunski
        mNotify = false;
120 6a06a912 Leszek Koltunski
        }
121
      }
122 5fd28c26 Leszek Koltunski
123 0318e7e3 Leszek Koltunski
    mList.clear();
124 6a06a912 Leszek Koltunski
    }
125
  
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127
        
128 20dbec0e Leszek Koltunski
  public static void newMessage(Effect effect)
129 6a06a912 Leszek Koltunski
    {
130 20dbec0e Leszek Koltunski
    int numListeners = effect.getNumListeners();
131 6613266b Leszek Koltunski
132 20dbec0e Leszek Koltunski
    if( numListeners>0 )
133 0df17fad Leszek Koltunski
      {
134 20dbec0e Leszek Koltunski
      long id = effect.getID();
135
136 9ef86c9f Leszek Koltunski
      for(int i=0; i<numListeners; i++)
137 20dbec0e Leszek Koltunski
        {
138 9ef86c9f Leszek Koltunski
        EffectListener listener = effect.removeFirstListener();
139
        Message msg = new Message(listener,id);
140
        mList.add(msg);
141 20dbec0e Leszek Koltunski
        }
142
143 19e77994 Leszek Koltunski
      synchronized(mLock)
144 20dbec0e Leszek Koltunski
        {
145
        mNotify = true;
146 19e77994 Leszek Koltunski
        mLock.notify();
147 20dbec0e Leszek Koltunski
        }
148 0df17fad Leszek Koltunski
      }
149 6a06a912 Leszek Koltunski
    }
150 188b3dc0 Leszek Koltunski
151 c337dd1c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
152
153
  public static boolean isRunning()
154
    {
155
    return mThis!=null;
156
    }
157
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159
160
  public static void restartThread()
161
    {
162
    synchronized(mLock)
163
      {
164
      if( mThis==null )
165
        {
166 9ef86c9f Leszek Koltunski
        if( mList==null ) mList = new Vector<>();
167 c337dd1c Leszek Koltunski
        mThis = new EffectMessageSender();
168
        mThis.start();
169
        }
170
      }
171
    }
172
173 188b3dc0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
174
175
  public static String reportState()
176
    {
177 c337dd1c Leszek Koltunski
    return "running "+(mThis!=null)+" notify="+mNotify+" elements="+mList.size()+
178
           " start="+mStartTime+" stop="+mStopTime+" numStarts="+mNumStarts;
179 188b3dc0 Leszek Koltunski
    }
180 6a06a912 Leszek Koltunski
  }